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