mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-21 04:29:31 +00:00
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:
parent
cd83d25daf
commit
6039f90011
2 changed files with 77 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue