• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html#License
4 /*
5  *******************************************************************************
6  * Copyright (C) 2007-2013, International Business Machines Corporation and    *
7  * others. All Rights Reserved.                                                *
8  *******************************************************************************
9  */
10 package ohos.global.icu.impl.duration;
11 
12 import java.text.FieldPosition;
13 import java.util.Date;
14 
15 import ohos.global.icu.text.DurationFormat;
16 import ohos.global.icu.util.ULocale;
17 
18 /**
19  * @author srl
20  * @hide exposed on OHOS
21  */
22 public class BasicDurationFormat extends DurationFormat {
23 
24     /**
25      *
26      */
27     private static final long serialVersionUID = -3146984141909457700L;
28 
29     transient DurationFormatter formatter;
30     transient PeriodFormatter pformatter;
31     transient PeriodFormatterService pfs = null;
32 
getInstance(ULocale locale)33     public static BasicDurationFormat getInstance(ULocale locale) {
34         return new BasicDurationFormat(locale);
35     }
36 
format(Object object, StringBuffer toAppend, FieldPosition pos)37     public StringBuffer format(Object object, StringBuffer toAppend, FieldPosition pos) {
38         if(object instanceof Long) {
39             String res = formatDurationFromNow(((Long)object).longValue());
40             return toAppend.append(res);
41         } else if(object instanceof Date) {
42             String res = formatDurationFromNowTo(((Date)object));
43             return toAppend.append(res);
44         } else if (object instanceof javax.xml.datatype.Duration) {
45             String res = formatDuration(object);
46             return toAppend.append(res);
47         }
48         throw new IllegalArgumentException("Cannot format given Object as a Duration");
49 
50     }
51 
BasicDurationFormat()52     public BasicDurationFormat() {
53         pfs = BasicPeriodFormatterService.getInstance();
54         formatter = pfs.newDurationFormatterFactory().getFormatter();
55         pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).getFormatter();
56     }
57     /**
58      *
59      */
BasicDurationFormat(ULocale locale)60     public BasicDurationFormat(ULocale locale) {
61         super(locale);
62         pfs = BasicPeriodFormatterService.getInstance();
63         formatter = pfs.newDurationFormatterFactory().setLocale(locale.getName()).getFormatter();
64         pformatter = pfs.newPeriodFormatterFactory().setDisplayPastFuture(false).setLocale(locale.getName()).getFormatter();
65     }
66 
67     /* (non-Javadoc)
68      * @see ohos.global.icu.text.DurationFormat#formatDurationFrom(long, long)
69      */
formatDurationFrom(long duration, long referenceDate)70     public String formatDurationFrom(long duration, long referenceDate) {
71         return formatter.formatDurationFrom(duration, referenceDate);
72     }
73 
74     /* (non-Javadoc)
75      * @see ohos.global.icu.text.DurationFormat#formatDurationFromNow(long)
76      */
formatDurationFromNow(long duration)77     public String formatDurationFromNow(long duration) {
78         return formatter.formatDurationFromNow(duration);
79     }
80 
81     /* (non-Javadoc)
82      * @see ohos.global.icu.text.DurationFormat#formatDurationFromNowTo(java.util.Date)
83      */
formatDurationFromNowTo(Date targetDate)84     public String formatDurationFromNowTo(Date targetDate) {
85         return formatter.formatDurationFromNowTo(targetDate);
86     }
87 
88     /**
89      *  JDK 1.5+ only
90      * @param obj Object being passed.
91      * @return The PeriodFormatter object formatted to the object passed.
92      * @see "http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/datatype/Duration.html"
93      */
formatDuration(Object obj)94     public String formatDuration(Object obj) {
95         javax.xml.datatype.DatatypeConstants.Field inFields[] = {
96                 javax.xml.datatype.DatatypeConstants.YEARS,
97                 javax.xml.datatype.DatatypeConstants.MONTHS,
98                 javax.xml.datatype.DatatypeConstants.DAYS,
99                 javax.xml.datatype.DatatypeConstants.HOURS,
100                 javax.xml.datatype.DatatypeConstants.MINUTES,
101                 javax.xml.datatype.DatatypeConstants.SECONDS,
102             };
103              TimeUnit outFields[] = {
104                 TimeUnit.YEAR,
105                 TimeUnit.MONTH,
106                 TimeUnit.DAY,
107                 TimeUnit.HOUR,
108                 TimeUnit.MINUTE,
109                 TimeUnit.SECOND,
110             };
111 
112         javax.xml.datatype.Duration inDuration = (javax.xml.datatype.Duration)obj;
113         Period p = null;
114         javax.xml.datatype.Duration duration = inDuration;
115         boolean inPast = false;
116         if(inDuration.getSign()<0) {
117             duration = inDuration.negate();
118             inPast = true;
119         }
120         // convert a Duration to a Period
121         boolean sawNonZero = false; // did we have a set, non-zero field?
122         for(int i=0;i<inFields.length;i++) {
123             if(duration.isSet(inFields[i])) {
124                 Number n = duration.getField(inFields[i]);
125                 if(n.intValue() == 0 && !sawNonZero) {
126                     continue; // ignore zero fields larger than the largest nonzero field
127                 } else {
128                     sawNonZero = true;
129                 }
130                 float floatVal = n.floatValue();
131                 // is there a 'secondary' unit to set?
132                 TimeUnit alternateUnit = null;
133                 float alternateVal = 0;
134 
135                 // see if there is a fractional part
136                 if(outFields[i]==TimeUnit.SECOND) {
137                     double fullSeconds = floatVal;
138                     double intSeconds = Math.floor(floatVal);
139                     double millis = (fullSeconds-intSeconds)*1000.0;
140                     if(millis > 0.0) {
141                         alternateUnit = TimeUnit.MILLISECOND;
142                         alternateVal=(float)millis;
143                         floatVal=(float)intSeconds;
144                     }
145                 }
146 
147                 if(p == null) {
148                     p = Period.at(floatVal, outFields[i]);
149                 } else {
150                     p = p.and(floatVal, outFields[i]);
151                 }
152 
153                 if(alternateUnit != null) {
154                     p = p.and(alternateVal, alternateUnit); // add in MILLISECONDs
155                 }
156             }
157         }
158 
159         if(p == null) {
160             // no fields set  = 0 seconds
161             return formatDurationFromNow(0);
162         } else {
163             if(inPast) {// was negated, above.
164                 p = p.inPast();
165             } else {
166                 p = p.inFuture();
167             }
168         }
169 
170         // now, format it.
171         return pformatter.format(p);
172     }
173 }
174