<i18n dev> RFR: 8299194: CustomTzIDCheckDST.java may fail at future date [v2]

Naoto Sato naoto at openjdk.org
Thu Dec 22 17:29:52 UTC 2022


On Wed, 21 Dec 2022 23:21:42 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
>
> Ichiroh Takiguchi has updated the pull request incrementally with one additional commit since the last revision:
> 
>   8299194: CustomTzIDCheckDST.java may fail at future date

LGTM.

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

Marked as reviewed by naoto (Reviewer).

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


More information about the i18n-dev mailing list