ICU-6459 Updated TimeZone#setDefault to use JDK TimeZone as the default Java TimeZone to avoid java Date/Calendar calculation problem.

X-SVN-Rev: 24431
This commit is contained in:
Yoshito Umaoka 2008-08-01 15:57:02 +00:00
parent cd83d25daf
commit 6039f90011
2 changed files with 77 additions and 2 deletions

View file

@ -1416,6 +1416,63 @@ public class TimeZoneTest extends TestFmwk
}
}
}
public void TestSetDefault() {
java.util.TimeZone save = java.util.TimeZone.getDefault();
/*
* America/Caracs (Venezuela) changed the base offset from -4:00 to
* -4:30 on Dec 9, 2007.
*/
TimeZone icuCaracas = TimeZone.getTimeZone("America/Caracas", TimeZone.TIMEZONE_ICU);
java.util.TimeZone jdkCaracas = java.util.TimeZone.getTimeZone("America/Caracas");
// Set JDK America/Caracas as the default
java.util.TimeZone.setDefault(jdkCaracas);
java.util.Calendar jdkCal = java.util.Calendar.getInstance();
jdkCal.clear();
jdkCal.set(2007, java.util.Calendar.JANUARY, 1);
int rawOffset = jdkCal.get(java.util.Calendar.ZONE_OFFSET);
int dstSavings = jdkCal.get(java.util.Calendar.DST_OFFSET);
int[] offsets = new int[2];
icuCaracas.getOffset(jdkCal.getTimeInMillis(), false, offsets);
boolean isTimeZoneSynchronized = true;
if (rawOffset != offsets[0] || dstSavings != offsets[1]) {
// JDK time zone rule is out of sync...
logln("Rule for JDK America/Caracas is not same with ICU. Skipping the rest.");
isTimeZoneSynchronized = false;
}
if (isTimeZoneSynchronized) {
// If JDK America/Caracas uses the same rule with ICU,
// the following code should work well.
TimeZone.setDefault(icuCaracas);
// Create a new JDK calendar instance again.
// This calendar should reflect the new default
// set by ICU TimeZone#setDefault.
jdkCal = java.util.Calendar.getInstance();
jdkCal.clear();
jdkCal.set(2007, java.util.Calendar.JANUARY, 1);
rawOffset = jdkCal.get(java.util.Calendar.ZONE_OFFSET);
dstSavings = jdkCal.get(java.util.Calendar.DST_OFFSET);
if (rawOffset != offsets[0] || dstSavings != offsets[1]) {
errln("ERROR: Got offset [raw:" + rawOffset + "/dst:" + dstSavings
+ "] Expected [raw:" + offsets[0] + "/dst:" + offsets[1] + "]");
}
}
// Restore the original JDK time zone
java.util.TimeZone.setDefault(save);
}
}
//eof

View file

@ -829,9 +829,27 @@ abstract public class TimeZone implements Serializable, Cloneable {
} else {
// Keep java.util.TimeZone default in sync so java.util.Date
// can interoperate with com.ibm.icu.util classes.
jdkZone = null;
if (tz != null) {
jdkZone = TimeZoneAdapter.wrap(tz);
if (tz instanceof com.ibm.icu.impl.OlsonTimeZone) {
// Because of the lack of APIs supporting historic
// zone offset/dst saving in JDK TimeZone,
// wrapping ICU TimeZone with JDK TimeZone will
// cause historic offset calculation in Calendar/Date.
// JDK calendar implementation calls getRawOffset() and
// getDSTSavings() when the instance of JDK TimeZone
// is not an instance of JDK internal TimeZone subclass
// (sun.util.calendar.ZoneInfo). Ticket#6459
String icuID = tz.getID();
jdkZone = java.util.TimeZone.getTimeZone(icuID);
if (!icuID.equals(jdkZone.getID())) {
// JDK does not know the ID..
jdkZone = null;
}
}
if (jdkZone == null) {
jdkZone = TimeZoneAdapter.wrap(tz);
}
}
}
java.util.TimeZone.setDefault(jdkZone);