2 *******************************************************************************
\r
3 * Copyright (C) 2008, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.impl.icuadapter;
\r
9 import java.util.Calendar;
\r
10 import java.util.Date;
\r
11 import java.util.GregorianCalendar;
\r
12 import java.util.Locale;
\r
13 import java.util.TimeZone;
\r
15 import com.ibm.icu.impl.Grego;
\r
16 import com.ibm.icu.impl.jdkadapter.TimeZoneICU;
\r
17 import com.ibm.icu.util.ULocale;
\r
20 * TimeZoneJDK is an adapter class which wraps java.util.TimeZone and
\r
21 * implements ICU4J TimeZone APIs.
\r
23 public class TimeZoneJDK extends com.ibm.icu.util.TimeZone {
\r
25 private static final long serialVersionUID = -1137052823551791933L;
\r
27 private TimeZone fJdkTz;
\r
28 private transient Calendar fJdkCal;
\r
30 private TimeZoneJDK(TimeZone jdkTz) {
\r
34 public static com.ibm.icu.util.TimeZone wrap(TimeZone jdkTz) {
\r
35 if (jdkTz instanceof TimeZoneICU) {
\r
36 return ((TimeZoneICU)jdkTz).unwrap();
\r
38 return new TimeZoneJDK(jdkTz);
\r
41 public TimeZone unwrap() {
\r
46 public Object clone() {
\r
47 TimeZoneJDK other = (TimeZoneJDK)super.clone();
\r
48 other.fJdkTz = (TimeZone)fJdkTz.clone();
\r
53 public boolean equals(Object obj) {
\r
54 if (obj instanceof TimeZoneJDK) {
\r
55 return (((TimeZoneJDK)obj).fJdkTz).equals(fJdkTz);
\r
60 //public String getDisplayName()
\r
61 //public String getDisplayName(boolean daylight, int style)
\r
62 //public String getDisplayName(Locale locale)
\r
63 //public String getDisplayName(ULocale locale)
\r
65 public String getDisplayName(boolean daylight, int style, Locale locale) {
\r
66 return fJdkTz.getDisplayName(daylight, style, locale);
\r
70 public String getDisplayName(boolean daylight, int style, ULocale locale) {
\r
71 return fJdkTz.getDisplayName(daylight, style, locale.toLocale());
\r
75 public int getDSTSavings() {
\r
76 return fJdkTz.getDSTSavings();
\r
80 public String getID() {
\r
81 return fJdkTz.getID();
\r
85 public int getOffset(int era, int year, int month, int day, int dayOfWeek, int milliseconds) {
\r
86 return fJdkTz.getOffset(era, year, month, day, dayOfWeek, milliseconds);
\r
90 public int getOffset(long date) {
\r
91 return fJdkTz.getOffset(date);
\r
95 public void getOffset(long date, boolean local, int[] offsets) {
\r
96 synchronized(this) {
\r
97 if (fJdkCal == null) {
\r
98 fJdkCal = new GregorianCalendar(fJdkTz);
\r
101 int fields[] = new int[6];
\r
102 Grego.timeToFields(date, fields);
\r
103 int hour, min, sec, mil;
\r
104 int tmp = fields[5];
\r
112 fJdkCal.set(fields[0], fields[1], fields[2], hour, min, sec);
\r
113 fJdkCal.set(java.util.Calendar.MILLISECOND, mil);
\r
115 int doy1, hour1, min1, sec1, mil1;
\r
116 doy1 = fJdkCal.get(java.util.Calendar.DAY_OF_YEAR);
\r
117 hour1 = fJdkCal.get(java.util.Calendar.HOUR_OF_DAY);
\r
118 min1 = fJdkCal.get(java.util.Calendar.MINUTE);
\r
119 sec1 = fJdkCal.get(java.util.Calendar.SECOND);
\r
120 mil1 = fJdkCal.get(java.util.Calendar.MILLISECOND);
\r
122 if (fields[4] != doy1 || hour != hour1 || min != min1 || sec != sec1 || mil != mil1) {
\r
123 // Calendar field(s) were changed due to the adjustment for non-existing time
\r
124 // Note: This code does not support non-existing local time at year boundary properly.
\r
125 // But, it should work fine for real timezones.
\r
126 int dayDelta = Math.abs(doy1 - fields[4]) > 1 ? 1 : doy1 - fields[4];
\r
127 int delta = ((((dayDelta * 24) + hour1 - hour) * 60 + min1 - min) * 60 + sec1 - sec) * 1000 + mil1 - mil;
\r
129 // In this case, we use the offsets before the transition
\r
130 fJdkCal.setTimeInMillis(fJdkCal.getTimeInMillis() - delta - 1);
\r
133 fJdkCal.setTimeInMillis(date);
\r
135 offsets[0] = fJdkCal.get(java.util.Calendar.ZONE_OFFSET);
\r
136 offsets[1] = fJdkCal.get(java.util.Calendar.DST_OFFSET);
\r
141 public int getRawOffset() {
\r
142 return fJdkTz.getRawOffset();
\r
146 public int hashCode() {
\r
147 return fJdkTz.hashCode();
\r
151 public boolean hasSameRules(com.ibm.icu.util.TimeZone other) {
\r
152 return other.hasSameRules(TimeZoneJDK.wrap(fJdkTz));
\r
156 public boolean inDaylightTime(Date date) {
\r
157 return fJdkTz.inDaylightTime(date);
\r
161 public void setID(String ID) {
\r
166 public void setRawOffset(int offsetMillis) {
\r
167 fJdkTz.setRawOffset(offsetMillis);
\r
171 public boolean useDaylightTime() {
\r
172 return fJdkTz.useDaylightTime();
\r