<i18n dev> Integrated: 8299194: CustomTzIDCheckDST.java may fail at future date

Ichiroh Takiguchi itakiguchi at openjdk.org
Thu Dec 22 21:09:53 UTC 2022


On Wed, 21 Dec 2022 15:57:29 GMT, Ichiroh Takiguchi <itakiguchi at openjdk.org> wrote:

> 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 side
> 
> $ 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

This pull request has now been integrated.

Changeset: 5e2de896
Author:    Ichiroh Takiguchi <itakiguchi at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/5e2de89628aaf6acb8e458fb417426ca5e477bea
Stats:     21 lines in 1 file changed: 16 ins; 0 del; 5 mod

8299194: CustomTzIDCheckDST.java may fail at future date

Reviewed-by: naoto

-------------

PR: https://git.openjdk.org/jdk/pull/11756


More information about the i18n-dev mailing list