]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/localespi/src/com/ibm/icu/impl/icuadapter/TimeZoneJDK.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / localespi / src / com / ibm / icu / impl / icuadapter / TimeZoneJDK.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2008, International Business Machines Corporation and         *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.impl.icuadapter;\r
8 \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
14 \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
18 \r
19 /**\r
20  * TimeZoneJDK is an adapter class which wraps java.util.TimeZone and\r
21  * implements ICU4J TimeZone APIs.\r
22  */\r
23 public class TimeZoneJDK extends com.ibm.icu.util.TimeZone {\r
24 \r
25     private static final long serialVersionUID = -1137052823551791933L;\r
26 \r
27     private TimeZone fJdkTz;\r
28     private transient Calendar fJdkCal;\r
29 \r
30     private TimeZoneJDK(TimeZone jdkTz) {\r
31         fJdkTz = jdkTz;\r
32     }\r
33     \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
37         }\r
38         return new TimeZoneJDK(jdkTz);\r
39     }\r
40     \r
41     public TimeZone unwrap() {\r
42         return fJdkTz;\r
43     }\r
44 \r
45     @Override\r
46     public Object clone() {\r
47         TimeZoneJDK other = (TimeZoneJDK)super.clone();\r
48         other.fJdkTz = (TimeZone)fJdkTz.clone();\r
49         return other;\r
50     }\r
51     \r
52     @Override\r
53     public boolean equals(Object obj) {\r
54         if (obj instanceof TimeZoneJDK) {\r
55             return (((TimeZoneJDK)obj).fJdkTz).equals(fJdkTz);\r
56         }\r
57         return false;\r
58     }\r
59 \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
64     @Override\r
65     public String getDisplayName(boolean daylight, int style, Locale locale) {\r
66         return fJdkTz.getDisplayName(daylight, style, locale);\r
67     }\r
68     \r
69     @Override\r
70     public String getDisplayName(boolean daylight, int style, ULocale locale) {\r
71         return fJdkTz.getDisplayName(daylight, style, locale.toLocale());\r
72     }\r
73 \r
74     @Override\r
75     public int getDSTSavings() {\r
76         return fJdkTz.getDSTSavings();\r
77     }\r
78 \r
79     @Override\r
80     public String getID() {\r
81         return fJdkTz.getID();\r
82     }\r
83 \r
84     @Override\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
87     }\r
88 \r
89     @Override\r
90     public int getOffset(long date) {\r
91         return fJdkTz.getOffset(date);\r
92     }\r
93 \r
94     @Override\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
99             }\r
100             if (local) {\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
105                 mil = tmp % 1000;\r
106                 tmp /= 1000;\r
107                 sec = tmp % 60;\r
108                 tmp /= 60;\r
109                 min = tmp % 60;\r
110                 hour = tmp / 60;\r
111                 fJdkCal.clear();\r
112                 fJdkCal.set(fields[0], fields[1], fields[2], hour, min, sec);\r
113                 fJdkCal.set(java.util.Calendar.MILLISECOND, mil);\r
114 \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
121 \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
128 \r
129                     // In this case, we use the offsets before the transition\r
130                     fJdkCal.setTimeInMillis(fJdkCal.getTimeInMillis() - delta - 1);\r
131                 }\r
132             } else {\r
133                 fJdkCal.setTimeInMillis(date);\r
134             }\r
135             offsets[0] = fJdkCal.get(java.util.Calendar.ZONE_OFFSET);\r
136             offsets[1] = fJdkCal.get(java.util.Calendar.DST_OFFSET);\r
137         }\r
138     }\r
139 \r
140     @Override\r
141     public int getRawOffset() {\r
142         return fJdkTz.getRawOffset();\r
143     }\r
144 \r
145     @Override\r
146     public int hashCode() {\r
147         return fJdkTz.hashCode();\r
148     }\r
149 \r
150     @Override\r
151     public boolean hasSameRules(com.ibm.icu.util.TimeZone other) {\r
152         return other.hasSameRules(TimeZoneJDK.wrap(fJdkTz));\r
153     }\r
154 \r
155     @Override\r
156     public boolean inDaylightTime(Date date) {\r
157         return fJdkTz.inDaylightTime(date);\r
158     }\r
159 \r
160     @Override\r
161     public void setID(String ID) {\r
162         fJdkTz.setID(ID);\r
163     }\r
164 \r
165     @Override\r
166     public void setRawOffset(int offsetMillis) {\r
167         fJdkTz.setRawOffset(offsetMillis);\r
168     }\r
169 \r
170     @Override\r
171     public boolean useDaylightTime() {\r
172         return fJdkTz.useDaylightTime();\r
173     }\r
174 }\r