U_CAPI int32_t U_EXPORT2 ucal_getDSTSavings(const UChar* zoneID, UErrorCode* ec) { int32_t result = 0; TimeZone* zone = _createTimeZone(zoneID, -1, ec); if (U_SUCCESS(*ec)) { SimpleTimeZone* stz = dynamic_cast<SimpleTimeZone*>(zone); if (stz != NULL) { result = stz->getDSTSavings(); } else { // Since there is no getDSTSavings on TimeZone, we use a // heuristic: Starting with the current time, march // forwards for one year, looking for DST savings. // Stepping by weeks is sufficient. UDate d = Calendar::getNow(); for (int32_t i=0; i<53; ++i, d+=U_MILLIS_PER_DAY*7.0) { int32_t raw, dst; zone->getOffset(d, FALSE, raw, dst, *ec); if (U_FAILURE(*ec)) { break; } else if (dst != 0) { result = dst; break; } } } } delete zone; return result; }
// test new API for JDK 1.2 8/31 putback void TimeZoneRegressionTest::TestJDK12API() { // TimeZone *pst = TimeZone::createTimeZone("PST"); // TimeZone *cst1 = TimeZone::createTimeZone("CST"); UErrorCode ec = U_ZERO_ERROR; //d,-28800,3,1,-1,120,w,9,-1,1,120,w,60 TimeZone *pst = new SimpleTimeZone(-28800*U_MILLIS_PER_SECOND, "PST", 3,1,-1,120*U_MILLIS_PER_MINUTE, SimpleTimeZone::WALL_TIME, 9,-1,1,120*U_MILLIS_PER_MINUTE, SimpleTimeZone::WALL_TIME, 60*U_MILLIS_PER_MINUTE,ec); //d,-21600,3,1,-1,120,w,9,-1,1,120,w,60 TimeZone *cst1 = new SimpleTimeZone(-21600*U_MILLIS_PER_SECOND, "CST", 3,1,-1,120*U_MILLIS_PER_MINUTE, SimpleTimeZone::WALL_TIME, 9,-1,1,120*U_MILLIS_PER_MINUTE, SimpleTimeZone::WALL_TIME, 60*U_MILLIS_PER_MINUTE,ec); if (U_FAILURE(ec)) { errln("FAIL: SimpleTimeZone constructor"); return; } SimpleTimeZone *cst = dynamic_cast<SimpleTimeZone *>(cst1); if(pst->hasSameRules(*cst)) { errln("FAILURE: PST and CST have same rules"); } UErrorCode status = U_ZERO_ERROR; int32_t offset1 = pst->getOffset(1, 1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), status); failure(status, "getOffset() failed"); int32_t offset2 = cst->getOffset(1, 1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), 31, status); failure(status, "getOffset() failed"); if(offset1 == offset2) errln("FAILURE: Sunday Oct. 26 1997 2:00 has same offset for PST and CST"); // verify error checking pst->getOffset(1, 1997, UCAL_FIELD_COUNT+1, 26, UCAL_SUNDAY, (2*60*60*1000), status); if(U_SUCCESS(status)) errln("FAILURE: getOffset() succeeded with -1 for month"); status = U_ZERO_ERROR; cst->setDSTSavings(60*60*1000, status); failure(status, "setDSTSavings() failed"); int32_t savings = cst->getDSTSavings(); if(savings != 60*60*1000) { errln("setDSTSavings() failed"); } delete pst; delete cst; }