ICU-22043 Change minimum ZONE_OFFSET value from -12h to -16h

See #2100
This commit is contained in:
Frank Tang 2022-05-24 04:16:01 +00:00 committed by Frank Yung-Fong Tang
parent 74a723f22f
commit f5f4813d16
4 changed files with 40 additions and 3 deletions

View file

@ -639,7 +639,7 @@ static const int32_t kCalendarLimits[UCAL_FIELD_COUNT][4] = {
{ 0, 0, 59, 59 }, // MINUTE
{ 0, 0, 59, 59 }, // SECOND
{ 0, 0, 999, 999 }, // MILLISECOND
{-12*kOneHour, -12*kOneHour, 12*kOneHour, 30*kOneHour }, // ZONE_OFFSET
{-16*kOneHour, -16*kOneHour, 12*kOneHour, 30*kOneHour }, // ZONE_OFFSET
{ -1*kOneHour, -1*kOneHour, 2*kOneHour, 2*kOneHour }, // DST_OFFSET
{/*N/A*/-1, /*N/A*/-1, /*N/A*/-1, /*N/A*/-1}, // YEAR_WOY
{ 1, 1, 7, 7 }, // DOW_LOCAL

View file

@ -98,6 +98,7 @@ CalendarRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* &
CASE(54,TestWeekOfYear13548);
CASE(55,Test13745);
CASE(56,TestUTCWrongAMPM22023);
CASE(57,TestAsiaManilaAfterSetGregorianChange22043);
default: name = ""; break;
}
}
@ -3189,6 +3190,40 @@ void CalendarRegressionTest::TestUTCWrongAMPM22023(void) {
VerifyGetStayInBound(-1e-15);
}
void CalendarRegressionTest::VerifyNoAssertWithSetGregorianChange(const char* timezone) {
UErrorCode status = U_ZERO_ERROR;
std::unique_ptr<Calendar> cal(
Calendar::createInstance(
TimeZone::createTimeZone(UnicodeString(timezone, -1, US_INV)),
Locale::getEnglish(),
status));
cal->setTime(Calendar::getNow(), status);
if (cal->getDynamicClassID() ==
GregorianCalendar::getStaticClassID()) {
GregorianCalendar* gc =
static_cast<GregorianCalendar*>(cal.get());
// The beginning of ECMAScript time, namely -(2**53)
const double start_of_time = -9007199254740992;
gc->setGregorianChange(start_of_time, status);
}
cal->get(UCAL_YEAR, status);
}
void CalendarRegressionTest::TestAsiaManilaAfterSetGregorianChange22043(void) {
VerifyNoAssertWithSetGregorianChange("Asia/Malina");
UErrorCode status = U_ZERO_ERROR;
std::unique_ptr<StringEnumeration> ids(TimeZone::createEnumeration(status));
if (U_FAILURE(status)) {
errln("TimeZone::createEnumeration failed");
return;
}
const char* id;
while ((id = ids->next(nullptr, status)) != nullptr && U_SUCCESS(status)) {
VerifyNoAssertWithSetGregorianChange(id);
}
}
void CalendarRegressionTest::TestWeekOfYear13548(void) {
int32_t year = 2000;
UErrorCode status = U_ZERO_ERROR;

View file

@ -82,6 +82,7 @@ public:
void TestIslamicCalOverflow(void);
void TestWeekOfYear13548(void);
void TestUTCWrongAMPM22023(void);
void TestAsiaManilaAfterSetGregorianChange22043(void);
void Test13745(void);
@ -89,6 +90,7 @@ public:
void dowTest(UBool lenient) ;
void VerifyGetStayInBound(double test_value);
void VerifyNoAssertWithSetGregorianChange(const char* timezone);
static UDate getAssociatedDate(UDate d, UErrorCode& status);
static UDate makeDate(int32_t y, int32_t m = 0, int32_t d = 0, int32_t hr = 0, int32_t min = 0, int32_t sec = 0);

View file

@ -4337,8 +4337,8 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
{ 0, 0, 59, 59 }, // MINUTE
{ 0, 0, 59, 59 }, // SECOND
{ 0, 0, 999, 999 }, // MILLISECOND
{-12*ONE_HOUR, -12*ONE_HOUR, 12*ONE_HOUR, 12*ONE_HOUR }, // ZONE_OFFSET
{ 0, 0, 1*ONE_HOUR, 1*ONE_HOUR }, // DST_OFFSET
{-16*ONE_HOUR, -16*ONE_HOUR, 12*ONE_HOUR, 30*ONE_HOUR }, // ZONE_OFFSET
{ 0, 0, 2*ONE_HOUR, 2*ONE_HOUR }, // DST_OFFSET
{/* */}, // YEAR_WOY
{ 1, 1, 7, 7 }, // DOW_LOCAL
{/* */}, // EXTENDED_YEAR