RFR: 8299194: CustomTzIDCheckDST.java may fail at future date
Ichiroh Takiguchi
itakiguchi at openjdk.org
Wed Dec 21 16:05:25 UTC 2022
test/jdk/java/util/TimeZone/CustomTzIDCheckDST.java may fail at future date.
I used following standalone testcase
import java.util.Calendar;
import java.util.Date;
import java.util.SimpleTimeZone;
public class CheckDST {
private static String CUSTOM_TZ = "MEZ-1MESZ,M3.5.0,M10.5.0";
public static void main(String args[]) throws Throwable {
runTZTest();
}
/* TZ code will always be set to "MEZ-1MESZ,M3.5.0,M10.5.0".
* This ensures the transition periods for Daylights Savings should be at March's last
* Sunday and October's last Sunday.
*/
private static void runTZTest() {
Date time = new Date();
if (new SimpleTimeZone(3600000, "MEZ-1MESZ", Calendar.MARCH, -1, Calendar.SUNDAY, 0,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 0).inDaylightTime(time)) {
// We are in Daylight savings period.
if (time.toString().endsWith("GMT+02:00 " + Integer.toString(time.getYear() + 1900)))
return;
} else {
if (time.toString().endsWith("GMT+01:00 " + Integer.toString(time.getYear() + 1900)))
return;
}
// Reaching here means time zone did not match up as expected.
throw new RuntimeException("Got unexpected timezone information: " + time);
}
}
I tested CheckDST with faketime, then I got following results
$ TZ=GMT faketime -m "2023-03-25 22:59:59" env TZ="MEZ-1MESZ,M3.5.0,M10.5.0" $HOME/jdk-21-b02/bin/java CheckDST
$ TZ=GMT faketime -m "2023-03-25 23:00:00" env TZ="MEZ-1MESZ,M3.5.0,M10.5.0" $HOME/jdk-21-b02/bin/java CheckDST
Exception in thread "main" java.lang.RuntimeException: Got unexpected timezone information: Sun Mar 26 00:00:00 GMT+01:00 2023
at CheckDST.runTZTest(CheckDST.java:28)
at CheckDST.main(CheckDST.java:8)
I assume `TZ=MEZ-1MESZ`refers Europe/Berlin timezone.
In this case, `TZ` environment variable should be `MEZ-1MESZ,M3.5.0,M10.5.0/3` (`/3` is missing in testcase)
CustomTzIDCheckDST should run with daylight saving time.
Add Simulate Southern Hemisphere by `MEZ-1MESZ,M10.5.0,M3.5.0/3`
Tested by standalone testcase
$ cat CheckDST1.java
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
import java.time.DayOfWeek;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;
public class CheckDST1 {
// Northern Hemisphere
private static String CUSTOM_TZ = "MEZ-1MESZ,M3.5.0,M10.5.0/3";
// Simulate Southern Hemisphere
private static String CUSTOM_TZ2 = "MEZ-1MESZ,M10.5.0,M3.5.0/3";
public static void main(String args[]) throws Throwable {
runTZTest();
}
/* TZ code will always be set to "MEZ-1MESZ,M3.5.0,M10.5.0/3".
* This ensures the transition periods for Daylights Savings should be at March's last
* Sunday and October's last Sunday.
*/
private static void runTZTest() {
Date time = new Date();
String tzStr = System.getenv("TZ");
if (tzStr == null)
throw new RuntimeException("Got unexpected timezone information: TZ is null");
boolean nor = tzStr.matches(".*,M3\..*,M10\..*");
TimeZone tz = new SimpleTimeZone(3600000, tzStr,
nor ? Calendar.MARCH : Calendar.OCTOBER, -1,
Calendar.SUNDAY, 3600000, SimpleTimeZone.UTC_TIME,
nor ? Calendar.OCTOBER : Calendar.MARCH, -1,
Calendar.SUNDAY, 3600000, SimpleTimeZone.UTC_TIME,
3600000);
System.out.println(time);
if (tz.inDaylightTime(time)) {
// We are in Daylight savings period.
if (time.toString().endsWith("GMT+02:00 " + Integer.toString(time.getYear() + 1900)))
return;
} else {
if (time.toString().endsWith("GMT+01:00 " + Integer.toString(time.getYear() + 1900)))
return;
}
// Reaching here means time zone did not match up as expected.
throw new RuntimeException("Got unexpected timezone information: " + tzStr + " " + time);
}
private static ZonedDateTime getLastSundayOfMonth(ZonedDateTime date) {
return date.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
}
}
Check Europe/Berlin timezone settings
$ zdump -v Europe/Berlin | grep 2023
Europe/Berlin Sun Mar 26 00:59:59 2023 UTC = Sun Mar 26 01:59:59 2023 CET isdst=0 gmtoff=3600
Europe/Berlin Sun Mar 26 01:00:00 2023 UTC = Sun Mar 26 03:00:00 2023 CEST isdst=1 gmtoff=7200
Europe/Berlin Sun Oct 29 00:59:59 2023 UTC = Sun Oct 29 02:59:59 2023 CEST isdst=1 gmtoff=7200
Europe/Berlin Sun Oct 29 01:00:00 2023 UTC = Sun Oct 29 02:00:00 2023 CET isdst=0 gmtoff=3600
Test results are as follows:
Northern Hemisphere side
$ TZ=GMT faketime -m '2023-03-26 00:59:59' env TZ=MEZ-1MESZ,M3.5.0,M10.5.0/3 date
Sun Mar 26 01:59:59 MEZ 2023
$ TZ=GMT faketime -m '2023-03-26 00:59:59' env TZ=MEZ-1MESZ,M3.5.0,M10.5.0/3 java CheckDST1
Sun Mar 26 01:59:59 GMT+01:00 2023
$ TZ=GMT faketime -m '2023-03-26 01:00:00' env TZ=MEZ-1MESZ,M3.5.0,M10.5.0/3 date
Sun Mar 26 03:00:00 MESZ 2023
$ TZ=GMT faketime -m '2023-03-26 01:00:00' env TZ=MEZ-1MESZ,M3.5.0,M10.5.0/3 java CheckDST1
Sun Mar 26 03:00:00 GMT+02:00 2023
$ TZ=GMT faketime -m '2023-10-29 00:59:59' env TZ=MEZ-1MESZ,M3.5.0,M10.5.0/3 date
Sun Oct 29 02:59:59 MESZ 2023
$ TZ=GMT faketime -m '2023-10-29 00:59:59' env TZ=MEZ-1MESZ,M3.5.0,M10.5.0/3 java CheckDST1
Sun Oct 29 02:59:59 GMT+02:00 2023
$ TZ=GMT faketime -m '2023-10-29 01:00:00' env TZ=MEZ-1MESZ,M3.5.0,M10.5.0/3 date
Sun Oct 29 02:00:00 MEZ 2023
$ TZ=GMT faketime -m '2023-10-29 01:00:00' env TZ=MEZ-1MESZ,M3.5.0,M10.5.0/3 java CheckDST1
Sun Oct 29 02:00:00 GMT+01:00 2023
Southern Hemisphere
$ TZ=GMT faketime -m '2023-03-26 00:59:59' env TZ=MEZ-1MESZ,M10.5.0,M3.5.0/3 date
Sun Mar 26 02:59:59 MESZ 2023
$bTZ=GMT faketime -m '2023-03-26 00:59:59' env TZ=MEZ-1MESZ,M10.5.0,M3.5.0/3 java CheckDST1
Sun Mar 26 02:59:59 GMT+02:00 2023
$ TZ=GMT faketime -m '2023-03-26 01:00:00' env TZ=MEZ-1MESZ,M10.5.0,M3.5.0/3 date
Sun Mar 26 02:00:00 MEZ 2023
$ TZ=GMT faketime -m '2023-03-26 01:00:00' env TZ=MEZ-1MESZ,M10.5.0,M3.5.0/3 java CheckDST1
Sun Mar 26 02:00:00 GMT+01:00 2023
$ TZ=GMT faketime -m '2023-10-29 00:59:59' env TZ=MEZ-1MESZ,M10.5.0,M3.5.0/3 date
Sun Oct 29 01:59:59 MEZ 2023
$ TZ=GMT faketime -m '2023-10-29 00:59:59' env TZ=MEZ-1MESZ,M10.5.0,M3.5.0/3 java CheckDST1
Sun Oct 29 01:59:59 GMT+01:00 2023
$ TZ=GMT faketime -m '2023-10-29 01:00:00' env TZ=MEZ-1MESZ,M10.5.0,M3.5.0/3 date
Sun Oct 29 03:00:00 MESZ 2023
$ TZ=GMT faketime -m '2023-10-29 01:00:00' env TZ=MEZ-1MESZ,M10.5.0,M3.5.0/3 java CheckDST1
Sun Oct 29 03:00:00 GMT+02:00 2023
-------------
Commit messages:
- 8299194: CustomTzIDCheckDST.java may fail at future date
Changes: https://git.openjdk.org/jdk/pull/11756/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=11756&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8299194
Stats: 21 lines in 1 file changed: 16 ins; 0 del; 5 mod
Patch: https://git.openjdk.org/jdk/pull/11756.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/11756/head:pull/11756
PR: https://git.openjdk.org/jdk/pull/11756
More information about the core-libs-dev
mailing list