1 | /* |
2 | * Copyright 2001-2005 Stephen Colebourne |
3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. |
6 | * You may obtain a copy of the License at |
7 | * |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * |
10 | * Unless required by applicable law or agreed to in writing, software |
11 | * distributed under the License is distributed on an "AS IS" BASIS, |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. |
15 | */ |
16 | package org.joda.time; |
17 | |
18 | import java.io.Serializable; |
19 | |
20 | /** |
21 | * Identifies a field, such as year or minuteOfHour, in a chronology-neutral way. |
22 | * <p> |
23 | * A field type defines the type of the field, such as hourOfDay. |
24 | * If does not directly enable any calculations, however it does provide a |
25 | * {@link #getField(Chronology)} method that returns the actual calculation engine |
26 | * for a particular chronology. |
27 | * It also provides access to the related {@link DurationFieldType}s. |
28 | * <p> |
29 | * Instances of <code>DateTimeFieldType</code> are singletons. |
30 | * They can be compared using <code>==</code>. |
31 | * <p> |
32 | * If required, you can create your own field, for example a quarterOfYear. |
33 | * You must create a subclass of <code>DateTimeFieldType</code> that defines the field type. |
34 | * This class returns the actual calculation engine from {@link #getField(Chronology)}. |
35 | * |
36 | * @author Stephen Colebourne |
37 | * @author Brian S O'Neill |
38 | * @since 1.0 |
39 | */ |
40 | public abstract class DateTimeFieldType implements Serializable { |
41 | |
42 | /** Serialization version */ |
43 | private static final long serialVersionUID = -42615285973990L; |
44 | |
45 | /** Ordinal values for standard field types. */ |
46 | static final byte |
47 | ERA = 1, |
48 | YEAR_OF_ERA = 2, |
49 | CENTURY_OF_ERA = 3, |
50 | YEAR_OF_CENTURY = 4, |
51 | YEAR = 5, |
52 | DAY_OF_YEAR = 6, |
53 | MONTH_OF_YEAR = 7, |
54 | DAY_OF_MONTH = 8, |
55 | WEEKYEAR_OF_CENTURY = 9, |
56 | WEEKYEAR = 10, |
57 | WEEK_OF_WEEKYEAR = 11, |
58 | DAY_OF_WEEK = 12, |
59 | HALFDAY_OF_DAY = 13, |
60 | HOUR_OF_HALFDAY = 14, |
61 | CLOCKHOUR_OF_HALFDAY = 15, |
62 | CLOCKHOUR_OF_DAY = 16, |
63 | HOUR_OF_DAY = 17, |
64 | MINUTE_OF_DAY = 18, |
65 | MINUTE_OF_HOUR = 19, |
66 | SECOND_OF_DAY = 20, |
67 | SECOND_OF_MINUTE = 21, |
68 | MILLIS_OF_DAY = 22, |
69 | MILLIS_OF_SECOND = 23; |
70 | |
71 | /** The era field type. */ |
72 | private static final DateTimeFieldType ERA_TYPE = new StandardDateTimeFieldType( |
73 | "era", ERA, DurationFieldType.eras(), null); |
74 | /** The yearOfEra field type. */ |
75 | private static final DateTimeFieldType YEAR_OF_ERA_TYPE = new StandardDateTimeFieldType( |
76 | "yearOfEra", YEAR_OF_ERA, DurationFieldType.years(), DurationFieldType.eras()); |
77 | /** The centuryOfEra field type. */ |
78 | private static final DateTimeFieldType CENTURY_OF_ERA_TYPE = new StandardDateTimeFieldType( |
79 | "centuryOfEra", CENTURY_OF_ERA, DurationFieldType.centuries(), DurationFieldType.eras()); |
80 | /** The yearOfCentury field type. */ |
81 | private static final DateTimeFieldType YEAR_OF_CENTURY_TYPE = new StandardDateTimeFieldType( |
82 | "yearOfCentury", YEAR_OF_CENTURY, DurationFieldType.years(), DurationFieldType.centuries()); |
83 | /** The year field type. */ |
84 | private static final DateTimeFieldType YEAR_TYPE = new StandardDateTimeFieldType( |
85 | "year", YEAR, DurationFieldType.years(), null); |
86 | /** The dayOfYear field type. */ |
87 | private static final DateTimeFieldType DAY_OF_YEAR_TYPE = new StandardDateTimeFieldType( |
88 | "dayOfYear", DAY_OF_YEAR, DurationFieldType.days(), DurationFieldType.years()); |
89 | /** The monthOfYear field type. */ |
90 | private static final DateTimeFieldType MONTH_OF_YEAR_TYPE = new StandardDateTimeFieldType( |
91 | "monthOfYear", MONTH_OF_YEAR, DurationFieldType.months(), DurationFieldType.years()); |
92 | /** The dayOfMonth field type. */ |
93 | private static final DateTimeFieldType DAY_OF_MONTH_TYPE = new StandardDateTimeFieldType( |
94 | "dayOfMonth", DAY_OF_MONTH, DurationFieldType.days(), DurationFieldType.months()); |
95 | /** The weekyearOfCentury field type. */ |
96 | private static final DateTimeFieldType WEEKYEAR_OF_CENTURY_TYPE = new StandardDateTimeFieldType( |
97 | "weekyearOfCentury", WEEKYEAR_OF_CENTURY, DurationFieldType.weekyears(), DurationFieldType.centuries()); |
98 | /** The weekyear field type. */ |
99 | private static final DateTimeFieldType WEEKYEAR_TYPE = new StandardDateTimeFieldType( |
100 | "weekyear", WEEKYEAR, DurationFieldType.weekyears(), null); |
101 | /** The weekOfWeekyear field type. */ |
102 | private static final DateTimeFieldType WEEK_OF_WEEKYEAR_TYPE = new StandardDateTimeFieldType( |
103 | "weekOfWeekyear", WEEK_OF_WEEKYEAR, DurationFieldType.weeks(), DurationFieldType.weekyears()); |
104 | /** The dayOfWeek field type. */ |
105 | private static final DateTimeFieldType DAY_OF_WEEK_TYPE = new StandardDateTimeFieldType( |
106 | "dayOfWeek", DAY_OF_WEEK, DurationFieldType.days(), DurationFieldType.weeks()); |
107 | |
108 | /** The halfday field type. */ |
109 | private static final DateTimeFieldType HALFDAY_OF_DAY_TYPE = new StandardDateTimeFieldType( |
110 | "halfdayOfDay", HALFDAY_OF_DAY, DurationFieldType.halfdays(), DurationFieldType.days()); |
111 | /** The hourOfHalfday field type. */ |
112 | private static final DateTimeFieldType HOUR_OF_HALFDAY_TYPE = new StandardDateTimeFieldType( |
113 | "hourOfHalfday", HOUR_OF_HALFDAY, DurationFieldType.hours(), DurationFieldType.halfdays()); |
114 | /** The clockhourOfHalfday field type. */ |
115 | private static final DateTimeFieldType CLOCKHOUR_OF_HALFDAY_TYPE = new StandardDateTimeFieldType( |
116 | "clockhourOfHalfday", CLOCKHOUR_OF_HALFDAY, DurationFieldType.hours(), DurationFieldType.halfdays()); |
117 | /** The clockhourOfDay field type. */ |
118 | private static final DateTimeFieldType CLOCKHOUR_OF_DAY_TYPE = new StandardDateTimeFieldType( |
119 | "clockhourOfDay", CLOCKHOUR_OF_DAY, DurationFieldType.hours(), DurationFieldType.days()); |
120 | /** The hourOfDay field type. */ |
121 | private static final DateTimeFieldType HOUR_OF_DAY_TYPE = new StandardDateTimeFieldType( |
122 | "hourOfDay", HOUR_OF_DAY, DurationFieldType.hours(), DurationFieldType.days()); |
123 | /** The minuteOfDay field type. */ |
124 | private static final DateTimeFieldType MINUTE_OF_DAY_TYPE = new StandardDateTimeFieldType( |
125 | "minuteOfDay", MINUTE_OF_DAY, DurationFieldType.minutes(), DurationFieldType.days()); |
126 | /** The minuteOfHour field type. */ |
127 | private static final DateTimeFieldType MINUTE_OF_HOUR_TYPE = new StandardDateTimeFieldType( |
128 | "minuteOfHour", MINUTE_OF_HOUR, DurationFieldType.minutes(), DurationFieldType.hours()); |
129 | /** The secondOfDay field type. */ |
130 | private static final DateTimeFieldType SECOND_OF_DAY_TYPE = new StandardDateTimeFieldType( |
131 | "secondOfDay", SECOND_OF_DAY, DurationFieldType.seconds(), DurationFieldType.days()); |
132 | /** The secondOfMinute field type. */ |
133 | private static final DateTimeFieldType SECOND_OF_MINUTE_TYPE = new StandardDateTimeFieldType( |
134 | "secondOfMinute", SECOND_OF_MINUTE, DurationFieldType.seconds(), DurationFieldType.minutes()); |
135 | /** The millisOfDay field type. */ |
136 | private static final DateTimeFieldType MILLIS_OF_DAY_TYPE = new StandardDateTimeFieldType( |
137 | "millisOfDay", MILLIS_OF_DAY, DurationFieldType.millis(), DurationFieldType.days()); |
138 | /** The millisOfSecond field type. */ |
139 | private static final DateTimeFieldType MILLIS_OF_SECOND_TYPE = new StandardDateTimeFieldType( |
140 | "millisOfSecond", MILLIS_OF_SECOND, DurationFieldType.millis(), DurationFieldType.seconds()); |
141 | |
142 | /** The name of the field. */ |
143 | private final String iName; |
144 | |
145 | //----------------------------------------------------------------------- |
146 | /** |
147 | * Constructor. |
148 | * |
149 | * @param name the name to use |
150 | */ |
151 | protected DateTimeFieldType(String name) { |
152 | super(); |
153 | iName = name; |
154 | } |
155 | |
156 | //----------------------------------------------------------------------- |
157 | /** |
158 | * Get the millis of second field type. |
159 | * |
160 | * @return the DateTimeFieldType constant |
161 | */ |
162 | public static DateTimeFieldType millisOfSecond() { |
163 | return MILLIS_OF_SECOND_TYPE; |
164 | } |
165 | |
166 | /** |
167 | * Get the millis of day field type. |
168 | * |
169 | * @return the DateTimeFieldType constant |
170 | */ |
171 | public static DateTimeFieldType millisOfDay() { |
172 | return MILLIS_OF_DAY_TYPE; |
173 | } |
174 | |
175 | /** |
176 | * Get the second of minute field type. |
177 | * |
178 | * @return the DateTimeFieldType constant |
179 | */ |
180 | public static DateTimeFieldType secondOfMinute() { |
181 | return SECOND_OF_MINUTE_TYPE; |
182 | } |
183 | |
184 | /** |
185 | * Get the second of day field type. |
186 | * |
187 | * @return the DateTimeFieldType constant |
188 | */ |
189 | public static DateTimeFieldType secondOfDay() { |
190 | return SECOND_OF_DAY_TYPE; |
191 | } |
192 | |
193 | /** |
194 | * Get the minute of hour field type. |
195 | * |
196 | * @return the DateTimeFieldType constant |
197 | */ |
198 | public static DateTimeFieldType minuteOfHour() { |
199 | return MINUTE_OF_HOUR_TYPE; |
200 | } |
201 | |
202 | /** |
203 | * Get the minute of day field type. |
204 | * |
205 | * @return the DateTimeFieldType constant |
206 | */ |
207 | public static DateTimeFieldType minuteOfDay() { |
208 | return MINUTE_OF_DAY_TYPE; |
209 | } |
210 | |
211 | /** |
212 | * Get the hour of day (0-23) field type. |
213 | * |
214 | * @return the DateTimeFieldType constant |
215 | */ |
216 | public static DateTimeFieldType hourOfDay() { |
217 | return HOUR_OF_DAY_TYPE; |
218 | } |
219 | |
220 | /** |
221 | * Get the hour of day (offset to 1-24) field type. |
222 | * |
223 | * @return the DateTimeFieldType constant |
224 | */ |
225 | public static DateTimeFieldType clockhourOfDay() { |
226 | return CLOCKHOUR_OF_DAY_TYPE; |
227 | } |
228 | |
229 | /** |
230 | * Get the hour of am/pm (0-11) field type. |
231 | * |
232 | * @return the DateTimeFieldType constant |
233 | */ |
234 | public static DateTimeFieldType hourOfHalfday() { |
235 | return HOUR_OF_HALFDAY_TYPE; |
236 | } |
237 | |
238 | /** |
239 | * Get the hour of am/pm (offset to 1-12) field type. |
240 | * |
241 | * @return the DateTimeFieldType constant |
242 | */ |
243 | public static DateTimeFieldType clockhourOfHalfday() { |
244 | return CLOCKHOUR_OF_HALFDAY_TYPE; |
245 | } |
246 | |
247 | /** |
248 | * Get the AM(0) PM(1) field type. |
249 | * |
250 | * @return the DateTimeFieldType constant |
251 | */ |
252 | public static DateTimeFieldType halfdayOfDay() { |
253 | return HALFDAY_OF_DAY_TYPE; |
254 | } |
255 | |
256 | //----------------------------------------------------------------------- |
257 | /** |
258 | * Get the day of week field type. |
259 | * |
260 | * @return the DateTimeFieldType constant |
261 | */ |
262 | public static DateTimeFieldType dayOfWeek() { |
263 | return DAY_OF_WEEK_TYPE; |
264 | } |
265 | |
266 | /** |
267 | * Get the day of month field type. |
268 | * |
269 | * @return the DateTimeFieldType constant |
270 | */ |
271 | public static DateTimeFieldType dayOfMonth() { |
272 | return DAY_OF_MONTH_TYPE; |
273 | } |
274 | |
275 | /** |
276 | * Get the day of year field type. |
277 | * |
278 | * @return the DateTimeFieldType constant |
279 | */ |
280 | public static DateTimeFieldType dayOfYear() { |
281 | return DAY_OF_YEAR_TYPE; |
282 | } |
283 | |
284 | /** |
285 | * Get the week of a week based year field type. |
286 | * |
287 | * @return the DateTimeFieldType constant |
288 | */ |
289 | public static DateTimeFieldType weekOfWeekyear() { |
290 | return WEEK_OF_WEEKYEAR_TYPE; |
291 | } |
292 | |
293 | /** |
294 | * Get the year of a week based year field type. |
295 | * |
296 | * @return the DateTimeFieldType constant |
297 | */ |
298 | public static DateTimeFieldType weekyear() { |
299 | return WEEKYEAR_TYPE; |
300 | } |
301 | |
302 | /** |
303 | * Get the year of a week based year within a century field type. |
304 | * |
305 | * @return the DateTimeFieldType constant |
306 | */ |
307 | public static DateTimeFieldType weekyearOfCentury() { |
308 | return WEEKYEAR_OF_CENTURY_TYPE; |
309 | } |
310 | |
311 | /** |
312 | * Get the month of year field type. |
313 | * |
314 | * @return the DateTimeFieldType constant |
315 | */ |
316 | public static DateTimeFieldType monthOfYear() { |
317 | return MONTH_OF_YEAR_TYPE; |
318 | } |
319 | |
320 | /** |
321 | * Get the year field type. |
322 | * |
323 | * @return the DateTimeFieldType constant |
324 | */ |
325 | public static DateTimeFieldType year() { |
326 | return YEAR_TYPE; |
327 | } |
328 | |
329 | /** |
330 | * Get the year of era field type. |
331 | * |
332 | * @return the DateTimeFieldType constant |
333 | */ |
334 | public static DateTimeFieldType yearOfEra() { |
335 | return YEAR_OF_ERA_TYPE; |
336 | } |
337 | |
338 | /** |
339 | * Get the year of century field type. |
340 | * |
341 | * @return the DateTimeFieldType constant |
342 | */ |
343 | public static DateTimeFieldType yearOfCentury() { |
344 | return YEAR_OF_CENTURY_TYPE; |
345 | } |
346 | |
347 | /** |
348 | * Get the century of era field type. |
349 | * |
350 | * @return the DateTimeFieldType constant |
351 | */ |
352 | public static DateTimeFieldType centuryOfEra() { |
353 | return CENTURY_OF_ERA_TYPE; |
354 | } |
355 | |
356 | /** |
357 | * Get the era field type. |
358 | * |
359 | * @return the DateTimeFieldType constant |
360 | */ |
361 | public static DateTimeFieldType era() { |
362 | return ERA_TYPE; |
363 | } |
364 | |
365 | //----------------------------------------------------------------------- |
366 | /** |
367 | * Get the name of the field. |
368 | * <p> |
369 | * By convention, names follow a pattern of "dddOfRrr", where "ddd" represents |
370 | * the (singular) duration unit field name and "Rrr" represents the (singular) |
371 | * duration range field name. If the range field is not applicable, then |
372 | * the name of the field is simply the (singular) duration field name. |
373 | * |
374 | * @return field name |
375 | */ |
376 | public String getName() { |
377 | return iName; |
378 | } |
379 | |
380 | /** |
381 | * Get the duration unit of the field. |
382 | * |
383 | * @return duration unit of the field, never null |
384 | */ |
385 | public abstract DurationFieldType getDurationType(); |
386 | |
387 | /** |
388 | * Get the duration range of the field. |
389 | * |
390 | * @return duration range of the field, null if unbounded |
391 | */ |
392 | public abstract DurationFieldType getRangeDurationType(); |
393 | |
394 | /** |
395 | * Gets a suitable field for this type from the given Chronology. |
396 | * |
397 | * @param chronology the chronology to use, null means ISOChronology in default zone |
398 | * @return a suitable field |
399 | */ |
400 | public abstract DateTimeField getField(Chronology chronology); |
401 | |
402 | /** |
403 | * Checks whether this field supported in the given Chronology. |
404 | * |
405 | * @param chronology the chronology to use, null means ISOChronology in default zone |
406 | * @return true if supported |
407 | */ |
408 | public boolean isSupported(Chronology chronology) { |
409 | return getField(chronology).isSupported(); |
410 | } |
411 | |
412 | /** |
413 | * Get a suitable debug string. |
414 | * |
415 | * @return debug string |
416 | */ |
417 | public String toString() { |
418 | return getName(); |
419 | } |
420 | |
421 | private static class StandardDateTimeFieldType extends DateTimeFieldType { |
422 | /** Serialization version */ |
423 | private static final long serialVersionUID = -9937958251642L; |
424 | |
425 | /** The ordinal of the standard field type, for switch statements */ |
426 | private final byte iOrdinal; |
427 | |
428 | /** The unit duration of the field. */ |
429 | private final transient DurationFieldType iUnitType; |
430 | /** The range duration of the field. */ |
431 | private final transient DurationFieldType iRangeType; |
432 | |
433 | /** |
434 | * Constructor. |
435 | * |
436 | * @param name the name to use |
437 | * @param ordinal the byte value for the oridinal index |
438 | * @param unitType the unit duration type |
439 | * @param rangeType the range duration type |
440 | */ |
441 | StandardDateTimeFieldType(String name, byte ordinal, |
442 | DurationFieldType unitType, DurationFieldType rangeType) { |
443 | super(name); |
444 | iOrdinal = ordinal; |
445 | iUnitType = unitType; |
446 | iRangeType = rangeType; |
447 | } |
448 | |
449 | /** @inheritdoc */ |
450 | public DurationFieldType getDurationType() { |
451 | return iUnitType; |
452 | } |
453 | |
454 | /** @inheritdoc */ |
455 | public DurationFieldType getRangeDurationType() { |
456 | return iRangeType; |
457 | } |
458 | |
459 | /** @inheritdoc */ |
460 | public DateTimeField getField(Chronology chronology) { |
461 | chronology = DateTimeUtils.getChronology(chronology); |
462 | |
463 | switch (iOrdinal) { |
464 | case ERA: |
465 | return chronology.era(); |
466 | case YEAR_OF_ERA: |
467 | return chronology.yearOfEra(); |
468 | case CENTURY_OF_ERA: |
469 | return chronology.centuryOfEra(); |
470 | case YEAR_OF_CENTURY: |
471 | return chronology.yearOfCentury(); |
472 | case YEAR: |
473 | return chronology.year(); |
474 | case DAY_OF_YEAR: |
475 | return chronology.dayOfYear(); |
476 | case MONTH_OF_YEAR: |
477 | return chronology.monthOfYear(); |
478 | case DAY_OF_MONTH: |
479 | return chronology.dayOfMonth(); |
480 | case WEEKYEAR_OF_CENTURY: |
481 | return chronology.weekyearOfCentury(); |
482 | case WEEKYEAR: |
483 | return chronology.weekyear(); |
484 | case WEEK_OF_WEEKYEAR: |
485 | return chronology.weekOfWeekyear(); |
486 | case DAY_OF_WEEK: |
487 | return chronology.dayOfWeek(); |
488 | case HALFDAY_OF_DAY: |
489 | return chronology.halfdayOfDay(); |
490 | case HOUR_OF_HALFDAY: |
491 | return chronology.hourOfHalfday(); |
492 | case CLOCKHOUR_OF_HALFDAY: |
493 | return chronology.clockhourOfHalfday(); |
494 | case CLOCKHOUR_OF_DAY: |
495 | return chronology.clockhourOfDay(); |
496 | case HOUR_OF_DAY: |
497 | return chronology.hourOfDay(); |
498 | case MINUTE_OF_DAY: |
499 | return chronology.minuteOfDay(); |
500 | case MINUTE_OF_HOUR: |
501 | return chronology.minuteOfHour(); |
502 | case SECOND_OF_DAY: |
503 | return chronology.secondOfDay(); |
504 | case SECOND_OF_MINUTE: |
505 | return chronology.secondOfMinute(); |
506 | case MILLIS_OF_DAY: |
507 | return chronology.millisOfDay(); |
508 | case MILLIS_OF_SECOND: |
509 | return chronology.millisOfSecond(); |
510 | default: |
511 | // Shouldn't happen. |
512 | throw new InternalError(); |
513 | } |
514 | } |
515 | |
516 | /** |
517 | * Ensure a singleton is returned. |
518 | * |
519 | * @return the singleton type |
520 | */ |
521 | private Object readResolve() { |
522 | switch (iOrdinal) { |
523 | case ERA: |
524 | return ERA_TYPE; |
525 | case YEAR_OF_ERA: |
526 | return YEAR_OF_ERA_TYPE; |
527 | case CENTURY_OF_ERA: |
528 | return CENTURY_OF_ERA_TYPE; |
529 | case YEAR_OF_CENTURY: |
530 | return YEAR_OF_CENTURY_TYPE; |
531 | case YEAR: |
532 | return YEAR_TYPE; |
533 | case DAY_OF_YEAR: |
534 | return DAY_OF_YEAR_TYPE; |
535 | case MONTH_OF_YEAR: |
536 | return MONTH_OF_YEAR_TYPE; |
537 | case DAY_OF_MONTH: |
538 | return DAY_OF_MONTH_TYPE; |
539 | case WEEKYEAR_OF_CENTURY: |
540 | return WEEKYEAR_OF_CENTURY_TYPE; |
541 | case WEEKYEAR: |
542 | return WEEKYEAR_TYPE; |
543 | case WEEK_OF_WEEKYEAR: |
544 | return WEEK_OF_WEEKYEAR_TYPE; |
545 | case DAY_OF_WEEK: |
546 | return DAY_OF_WEEK_TYPE; |
547 | case HALFDAY_OF_DAY: |
548 | return HALFDAY_OF_DAY_TYPE; |
549 | case HOUR_OF_HALFDAY: |
550 | return HOUR_OF_HALFDAY_TYPE; |
551 | case CLOCKHOUR_OF_HALFDAY: |
552 | return CLOCKHOUR_OF_HALFDAY_TYPE; |
553 | case CLOCKHOUR_OF_DAY: |
554 | return CLOCKHOUR_OF_DAY_TYPE; |
555 | case HOUR_OF_DAY: |
556 | return HOUR_OF_DAY_TYPE; |
557 | case MINUTE_OF_DAY: |
558 | return MINUTE_OF_DAY_TYPE; |
559 | case MINUTE_OF_HOUR: |
560 | return MINUTE_OF_HOUR_TYPE; |
561 | case SECOND_OF_DAY: |
562 | return SECOND_OF_DAY_TYPE; |
563 | case SECOND_OF_MINUTE: |
564 | return SECOND_OF_MINUTE_TYPE; |
565 | case MILLIS_OF_DAY: |
566 | return MILLIS_OF_DAY_TYPE; |
567 | case MILLIS_OF_SECOND: |
568 | return MILLIS_OF_SECOND_TYPE; |
569 | default: |
570 | // Shouldn't happen. |
571 | return this; |
572 | } |
573 | } |
574 | } |
575 | |
576 | } |