mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 20:03:02 +01:00
Improvement CORE-6058 - Change behavior of skipped and repeated wall times within time zones.
This commit is contained in:
parent
b656c3ae84
commit
9c76811fae
@ -14,6 +14,8 @@ A time zone may be a string with a time zone region (for example, `America/Sao_P
|
||||
|
||||
A time/timestamp with time zone is considered equal to another time/timestamp with time zone if their conversion to UTC are equal, for example, `time '10:00 -02' = time '09:00 -03'`, since both are the same as `time '12:00 GMT'`. This is also valid in the context of `UNIQUE` constraints and for sorting purposes.
|
||||
|
||||
Some timestamps does not exist (DST starting) or repeats twice (DST ending). For the first case, when DST starts in America/New_York, 2:30 AM on March 12, 2017 does not exist and is interpreted as 2:30 AM UTC-05 (equivalent to 3:30 AM UTC-04). For the second case, when DST ends in America/New_York, 1:30 AM on November 5, 2017 repeats twice and is interpreted as 1:30 AM UTC-04 instead of 1:30 AM UTC-05.
|
||||
|
||||
|
||||
## Data types
|
||||
|
||||
|
@ -564,6 +564,9 @@ void TimeZoneUtil::localTimeStampToUtc(ISC_TIMESTAMP_TZ& timeStampTz)
|
||||
if (!icuCalendar)
|
||||
status_exception::raise(Arg::Gds(isc_random) << "Error calling ICU's ucal_open.");
|
||||
|
||||
icuLib.ucalSetAttribute(icuCalendar, UCAL_REPEATED_WALL_TIME, UCAL_WALLTIME_FIRST);
|
||||
icuLib.ucalSetAttribute(icuCalendar, UCAL_SKIPPED_WALL_TIME, UCAL_WALLTIME_FIRST);
|
||||
|
||||
icuLib.ucalSetDateTime(icuCalendar, 1900 + times.tm_year, times.tm_mon, times.tm_mday,
|
||||
times.tm_hour, times.tm_min, times.tm_sec, &icuErrorCode);
|
||||
|
||||
|
@ -288,6 +288,7 @@ private:
|
||||
getEntryPoint("ucal_getDefaultTimeZone", inModule, ucalGetDefaultTimeZone);
|
||||
getEntryPoint("ucal_open", inModule, ucalOpen);
|
||||
getEntryPoint("ucal_close", inModule, ucalClose);
|
||||
getEntryPoint("ucal_setAttribute", inModule, ucalSetAttribute);
|
||||
getEntryPoint("ucal_setMillis", inModule, ucalSetMillis);
|
||||
getEntryPoint("ucal_get", inModule, ucalGet);
|
||||
getEntryPoint("ucal_setDateTime", inModule, ucalSetDateTime);
|
||||
|
@ -128,6 +128,7 @@ public:
|
||||
UCalendar* (U_EXPORT2* ucalOpen) (const UChar* zoneID, int32_t len, const char* locale, UCalendarType type,
|
||||
UErrorCode* err);
|
||||
void (U_EXPORT2* ucalClose) (UCalendar* cal);
|
||||
void (U_EXPORT2* ucalSetAttribute) (UCalendar* cal, UCalendarAttribute attr, int32_t newValue);
|
||||
void (U_EXPORT2* ucalSetMillis) (UCalendar* cal, UDate dateTime, UErrorCode* err);
|
||||
int32_t (U_EXPORT2* ucalGet) (UCalendar* cal, UCalendarDateFields field, UErrorCode* err);
|
||||
void (U_EXPORT2* ucalSetDateTime) (UCalendar* cal, int32_t year, int32_t month, int32_t date, int32_t hour,
|
||||
|
Loading…
Reference in New Issue
Block a user