OLD | NEW |
(Empty) | |
| 1 /* |
| 2 ******************************************************************************* |
| 3 * Copyright (C) 2004-2006, International Business Machines Corporation and |
| 4 * others. All Rights Reserved. |
| 5 ******************************************************************************* |
| 6 */ |
| 7 |
| 8 #include "unicode/utypes.h" |
| 9 |
| 10 #if !UCONFIG_NO_FORMATTING |
| 11 |
| 12 #include "unicode/utmscale.h" |
| 13 |
| 14 #define ticks INT64_C(1) |
| 15 #define microseconds (ticks * 10) |
| 16 #define milliseconds (microseconds * 1000) |
| 17 #define seconds (milliseconds * 1000) |
| 18 #define minutes (seconds * 60) |
| 19 #define hours (minutes * 60) |
| 20 #define days (hours * 24) |
| 21 |
| 22 /* Constants generated by ICU4J com.ibm.icu.dev.tool.timescale.GenerateCTimeScal
eData. */ |
| 23 static const int64_t timeScaleTable[UDTS_MAX_SCALE][UTSV_MAX_SCALE_VALUE] = { |
| 24 /* units epochOffset fromMin
fromMax toMin toMax
epochOffsetP1 epochOffsetM1 unitsR
ound minRound maxRound */ |
| 25 {milliseconds, INT64_C(62135596800000), INT64_C(-984472800485477), I
NT64_C(860201606885477), INT64_C(-9223372036854774999), INT64_C(922337203685
4774999), INT64_C(62135596800001), INT64_C(62135596799999), INT64_C(5000
), INT64_C(-9223372036854770808), INT64_C(9223372036854770807)}, |
| 26 {seconds, INT64_C(62135596800), INT64_C(-984472800485), I
NT64_C(860201606885), U_INT64_MIN, U_INT64_MAX,
INT64_C(62135596801), INT64_C(62135596799), INT64_C(5000
000), INT64_C(-9223372036849775808), INT64_C(9223372036849775807)}, |
| 27 {milliseconds, INT64_C(62135596800000), INT64_C(-984472800485477), I
NT64_C(860201606885477), INT64_C(-9223372036854774999), INT64_C(922337203685
4774999), INT64_C(62135596800001), INT64_C(62135596799999), INT64_C(5000
), INT64_C(-9223372036854770808), INT64_C(9223372036854770807)}, |
| 28 {ticks, INT64_C(504911232000000000), U_INT64_MIN, I
NT64_C(8718460804854775807), INT64_C(-8718460804854775808), U_INT64_MAX,
INT64_C(504911232000000000), INT64_C(504911232000000000), INT64_C(0),
U_INT64_MIN, U_INT64_MAX}, |
| 29 {ticks, INT64_C(0), U_INT64_MIN, U
_INT64_MAX, U_INT64_MIN, U_INT64_MAX,
INT64_C(0), INT64_C(0), INT64_C(0),
U_INT64_MIN, U_INT64_MAX}, |
| 30 {seconds, INT64_C(60052752000), INT64_C(-982389955685), I
NT64_C(862284451685), U_INT64_MIN, U_INT64_MAX,
INT64_C(60052752001), INT64_C(60052751999), INT64_C(5000
000), INT64_C(-9223372036849775808), INT64_C(9223372036849775807)}, |
| 31 {seconds, INT64_C(63113904000), INT64_C(-985451107685), I
NT64_C(859223299685), U_INT64_MIN, U_INT64_MAX,
INT64_C(63113904001), INT64_C(63113903999), INT64_C(5000
000), INT64_C(-9223372036849775808), INT64_C(9223372036849775807)}, |
| 32 {days, INT64_C(693594), INT64_C(-11368793), I
NT64_C(9981605), U_INT64_MIN, U_INT64_MAX,
INT64_C(693595), INT64_C(693593), INT64_C(4320
00000000), INT64_C(-9223371604854775808), INT64_C(9223371604854775807)}, |
| 33 {days, INT64_C(693594), INT64_C(-11368793), I
NT64_C(9981605), U_INT64_MIN, U_INT64_MAX,
INT64_C(693595), INT64_C(693593), INT64_C(4320
00000000), INT64_C(-9223371604854775808), INT64_C(9223371604854775807)}, |
| 34 {microseconds, INT64_C(62135596800000000), INT64_C(-984472800485477580), I
NT64_C(860201606885477580), INT64_C(-9223372036854775804), INT64_C(922337203685
4775804), INT64_C(62135596800000001), INT64_C(62135596799999999), INT64_C(5),
INT64_C(-9223372036854775803), INT64_C(9223372036854775802)}, |
| 35 }; |
| 36 |
| 37 U_CAPI int64_t U_EXPORT2 |
| 38 utmscale_getTimeScaleValue(UDateTimeScale timeScale, UTimeScaleValue value, UErr
orCode *status) |
| 39 { |
| 40 if (status == NULL || U_FAILURE(*status)) { |
| 41 return 0; |
| 42 } |
| 43 |
| 44 if (timeScale < UDTS_JAVA_TIME || UDTS_MAX_SCALE <= timeScale |
| 45 || value < UTSV_UNITS_VALUE || UTSV_MAX_SCALE_VALUE <= value) |
| 46 { |
| 47 *status = U_ILLEGAL_ARGUMENT_ERROR; |
| 48 return 0; |
| 49 } |
| 50 |
| 51 return timeScaleTable[timeScale][value]; |
| 52 } |
| 53 |
| 54 U_CAPI int64_t U_EXPORT2 |
| 55 utmscale_fromInt64(int64_t otherTime, UDateTimeScale timeScale, UErrorCode *stat
us) |
| 56 { |
| 57 const int64_t *data; |
| 58 |
| 59 if (status == NULL || U_FAILURE(*status)) { |
| 60 return 0; |
| 61 } |
| 62 |
| 63 if (timeScale < 0 || timeScale >= UDTS_MAX_SCALE) { |
| 64 *status = U_ILLEGAL_ARGUMENT_ERROR; |
| 65 return 0; |
| 66 } |
| 67 |
| 68 data = (const int64_t *)(&timeScaleTable[timeScale]); |
| 69 |
| 70 if (otherTime < data[UTSV_FROM_MIN_VALUE] || otherTime > data[UTSV_FROM_MAX_
VALUE]) { |
| 71 *status = U_ILLEGAL_ARGUMENT_ERROR; |
| 72 return 0; |
| 73 } |
| 74 |
| 75 return (otherTime + data[UTSV_EPOCH_OFFSET_VALUE]) * data[UTSV_UNITS_VALUE]; |
| 76 } |
| 77 |
| 78 U_CAPI int64_t U_EXPORT2 |
| 79 utmscale_toInt64(int64_t universalTime, UDateTimeScale timeScale, UErrorCode *st
atus) |
| 80 { |
| 81 const int64_t *data; |
| 82 |
| 83 if (status == NULL || U_FAILURE(*status)) { |
| 84 return 0; |
| 85 } |
| 86 |
| 87 if (timeScale < 0 || timeScale >= UDTS_MAX_SCALE) { |
| 88 *status = U_ILLEGAL_ARGUMENT_ERROR; |
| 89 return 0; |
| 90 } |
| 91 |
| 92 data = (const int64_t *)(&timeScaleTable[timeScale]); |
| 93 |
| 94 if (universalTime < data[UTSV_TO_MIN_VALUE] || universalTime > data[UTSV_TO_
MAX_VALUE]) { |
| 95 *status = U_ILLEGAL_ARGUMENT_ERROR; |
| 96 return 0; |
| 97 } |
| 98 |
| 99 if (universalTime < 0) { |
| 100 if (universalTime < data[UTSV_MIN_ROUND_VALUE]) { |
| 101 return (universalTime + data[UTSV_UNITS_ROUND_VALUE]) / data[UTSV_UN
ITS_VALUE] - data[UTSV_EPOCH_OFFSET_PLUS_1_VALUE]; |
| 102 } |
| 103 |
| 104 return (universalTime - data[UTSV_UNITS_ROUND_VALUE]) / data[UTSV_UNITS_
VALUE] - data[UTSV_EPOCH_OFFSET_VALUE]; |
| 105 } |
| 106 |
| 107 if (universalTime > data[UTSV_MAX_ROUND_VALUE]) { |
| 108 return (universalTime - data[UTSV_UNITS_ROUND_VALUE]) / data[UTSV_UNITS_
VALUE] - data[UTSV_EPOCH_OFFSET_MINUS_1_VALUE]; |
| 109 } |
| 110 |
| 111 return (universalTime + data[UTSV_UNITS_ROUND_VALUE]) / data[UTSV_UNITS_VALU
E] - data[UTSV_EPOCH_OFFSET_VALUE]; |
| 112 } |
| 113 |
| 114 #endif /* #if !UCONFIG_NO_FORMATTING */ |
OLD | NEW |