2 *******************************************************************************
\r
3 * Copyright (C) 2007-2008, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.timezone;
\r
9 import java.util.Date;
\r
11 import com.ibm.icu.dev.test.TestFmwk;
\r
12 import com.ibm.icu.text.DateFormat;
\r
13 import com.ibm.icu.util.AnnualTimeZoneRule;
\r
14 import com.ibm.icu.util.BasicTimeZone;
\r
15 import com.ibm.icu.util.Calendar;
\r
16 import com.ibm.icu.util.DateTimeRule;
\r
17 import com.ibm.icu.util.GregorianCalendar;
\r
18 import com.ibm.icu.util.InitialTimeZoneRule;
\r
19 import com.ibm.icu.util.RuleBasedTimeZone;
\r
20 import com.ibm.icu.util.SimpleTimeZone;
\r
21 import com.ibm.icu.util.TimeZone;
\r
24 * Testing getOffset APIs using local time
\r
26 public class TimeZoneOffsetLocalTest extends TestFmwk {
\r
28 public static void main(String[] args) throws Exception {
\r
29 new TimeZoneOffsetLocalTest().run(args);
\r
33 * Testing getOffset APIs around rule transition by local standard/wall time.
\r
35 public void TestGetOffsetAroundTransition() {
\r
36 final int HOUR = 60*60*1000;
\r
37 final int MINUTE = 60*1000;
\r
40 {2006, Calendar.APRIL, 2, 1, 30, 1*HOUR+30*MINUTE},
\r
41 {2006, Calendar.APRIL, 2, 2, 00, 2*HOUR},
\r
42 {2006, Calendar.APRIL, 2, 2, 30, 2*HOUR+30*MINUTE},
\r
43 {2006, Calendar.APRIL, 2, 3, 00, 3*HOUR},
\r
44 {2006, Calendar.APRIL, 2, 3, 30, 3*HOUR+30*MINUTE},
\r
45 {2006, Calendar.OCTOBER, 29, 0, 30, 0*HOUR+30*MINUTE},
\r
46 {2006, Calendar.OCTOBER, 29, 1, 00, 1*HOUR},
\r
47 {2006, Calendar.OCTOBER, 29, 1, 30, 1*HOUR+30*MINUTE},
\r
48 {2006, Calendar.OCTOBER, 29, 2, 00, 2*HOUR},
\r
49 {2006, Calendar.OCTOBER, 29, 2, 30, 2*HOUR+30*MINUTE},
\r
52 // Expected offsets by getOffset(int era, int year, int month, int day, int dayOfWeek, int milliseconds)
\r
70 // Expected offsets by getOffset(long time, boolean local, int[] offsets) with local = true
\r
71 // or getOffsetFromLocal(long time, int nonExistingTimeOpt, int duplicatedTimeOpt, int[] offsets)
\r
72 // with nonExistingTimeOpt = LOCAL_STD/duplicatedTimeOpt = LOCAL_STD
\r
73 int[][] OFFSETS2 = {
\r
89 // Expected offsets by getOffsetFromLocal(long time, int nonExistingTimeOpt, int duplicatedTimeOpt, int[] offsets)
\r
90 // with nonExistingTimeOpt = LOCAL_DST/duplicatedTimeOpt = LOCAL_DST
\r
91 int[][] OFFSETS3 = {
\r
107 int[] offsets = new int[2];
\r
109 TimeZone utc = TimeZone.getTimeZone("UTC");
\r
110 Calendar cal = Calendar.getInstance(utc);
\r
113 // Set up TimeZone objects - OlsonTimeZone, SimpleTimeZone and RuleBasedTimeZone
\r
114 BasicTimeZone[] TESTZONES = new BasicTimeZone[3];
\r
116 TESTZONES[0] = (BasicTimeZone)TimeZone.getTimeZone("America/Los_Angeles", TimeZone.TIMEZONE_ICU);
\r
117 TESTZONES[1] = new SimpleTimeZone(-8*HOUR, "Simple Pacific Time",
\r
118 Calendar.APRIL, 1, Calendar.SUNDAY, 2*HOUR,
\r
119 Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*HOUR);
\r
121 InitialTimeZoneRule ir = new InitialTimeZoneRule(
\r
122 "Pacific Standard Time", // Initial time Name
\r
123 -8*HOUR, // Raw offset
\r
124 0*HOUR); // DST saving amount
\r
126 RuleBasedTimeZone rbPT = new RuleBasedTimeZone("Rule based Pacific Time", ir);
\r
129 AnnualTimeZoneRule atzr;
\r
130 final int STARTYEAR = 2000;
\r
132 dtr = new DateTimeRule(Calendar.APRIL, 1, Calendar.SUNDAY,
\r
133 2*HOUR, DateTimeRule.WALL_TIME); // 1st Sunday in April, at 2AM wall time
\r
134 atzr = new AnnualTimeZoneRule("Pacific Daylight Time",
\r
135 -8*HOUR /* rawOffset */, 1*HOUR /* dstSavings */, dtr,
\r
136 STARTYEAR, AnnualTimeZoneRule.MAX_YEAR);
\r
137 rbPT.addTransitionRule(atzr);
\r
139 dtr = new DateTimeRule(Calendar.OCTOBER, -1, Calendar.SUNDAY,
\r
140 2*HOUR, DateTimeRule.WALL_TIME); // last Sunday in October, at 2AM wall time
\r
141 atzr = new AnnualTimeZoneRule("Pacific Standard Time",
\r
142 -8*HOUR /* rawOffset */, 0 /* dstSavings */, dtr,
\r
143 STARTYEAR, AnnualTimeZoneRule.MAX_YEAR);
\r
144 rbPT.addTransitionRule(atzr);
\r
146 TESTZONES[2] = rbPT;
\r
148 // Calculate millis
\r
149 long [] MILLIS = new long[DATES.length];
\r
150 for (int i = 0; i < DATES.length; i++) {
\r
152 cal.set(DATES[i][0], DATES[i][1], DATES[i][2], DATES[i][3], DATES[i][4]);
\r
153 MILLIS[i] = cal.getTimeInMillis();
\r
156 DateFormat df = DateFormat.getInstance();
\r
157 df.setTimeZone(utc);
\r
159 // Test getOffset(int era, int year, int month, int day, int dayOfWeek, int millis)
\r
160 for (int i = 0; i < TESTZONES.length; i++) {
\r
161 for (int d = 0; d < DATES.length; d++) {
\r
162 int offset = TESTZONES[i].getOffset(GregorianCalendar.AD, DATES[d][0], DATES[d][1], DATES[d][2],
\r
163 Calendar.SUNDAY, DATES[d][5]);
\r
164 if (offset != OFFSETS1[d]) {
\r
165 errln("Bad offset returned by " + TESTZONES[i].getID() + " at "
\r
166 + df.format(new Date(MILLIS[d])) + "(standard) - Got: " + offset + " Expected: " + OFFSETS1[d]);
\r
171 // Test getOffset(long time, boolean local, int[] offsets) with local=true
\r
172 for (int i = 0; i < TESTZONES.length; i++) {
\r
173 for (int m = 0; m < MILLIS.length; m++) {
\r
174 TESTZONES[i].getOffset(MILLIS[m], true, offsets);
\r
175 if (offsets[0] != OFFSETS2[m][0] || offsets[1] != OFFSETS2[m][1]) {
\r
176 errln("Bad offset returned by " + TESTZONES[i].getID() + " at "
\r
177 + df.format(new Date(MILLIS[m])) + "(wall) - Got: "
\r
178 + offsets[0] + "/" + offsets[1]
\r
179 + " Expected: " + OFFSETS2[m][0] + "/" + OFFSETS2[m][1]);
\r
184 // Test getOffsetFromLocal(long time, int nonExistingTimeOpt, int duplicatedTimeOpt, int[] offsets)
\r
185 // with nonExistingTimeOpt = LOCAL_STD/duplicatedTimeOpt = LOCAL_STD
\r
186 for (int i = 0; i < TESTZONES.length; i++) {
\r
187 for (int m = 0; m < MILLIS.length; m++) {
\r
188 TESTZONES[i].getOffsetFromLocal(MILLIS[m], BasicTimeZone.LOCAL_STD, BasicTimeZone.LOCAL_STD, offsets);
\r
189 if (offsets[0] != OFFSETS2[m][0] || offsets[1] != OFFSETS2[m][1]) {
\r
190 errln("Bad offset returned by " + TESTZONES[i].getID() + " at "
\r
191 + df.format(new Date(MILLIS[m])) + "(wall/STD/STD) - Got: "
\r
192 + offsets[0] + "/" + offsets[1]
\r
193 + " Expected: " + OFFSETS2[m][0] + "/" + OFFSETS2[m][1]);
\r
198 // Test getOffsetFromLocal(long time, int nonExistingTimeOpt, int duplicatedTimeOpt, int[] offsets)
\r
199 // with nonExistingTimeOpt = LOCAL_DST/duplicatedTimeOpt = LOCAL_DST
\r
200 for (int i = 0; i < TESTZONES.length; i++) {
\r
201 for (int m = 0; m < MILLIS.length; m++) {
\r
202 TESTZONES[i].getOffsetFromLocal(MILLIS[m], BasicTimeZone.LOCAL_DST, BasicTimeZone.LOCAL_DST, offsets);
\r
203 if (offsets[0] != OFFSETS3[m][0] || offsets[1] != OFFSETS3[m][1]) {
\r
204 errln("Bad offset returned by " + TESTZONES[i].getID() + " at "
\r
205 + df.format(new Date(MILLIS[m])) + "(wall/DST/DST) - Got: "
\r
206 + offsets[0] + "/" + offsets[1]
\r
207 + " Expected: " + OFFSETS3[m][0] + "/" + OFFSETS3[m][1]);
\r
212 // Test getOffsetFromLocal(long time, int nonExistingTimeOpt, int duplicatedTimeOpt, int[] offsets)
\r
213 // with nonExistingTimeOpt = LOCAL_FORMER/duplicatedTimeOpt = LOCAL_LATTER
\r
214 for (int i = 0; i < TESTZONES.length; i++) {
\r
215 for (int m = 0; m < MILLIS.length; m++) {
\r
216 TESTZONES[i].getOffsetFromLocal(MILLIS[m], BasicTimeZone.LOCAL_FORMER, BasicTimeZone.LOCAL_LATTER, offsets);
\r
217 if (offsets[0] != OFFSETS2[m][0] || offsets[1] != OFFSETS2[m][1]) {
\r
218 errln("Bad offset returned by " + TESTZONES[i].getID() + " at "
\r
219 + df.format(new Date(MILLIS[m])) + "(wall/FORMER/LATTER) - Got: "
\r
220 + offsets[0] + "/" + offsets[1]
\r
221 + " Expected: " + OFFSETS2[m][0] + "/" + OFFSETS2[m][1]);
\r
226 // Test getOffsetFromLocal(long time, int nonExistingTimeOpt, int duplicatedTimeOpt, int[] offsets)
\r
227 // with nonExistingTimeOpt = LOCAL_LATTER/duplicatedTimeOpt = LOCAL_FORMER
\r
228 for (int i = 0; i < TESTZONES.length; i++) {
\r
229 for (int m = 0; m < MILLIS.length; m++) {
\r
230 TESTZONES[i].getOffsetFromLocal(MILLIS[m], BasicTimeZone.LOCAL_LATTER, BasicTimeZone.LOCAL_FORMER, offsets);
\r
231 if (offsets[0] != OFFSETS3[m][0] || offsets[1] != OFFSETS3[m][1]) {
\r
232 errln("Bad offset returned by " + TESTZONES[i].getID() + " at "
\r
233 + df.format(new Date(MILLIS[m])) + "(wall/LATTER/FORMER) - Got: "
\r
234 + offsets[0] + "/" + offsets[1]
\r
235 + " Expected: " + OFFSETS3[m][0] + "/" + OFFSETS3[m][1]);
\r