Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IsDaylightSavingTime_CasablancaMultiYearDaylightSavings fails on rhel.8 #42192

Open
tmds opened this issue Oct 29, 2019 · 30 comments · Fixed by dotnet/runtime#458
Open

IsDaylightSavingTime_CasablancaMultiYearDaylightSavings fails on rhel.8 #42192

tmds opened this issue Oct 29, 2019 · 30 comments · Fixed by dotnet/runtime#458

Comments

@tmds
Copy link
Member

@tmds tmds commented Oct 29, 2019

We have an internal CI server that does daily builds of corefx on rhel.8.
Since 24 sept, System.Runtime.Tests is failing on IsDaylightSavingTime_CasablancaMultiYearDaylightSavings.

I haven't looked further into this yet.

  pushd /home/tester/corefx/artifacts/bin/System.Runtime.Tests/netcoreapp-Unix-Debug
  /home/tester/corefx/artifacts/bin/testhost/netcoreapp-Linux-Debug-x64/dotnet exec --runtimeconfig System.Runtime.Tests.runtimeconfig.json xunit.console.dll System.Runtime.Tests.dll -xml testResults.xml -nologo -notrait category=nonnetcoreapptests -notrait category=nonlinuxtests -notrait category=IgnoreForCI -notrait category=OuterLoop -notrait category=failing 
  popd
  ===========================================================================================================
  ~/corefx/artifacts/bin/System.Runtime.Tests/netcoreapp-Unix-Debug ~/corefx/src/System.Runtime/tests
  �[37m  Discovering: System.Runtime.Tests (method display = ClassAndMethod, method display options = None)
  �[m�[37m  Discovered:  System.Runtime.Tests (found 5372 of 5419 test cases)
  �[m�[37m  Starting:    System.Runtime.Tests (parallel test collections = on, max threads = 4)
  �[m�[33;1m    System.Tests.DateTimeOffsetTests.ToLocalTime_MaxValue [SKIP]
  �[m�[37m      Condition(s) not met: "IsMaxValuePositiveLocalOffset"
      System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(dateTimeString: "1940-02-25T00:00:00.0000000Z", expectedDST: True, expectedOffsetString: "1:00:00") [FAIL]
      System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(dateTimeString: "1940-11-20T00:00:00.0000000Z", expectedDST: True, expectedOffsetString: "1:00:00") [FAIL]
      System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(dateTimeString: "1940-12-31T23:59:59.0000000Z", expectedDST: True, expectedOffsetString: "1:00:00") [FAIL]
      System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(dateTimeString: "1941-01-01T00:00:00.0000000Z", expectedDST: True, expectedOffsetString: "1:00:00") [FAIL]
      System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(dateTimeString: "1945-02-24T12:00:00.0000000Z", expectedDST: True, expectedOffsetString: "1:00:00") [FAIL]
      System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(dateTimeString: "1945-11-17T01:00:00.0000000Z", expectedDST: True, expectedOffsetString: "1:00:00") [FAIL]
      System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(dateTimeString: "1945-11-17T22:59:59.0000000Z", expectedDST: True, expectedOffsetString: "1:00:00") [FAIL]
  �[m�[31;1m�[m�[37m      Test with the zone Africa/Casablanca and date 2/25/1940 12:00:00 AM failed
  �[m�[37m      Expected: True
  �[m�[37m      Actual:   False
  �[m�[30;1m      Stack Trace:
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(2361,0): at System.Tests.TimeZoneInfoTests.VerifyDST(TimeZoneInfo tz, DateTime dt, Boolean expectedDST)
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(1743,0): at System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(String dateTimeString, Boolean expectedDST, String expectedOffsetString)
  �[m�[31;1m�[m�[37m      Test with the zone Africa/Casablanca and date 11/20/1940 12:00:00 AM failed
  �[m�[37m      Expected: True
  �[m�[37m      Actual:   False
  �[m�[30;1m      Stack Trace:
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(2361,0): at System.Tests.TimeZoneInfoTests.VerifyDST(TimeZoneInfo tz, DateTime dt, Boolean expectedDST)
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(1743,0): at System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(String dateTimeString, Boolean expectedDST, String expectedOffsetString)
  �[m�[31;1m�[m�[37m      Test with the zone Africa/Casablanca and date 12/31/1940 11:59:59 PM failed
  �[m�[37m      Expected: True
  �[m�[37m      Actual:   False
  �[m�[30;1m      Stack Trace:
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(2361,0): at System.Tests.TimeZoneInfoTests.VerifyDST(TimeZoneInfo tz, DateTime dt, Boolean expectedDST)
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(1743,0): at System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(String dateTimeString, Boolean expectedDST, String expectedOffsetString)
  �[m�[31;1m�[m�[37m      Test with the zone Africa/Casablanca and date 1/1/1941 12:00:00 AM failed
  �[m�[37m      Expected: True
  �[m�[37m      Actual:   False
  �[m�[30;1m      Stack Trace:
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(2361,0): at System.Tests.TimeZoneInfoTests.VerifyDST(TimeZoneInfo tz, DateTime dt, Boolean expectedDST)
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(1743,0): at System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(String dateTimeString, Boolean expectedDST, String expectedOffsetString)
  �[m�[31;1m�[m�[37m      Test with the zone Africa/Casablanca and date 2/24/1945 12:00:00 PM failed
  �[m�[37m      Expected: True
  �[m�[37m      Actual:   False
  �[m�[30;1m      Stack Trace:
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(2361,0): at System.Tests.TimeZoneInfoTests.VerifyDST(TimeZoneInfo tz, DateTime dt, Boolean expectedDST)
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(1743,0): at System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(String dateTimeString, Boolean expectedDST, String expectedOffsetString)
  �[m�[31;1m�[m�[37m      Test with the zone Africa/Casablanca and date 11/17/1945 1:00:00 AM failed
  �[m�[37m      Expected: True
  �[m�[37m      Actual:   False
  �[m�[30;1m      Stack Trace:
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(2361,0): at System.Tests.TimeZoneInfoTests.VerifyDST(TimeZoneInfo tz, DateTime dt, Boolean expectedDST)
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(1743,0): at System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(String dateTimeString, Boolean expectedDST, String expectedOffsetString)
  �[m�[31;1m�[m�[37m      Test with the zone Africa/Casablanca and date 11/17/1945 10:59:59 PM failed
  �[m�[37m      Expected: True
  �[m�[37m      Actual:   False
  �[m�[30;1m      Stack Trace:
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(2361,0): at System.Tests.TimeZoneInfoTests.VerifyDST(TimeZoneInfo tz, DateTime dt, Boolean expectedDST)
  �[m�[37m        /home/tester/corefx/src/System.Runtime/tests/System/TimeZoneInfoTests.cs(1743,0): at System.Tests.TimeZoneInfoTests.IsDaylightSavingTime_CasablancaMultiYearDaylightSavings(String dateTimeString, Boolean expectedDST, String expectedOffsetString)
  �[m�[33;1m    System.Tests.DateTimeOffsetTests.ToLocalTime_MinValue [SKIP]
  �[m�[37m      Condition(s) not met: "IsMinValueNegativeLocalOffset"
  �[m�[33;1m    System.Tests.DateTimeOffsetTests.ToLocalTime_Ambiguous [SKIP]
  �[m�[37m      Condition(s) not met: "IsPacificTime"
  �[m�[33;1m    System.Tests.ArgIteratorTests.ArgIterator_GetNextArgType [SKIP]
  �[m�[37m      Condition(s) not met: "IsArgIteratorSupported"
  �[m�[33;1m    System.Tests.ArgIteratorTests.ArgIterator_GetRemainingCount_GetNextArg [SKIP]
  �[m�[37m      Condition(s) not met: "IsArgIteratorSupported"
  �[m�[37m  Finished:    System.Runtime.Tests
  �[m�[37m=== TEST EXECUTION SUMMARY ===
  �[m�[37m   System.Runtime.Tests  Total: 34299, Errors: 0, Failed: 7, Skipped: 5, Time: 13.603s

cc @omajid @RheaAyase

@bartonjs

This comment has been minimized.

Copy link
Member

@bartonjs bartonjs commented Oct 29, 2019

FYI @tarekgh

@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Oct 29, 2019

@tmds could you please send the output of the following command on the failing machine?

zdump Africa/Casablanca

CC @eerhardt

@tarekgh tarekgh added this to the 5.0 milestone Oct 29, 2019
@tmds

This comment has been minimized.

Copy link
Member Author

@tmds tmds commented Oct 30, 2019

zdump Africa/Casablanca

Africa/Casablanca  Wed Oct 30 15:48:23 2019 +01
@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Oct 30, 2019

I can look into this.

@tmds - I assume they also fail on CentOS 8? Or is this only on RHEL 8?

@eerhardt eerhardt self-assigned this Oct 30, 2019
@tmds

This comment has been minimized.

Copy link
Member Author

@tmds tmds commented Oct 30, 2019

@tmds - I assume they also fail on CentOS 8? Or is this only on RHEL 8?

@eerhardt they should, but I haven't tried.

@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Oct 30, 2019

I tried Centos 8 and I am not seeing the problem there. I used net core 3.0 to check it. And the time zone data looks good to me too:

/usr/share/zoneinfo/Africa/Casablanca  Sat Feb 24 23:59:59 1940 UT = Sat Feb 24 23:59:59 1940 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca  Sun Feb 25 00:00:00 1940 UT = Sun Feb 25 01:00:00 1940 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Nov 17 22:59:59 1945 UT = Sat Nov 17 23:59:59 1945 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Nov 17 23:00:00 1945 UT = Sat Nov 17 23:00:00 1945 +00 isdst=0 gmtoff=0

@tmds could you please try to dump the whole zone data in your machine?

zdump -v /usr/share/zoneinfo/Africa/Casablanca
[root@b56b4b44ded3 netcoreapp]# lsb_release -d
Description:    CentOS Linux release 8.0.1905 (Core)
@omajid

This comment has been minimized.

Copy link
Member

@omajid omajid commented Oct 30, 2019

Might be useful to know the package version of the tzdata package on RHEL 8 vs CentOS 8 too: rpm -q tzdata.

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Oct 30, 2019

From my centos:8 docker image I have: tzdata-2019a-1.el8.noarch.

I also compared these dates to an Ubuntu 18 image I have, and zdump -v /usr/share/zoneinfo/Africa/Casablanca looks the same for both from 1940 to 1950.

centos:8:

/usr/share/zoneinfo/Africa/Casablanca  Sat Feb 24 23:59:59 1940 UT = Sat Feb 24 23:59:59 1940 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca  Sun Feb 25 00:00:00 1940 UT = Sun Feb 25 01:00:00 1940 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Nov 17 22:59:59 1945 UT = Sat Nov 17 23:59:59 1945 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Nov 17 23:00:00 1945 UT = Sat Nov 17 23:00:00 1945 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca  Sat Jun 10 23:59:59 1950 UT = Sat Jun 10 23:59:59 1950 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca  Sun Jun 11 00:00:00 1950 UT = Sun Jun 11 01:00:00 1950 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Oct 28 22:59:59 1950 UT = Sat Oct 28 23:59:59 1950 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Oct 28 23:00:00 1950 UT = Sat Oct 28 23:00:00 1950 +00 isdst=0 gmtoff=0

Ubuntu 18:

/usr/share/zoneinfo/Africa/Casablanca  Sat Feb 24 23:59:59 1940 UT = Sat Feb 24 23:59:59 1940 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca  Sun Feb 25 00:00:00 1940 UT = Sun Feb 25 01:00:00 1940 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Nov 17 22:59:59 1945 UT = Sat Nov 17 23:59:59 1945 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Nov 17 23:00:00 1945 UT = Sat Nov 17 23:00:00 1945 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca  Sat Jun 10 23:59:59 1950 UT = Sat Jun 10 23:59:59 1950 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca  Sun Jun 11 00:00:00 1950 UT = Sun Jun 11 01:00:00 1950 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Oct 28 22:59:59 1950 UT = Sat Oct 28 23:59:59 1950 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca  Sat Oct 28 23:00:00 1950 UT = Sat Oct 28 23:00:00 1950 +00 isdst=0 gmtoff=0

I did however notice a difference in more recent years (around 2018-2019) between the two, but this appears to be because of updates in the tzdata itself, and that shouldn't have caused this test to fail.

@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Nov 1, 2019

@tmds do you have any update?

@tmds

This comment has been minimized.

Copy link
Member Author

@tmds tmds commented Nov 4, 2019

zdump -v /usr/share/zoneinfo/Africa/Casablanca

/usr/share/zoneinfo/Africa/Casablanca -9223372036854775808 = NULL
/usr/share/zoneinfo/Africa/Casablanca -9223372036854689408 = NULL
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 26 00:30:19 1913 UT = Sat Oct 25 23:59:59 1913 LMT isdst=0 gmtoff=-1820
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 26 00:30:20 1913 UT = Sun Oct 26 00:30:20 1913 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Mon Sep 11 23:59:59 1939 UT = Mon Sep 11 23:59:59 1939 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Tue Sep 12 00:00:00 1939 UT = Tue Sep 12 01:00:00 1939 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Nov 18 22:59:59 1939 UT = Sat Nov 18 23:59:59 1939 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Nov 18 23:00:00 1939 UT = Sat Nov 18 23:00:00 1939 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Feb 24 23:59:59 1940 UT = Sat Feb 24 23:59:59 1940 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 25 00:00:00 1940 UT = Sun Feb 25 01:00:00 1940 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Nov 17 22:59:59 1945 UT = Sat Nov 17 23:59:59 1945 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Nov 17 23:00:00 1945 UT = Sat Nov 17 23:00:00 1945 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Jun 10 23:59:59 1950 UT = Sat Jun 10 23:59:59 1950 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 11 00:00:00 1950 UT = Sun Jun 11 01:00:00 1950 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Oct 28 22:59:59 1950 UT = Sat Oct 28 23:59:59 1950 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Oct 28 23:00:00 1950 UT = Sat Oct 28 23:00:00 1950 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Jun 3 11:59:59 1967 UT = Sat Jun 3 11:59:59 1967 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Jun 3 12:00:00 1967 UT = Sat Jun 3 13:00:00 1967 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Sep 30 22:59:59 1967 UT = Sat Sep 30 23:59:59 1967 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Sep 30 23:00:00 1967 UT = Sat Sep 30 23:00:00 1967 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 23 23:59:59 1974 UT = Sun Jun 23 23:59:59 1974 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Mon Jun 24 00:00:00 1974 UT = Mon Jun 24 01:00:00 1974 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Aug 31 22:59:59 1974 UT = Sat Aug 31 23:59:59 1974 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Aug 31 23:00:00 1974 UT = Sat Aug 31 23:00:00 1974 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Fri Apr 30 23:59:59 1976 UT = Fri Apr 30 23:59:59 1976 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat May 1 00:00:00 1976 UT = Sat May 1 01:00:00 1976 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Jul 31 22:59:59 1976 UT = Sat Jul 31 23:59:59 1976 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Jul 31 23:00:00 1976 UT = Sat Jul 31 23:00:00 1976 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Apr 30 23:59:59 1977 UT = Sat Apr 30 23:59:59 1977 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 1 00:00:00 1977 UT = Sun May 1 01:00:00 1977 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Tue Sep 27 22:59:59 1977 UT = Tue Sep 27 23:59:59 1977 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Tue Sep 27 23:00:00 1977 UT = Tue Sep 27 23:00:00 1977 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Wed May 31 23:59:59 1978 UT = Wed May 31 23:59:59 1978 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Thu Jun 1 00:00:00 1978 UT = Thu Jun 1 01:00:00 1978 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Thu Aug 3 22:59:59 1978 UT = Thu Aug 3 23:59:59 1978 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Thu Aug 3 23:00:00 1978 UT = Thu Aug 3 23:00:00 1978 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Thu Mar 15 23:59:59 1984 UT = Thu Mar 15 23:59:59 1984 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Fri Mar 16 00:00:00 1984 UT = Fri Mar 16 01:00:00 1984 +01 isdst=0 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Tue Dec 31 22:59:59 1985 UT = Tue Dec 31 23:59:59 1985 +01 isdst=0 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Tue Dec 31 23:00:00 1985 UT = Tue Dec 31 23:00:00 1985 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat May 31 23:59:59 2008 UT = Sat May 31 23:59:59 2008 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 1 00:00:00 2008 UT = Sun Jun 1 01:00:00 2008 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 31 22:59:59 2008 UT = Sun Aug 31 23:59:59 2008 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 31 23:00:00 2008 UT = Sun Aug 31 23:00:00 2008 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 31 23:59:59 2009 UT = Sun May 31 23:59:59 2009 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Mon Jun 1 00:00:00 2009 UT = Mon Jun 1 01:00:00 2009 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Thu Aug 20 22:59:59 2009 UT = Thu Aug 20 23:59:59 2009 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Thu Aug 20 23:00:00 2009 UT = Thu Aug 20 23:00:00 2009 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat May 1 23:59:59 2010 UT = Sat May 1 23:59:59 2010 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 2 00:00:00 2010 UT = Sun May 2 01:00:00 2010 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Aug 7 22:59:59 2010 UT = Sat Aug 7 23:59:59 2010 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Aug 7 23:00:00 2010 UT = Sat Aug 7 23:00:00 2010 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Apr 2 23:59:59 2011 UT = Sat Apr 2 23:59:59 2011 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 3 00:00:00 2011 UT = Sun Apr 3 01:00:00 2011 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Jul 30 22:59:59 2011 UT = Sat Jul 30 23:59:59 2011 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Jul 30 23:00:00 2011 UT = Sat Jul 30 23:00:00 2011 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 29 01:59:59 2012 UT = Sun Apr 29 01:59:59 2012 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 29 02:00:00 2012 UT = Sun Apr 29 03:00:00 2012 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Fri Jul 20 01:59:59 2012 UT = Fri Jul 20 02:59:59 2012 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Fri Jul 20 02:00:00 2012 UT = Fri Jul 20 02:00:00 2012 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Mon Aug 20 01:59:59 2012 UT = Mon Aug 20 01:59:59 2012 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Mon Aug 20 02:00:00 2012 UT = Mon Aug 20 03:00:00 2012 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 30 01:59:59 2012 UT = Sun Sep 30 02:59:59 2012 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 30 02:00:00 2012 UT = Sun Sep 30 02:00:00 2012 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 28 01:59:59 2013 UT = Sun Apr 28 01:59:59 2013 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 28 02:00:00 2013 UT = Sun Apr 28 03:00:00 2013 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 7 01:59:59 2013 UT = Sun Jul 7 02:59:59 2013 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 7 02:00:00 2013 UT = Sun Jul 7 02:00:00 2013 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Aug 10 01:59:59 2013 UT = Sat Aug 10 01:59:59 2013 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Aug 10 02:00:00 2013 UT = Sat Aug 10 03:00:00 2013 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 27 01:59:59 2013 UT = Sun Oct 27 02:59:59 2013 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 27 02:00:00 2013 UT = Sun Oct 27 02:00:00 2013 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 30 01:59:59 2014 UT = Sun Mar 30 01:59:59 2014 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 30 02:00:00 2014 UT = Sun Mar 30 03:00:00 2014 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Jun 28 01:59:59 2014 UT = Sat Jun 28 02:59:59 2014 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sat Jun 28 02:00:00 2014 UT = Sat Jun 28 02:00:00 2014 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Aug 2 01:59:59 2014 UT = Sat Aug 2 01:59:59 2014 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sat Aug 2 02:00:00 2014 UT = Sat Aug 2 03:00:00 2014 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 26 01:59:59 2014 UT = Sun Oct 26 02:59:59 2014 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 26 02:00:00 2014 UT = Sun Oct 26 02:00:00 2014 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 29 01:59:59 2015 UT = Sun Mar 29 01:59:59 2015 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 29 02:00:00 2015 UT = Sun Mar 29 03:00:00 2015 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 14 01:59:59 2015 UT = Sun Jun 14 02:59:59 2015 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 14 02:00:00 2015 UT = Sun Jun 14 02:00:00 2015 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 19 01:59:59 2015 UT = Sun Jul 19 01:59:59 2015 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 19 02:00:00 2015 UT = Sun Jul 19 03:00:00 2015 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 25 01:59:59 2015 UT = Sun Oct 25 02:59:59 2015 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 25 02:00:00 2015 UT = Sun Oct 25 02:00:00 2015 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 27 01:59:59 2016 UT = Sun Mar 27 01:59:59 2016 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 27 02:00:00 2016 UT = Sun Mar 27 03:00:00 2016 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 5 01:59:59 2016 UT = Sun Jun 5 02:59:59 2016 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 5 02:00:00 2016 UT = Sun Jun 5 02:00:00 2016 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 10 01:59:59 2016 UT = Sun Jul 10 01:59:59 2016 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 10 02:00:00 2016 UT = Sun Jul 10 03:00:00 2016 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 30 01:59:59 2016 UT = Sun Oct 30 02:59:59 2016 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 30 02:00:00 2016 UT = Sun Oct 30 02:00:00 2016 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 26 01:59:59 2017 UT = Sun Mar 26 01:59:59 2017 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 26 02:00:00 2017 UT = Sun Mar 26 03:00:00 2017 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 21 01:59:59 2017 UT = Sun May 21 02:59:59 2017 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 21 02:00:00 2017 UT = Sun May 21 02:00:00 2017 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 2 01:59:59 2017 UT = Sun Jul 2 01:59:59 2017 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 2 02:00:00 2017 UT = Sun Jul 2 03:00:00 2017 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 29 01:59:59 2017 UT = Sun Oct 29 02:59:59 2017 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 29 02:00:00 2017 UT = Sun Oct 29 02:00:00 2017 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 25 01:59:59 2018 UT = Sun Mar 25 01:59:59 2018 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 25 02:00:00 2018 UT = Sun Mar 25 03:00:00 2018 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 13 01:59:59 2018 UT = Sun May 13 02:59:59 2018 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 13 02:00:00 2018 UT = Sun May 13 02:00:00 2018 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 17 01:59:59 2018 UT = Sun Jun 17 01:59:59 2018 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 17 02:00:00 2018 UT = Sun Jun 17 03:00:00 2018 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 5 01:59:59 2019 UT = Sun May 5 02:59:59 2019 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 5 02:00:00 2019 UT = Sun May 5 02:00:00 2019 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 9 01:59:59 2019 UT = Sun Jun 9 01:59:59 2019 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 9 02:00:00 2019 UT = Sun Jun 9 03:00:00 2019 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 19 01:59:59 2020 UT = Sun Apr 19 02:59:59 2020 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 19 02:00:00 2020 UT = Sun Apr 19 02:00:00 2020 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 24 01:59:59 2020 UT = Sun May 24 01:59:59 2020 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 24 02:00:00 2020 UT = Sun May 24 03:00:00 2020 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 11 01:59:59 2021 UT = Sun Apr 11 02:59:59 2021 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 11 02:00:00 2021 UT = Sun Apr 11 02:00:00 2021 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 16 01:59:59 2021 UT = Sun May 16 01:59:59 2021 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 16 02:00:00 2021 UT = Sun May 16 03:00:00 2021 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 27 01:59:59 2022 UT = Sun Mar 27 02:59:59 2022 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 27 02:00:00 2022 UT = Sun Mar 27 02:00:00 2022 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 8 01:59:59 2022 UT = Sun May 8 01:59:59 2022 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 8 02:00:00 2022 UT = Sun May 8 03:00:00 2022 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 19 01:59:59 2023 UT = Sun Mar 19 02:59:59 2023 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 19 02:00:00 2023 UT = Sun Mar 19 02:00:00 2023 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 23 01:59:59 2023 UT = Sun Apr 23 01:59:59 2023 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 23 02:00:00 2023 UT = Sun Apr 23 03:00:00 2023 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 10 01:59:59 2024 UT = Sun Mar 10 02:59:59 2024 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 10 02:00:00 2024 UT = Sun Mar 10 02:00:00 2024 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 14 01:59:59 2024 UT = Sun Apr 14 01:59:59 2024 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 14 02:00:00 2024 UT = Sun Apr 14 03:00:00 2024 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 23 01:59:59 2025 UT = Sun Feb 23 02:59:59 2025 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 23 02:00:00 2025 UT = Sun Feb 23 02:00:00 2025 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 6 01:59:59 2025 UT = Sun Apr 6 01:59:59 2025 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 6 02:00:00 2025 UT = Sun Apr 6 03:00:00 2025 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 15 01:59:59 2026 UT = Sun Feb 15 02:59:59 2026 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 15 02:00:00 2026 UT = Sun Feb 15 02:00:00 2026 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 22 01:59:59 2026 UT = Sun Mar 22 01:59:59 2026 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 22 02:00:00 2026 UT = Sun Mar 22 03:00:00 2026 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 7 01:59:59 2027 UT = Sun Feb 7 02:59:59 2027 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 7 02:00:00 2027 UT = Sun Feb 7 02:00:00 2027 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 14 01:59:59 2027 UT = Sun Mar 14 01:59:59 2027 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 14 02:00:00 2027 UT = Sun Mar 14 03:00:00 2027 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 23 01:59:59 2028 UT = Sun Jan 23 02:59:59 2028 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 23 02:00:00 2028 UT = Sun Jan 23 02:00:00 2028 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 27 01:59:59 2028 UT = Sun Feb 27 01:59:59 2028 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 27 02:00:00 2028 UT = Sun Feb 27 03:00:00 2028 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 14 01:59:59 2029 UT = Sun Jan 14 02:59:59 2029 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 14 02:00:00 2029 UT = Sun Jan 14 02:00:00 2029 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 18 01:59:59 2029 UT = Sun Feb 18 01:59:59 2029 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 18 02:00:00 2029 UT = Sun Feb 18 03:00:00 2029 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 30 01:59:59 2029 UT = Sun Dec 30 02:59:59 2029 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 30 02:00:00 2029 UT = Sun Dec 30 02:00:00 2029 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 10 01:59:59 2030 UT = Sun Feb 10 01:59:59 2030 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 10 02:00:00 2030 UT = Sun Feb 10 03:00:00 2030 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 22 01:59:59 2030 UT = Sun Dec 22 02:59:59 2030 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 22 02:00:00 2030 UT = Sun Dec 22 02:00:00 2030 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 26 01:59:59 2031 UT = Sun Jan 26 01:59:59 2031 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 26 02:00:00 2031 UT = Sun Jan 26 03:00:00 2031 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 14 01:59:59 2031 UT = Sun Dec 14 02:59:59 2031 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 14 02:00:00 2031 UT = Sun Dec 14 02:00:00 2031 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 18 01:59:59 2032 UT = Sun Jan 18 01:59:59 2032 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 18 02:00:00 2032 UT = Sun Jan 18 03:00:00 2032 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 28 01:59:59 2032 UT = Sun Nov 28 02:59:59 2032 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 28 02:00:00 2032 UT = Sun Nov 28 02:00:00 2032 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 9 01:59:59 2033 UT = Sun Jan 9 01:59:59 2033 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 9 02:00:00 2033 UT = Sun Jan 9 03:00:00 2033 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 20 01:59:59 2033 UT = Sun Nov 20 02:59:59 2033 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 20 02:00:00 2033 UT = Sun Nov 20 02:00:00 2033 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 25 01:59:59 2033 UT = Sun Dec 25 01:59:59 2033 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 25 02:00:00 2033 UT = Sun Dec 25 03:00:00 2033 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 5 01:59:59 2034 UT = Sun Nov 5 02:59:59 2034 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 5 02:00:00 2034 UT = Sun Nov 5 02:00:00 2034 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 17 01:59:59 2034 UT = Sun Dec 17 01:59:59 2034 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 17 02:00:00 2034 UT = Sun Dec 17 03:00:00 2034 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 28 01:59:59 2035 UT = Sun Oct 28 02:59:59 2035 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 28 02:00:00 2035 UT = Sun Oct 28 02:00:00 2035 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 2 01:59:59 2035 UT = Sun Dec 2 01:59:59 2035 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 2 02:00:00 2035 UT = Sun Dec 2 03:00:00 2035 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 19 01:59:59 2036 UT = Sun Oct 19 02:59:59 2036 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 19 02:00:00 2036 UT = Sun Oct 19 02:00:00 2036 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 23 01:59:59 2036 UT = Sun Nov 23 01:59:59 2036 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 23 02:00:00 2036 UT = Sun Nov 23 03:00:00 2036 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 4 01:59:59 2037 UT = Sun Oct 4 02:59:59 2037 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 4 02:00:00 2037 UT = Sun Oct 4 02:00:00 2037 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 15 01:59:59 2037 UT = Sun Nov 15 01:59:59 2037 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 15 02:00:00 2037 UT = Sun Nov 15 03:00:00 2037 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 26 01:59:59 2038 UT = Sun Sep 26 02:59:59 2038 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 26 02:00:00 2038 UT = Sun Sep 26 02:00:00 2038 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 31 01:59:59 2038 UT = Sun Oct 31 01:59:59 2038 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 31 02:00:00 2038 UT = Sun Oct 31 03:00:00 2038 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 18 01:59:59 2039 UT = Sun Sep 18 02:59:59 2039 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 18 02:00:00 2039 UT = Sun Sep 18 02:00:00 2039 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 23 01:59:59 2039 UT = Sun Oct 23 01:59:59 2039 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 23 02:00:00 2039 UT = Sun Oct 23 03:00:00 2039 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 2 01:59:59 2040 UT = Sun Sep 2 02:59:59 2040 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 2 02:00:00 2040 UT = Sun Sep 2 02:00:00 2040 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 14 01:59:59 2040 UT = Sun Oct 14 01:59:59 2040 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 14 02:00:00 2040 UT = Sun Oct 14 03:00:00 2040 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 25 01:59:59 2041 UT = Sun Aug 25 02:59:59 2041 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 25 02:00:00 2041 UT = Sun Aug 25 02:00:00 2041 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 29 01:59:59 2041 UT = Sun Sep 29 01:59:59 2041 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 29 02:00:00 2041 UT = Sun Sep 29 03:00:00 2041 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 10 01:59:59 2042 UT = Sun Aug 10 02:59:59 2042 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 10 02:00:00 2042 UT = Sun Aug 10 02:00:00 2042 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 21 01:59:59 2042 UT = Sun Sep 21 01:59:59 2042 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 21 02:00:00 2042 UT = Sun Sep 21 03:00:00 2042 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 2 01:59:59 2043 UT = Sun Aug 2 02:59:59 2043 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 2 02:00:00 2043 UT = Sun Aug 2 02:00:00 2043 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 6 01:59:59 2043 UT = Sun Sep 6 01:59:59 2043 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 6 02:00:00 2043 UT = Sun Sep 6 03:00:00 2043 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 24 01:59:59 2044 UT = Sun Jul 24 02:59:59 2044 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 24 02:00:00 2044 UT = Sun Jul 24 02:00:00 2044 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 28 01:59:59 2044 UT = Sun Aug 28 01:59:59 2044 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 28 02:00:00 2044 UT = Sun Aug 28 03:00:00 2044 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 9 01:59:59 2045 UT = Sun Jul 9 02:59:59 2045 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 9 02:00:00 2045 UT = Sun Jul 9 02:00:00 2045 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 20 01:59:59 2045 UT = Sun Aug 20 01:59:59 2045 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 20 02:00:00 2045 UT = Sun Aug 20 03:00:00 2045 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 1 01:59:59 2046 UT = Sun Jul 1 02:59:59 2046 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 1 02:00:00 2046 UT = Sun Jul 1 02:00:00 2046 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 5 01:59:59 2046 UT = Sun Aug 5 01:59:59 2046 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 5 02:00:00 2046 UT = Sun Aug 5 03:00:00 2046 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 23 01:59:59 2047 UT = Sun Jun 23 02:59:59 2047 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 23 02:00:00 2047 UT = Sun Jun 23 02:00:00 2047 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 28 01:59:59 2047 UT = Sun Jul 28 01:59:59 2047 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 28 02:00:00 2047 UT = Sun Jul 28 03:00:00 2047 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 7 01:59:59 2048 UT = Sun Jun 7 02:59:59 2048 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 7 02:00:00 2048 UT = Sun Jun 7 02:00:00 2048 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 19 01:59:59 2048 UT = Sun Jul 19 01:59:59 2048 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 19 02:00:00 2048 UT = Sun Jul 19 03:00:00 2048 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 30 01:59:59 2049 UT = Sun May 30 02:59:59 2049 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 30 02:00:00 2049 UT = Sun May 30 02:00:00 2049 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 4 01:59:59 2049 UT = Sun Jul 4 01:59:59 2049 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 4 02:00:00 2049 UT = Sun Jul 4 03:00:00 2049 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 15 01:59:59 2050 UT = Sun May 15 02:59:59 2050 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 15 02:00:00 2050 UT = Sun May 15 02:00:00 2050 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 26 01:59:59 2050 UT = Sun Jun 26 01:59:59 2050 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 26 02:00:00 2050 UT = Sun Jun 26 03:00:00 2050 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 7 01:59:59 2051 UT = Sun May 7 02:59:59 2051 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 7 02:00:00 2051 UT = Sun May 7 02:00:00 2051 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 11 01:59:59 2051 UT = Sun Jun 11 01:59:59 2051 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 11 02:00:00 2051 UT = Sun Jun 11 03:00:00 2051 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 28 01:59:59 2052 UT = Sun Apr 28 02:59:59 2052 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 28 02:00:00 2052 UT = Sun Apr 28 02:00:00 2052 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 2 01:59:59 2052 UT = Sun Jun 2 01:59:59 2052 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 2 02:00:00 2052 UT = Sun Jun 2 03:00:00 2052 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 13 01:59:59 2053 UT = Sun Apr 13 02:59:59 2053 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 13 02:00:00 2053 UT = Sun Apr 13 02:00:00 2053 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 25 01:59:59 2053 UT = Sun May 25 01:59:59 2053 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 25 02:00:00 2053 UT = Sun May 25 03:00:00 2053 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 5 01:59:59 2054 UT = Sun Apr 5 02:59:59 2054 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 5 02:00:00 2054 UT = Sun Apr 5 02:00:00 2054 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 10 01:59:59 2054 UT = Sun May 10 01:59:59 2054 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 10 02:00:00 2054 UT = Sun May 10 03:00:00 2054 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 28 01:59:59 2055 UT = Sun Mar 28 02:59:59 2055 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 28 02:00:00 2055 UT = Sun Mar 28 02:00:00 2055 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 2 01:59:59 2055 UT = Sun May 2 01:59:59 2055 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 2 02:00:00 2055 UT = Sun May 2 03:00:00 2055 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 12 01:59:59 2056 UT = Sun Mar 12 02:59:59 2056 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 12 02:00:00 2056 UT = Sun Mar 12 02:00:00 2056 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 23 01:59:59 2056 UT = Sun Apr 23 01:59:59 2056 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 23 02:00:00 2056 UT = Sun Apr 23 03:00:00 2056 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 4 01:59:59 2057 UT = Sun Mar 4 02:59:59 2057 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 4 02:00:00 2057 UT = Sun Mar 4 02:00:00 2057 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 8 01:59:59 2057 UT = Sun Apr 8 01:59:59 2057 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 8 02:00:00 2057 UT = Sun Apr 8 03:00:00 2057 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 17 01:59:59 2058 UT = Sun Feb 17 02:59:59 2058 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 17 02:00:00 2058 UT = Sun Feb 17 02:00:00 2058 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 31 01:59:59 2058 UT = Sun Mar 31 01:59:59 2058 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 31 02:00:00 2058 UT = Sun Mar 31 03:00:00 2058 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 9 01:59:59 2059 UT = Sun Feb 9 02:59:59 2059 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 9 02:00:00 2059 UT = Sun Feb 9 02:00:00 2059 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 16 01:59:59 2059 UT = Sun Mar 16 01:59:59 2059 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 16 02:00:00 2059 UT = Sun Mar 16 03:00:00 2059 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 1 01:59:59 2060 UT = Sun Feb 1 02:59:59 2060 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 1 02:00:00 2060 UT = Sun Feb 1 02:00:00 2060 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 7 01:59:59 2060 UT = Sun Mar 7 01:59:59 2060 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 7 02:00:00 2060 UT = Sun Mar 7 03:00:00 2060 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 16 01:59:59 2061 UT = Sun Jan 16 02:59:59 2061 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 16 02:00:00 2061 UT = Sun Jan 16 02:00:00 2061 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 27 01:59:59 2061 UT = Sun Feb 27 01:59:59 2061 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 27 02:00:00 2061 UT = Sun Feb 27 03:00:00 2061 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 8 01:59:59 2062 UT = Sun Jan 8 02:59:59 2062 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 8 02:00:00 2062 UT = Sun Jan 8 02:00:00 2062 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 12 01:59:59 2062 UT = Sun Feb 12 01:59:59 2062 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 12 02:00:00 2062 UT = Sun Feb 12 03:00:00 2062 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 31 01:59:59 2062 UT = Sun Dec 31 02:59:59 2062 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 31 02:00:00 2062 UT = Sun Dec 31 02:00:00 2062 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 4 01:59:59 2063 UT = Sun Feb 4 01:59:59 2063 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Feb 4 02:00:00 2063 UT = Sun Feb 4 03:00:00 2063 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 16 01:59:59 2063 UT = Sun Dec 16 02:59:59 2063 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 16 02:00:00 2063 UT = Sun Dec 16 02:00:00 2063 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 20 01:59:59 2064 UT = Sun Jan 20 01:59:59 2064 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 20 02:00:00 2064 UT = Sun Jan 20 03:00:00 2064 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 7 01:59:59 2064 UT = Sun Dec 7 02:59:59 2064 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 7 02:00:00 2064 UT = Sun Dec 7 02:00:00 2064 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 11 01:59:59 2065 UT = Sun Jan 11 01:59:59 2065 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 11 02:00:00 2065 UT = Sun Jan 11 03:00:00 2065 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 22 01:59:59 2065 UT = Sun Nov 22 02:59:59 2065 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 22 02:00:00 2065 UT = Sun Nov 22 02:00:00 2065 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 3 01:59:59 2066 UT = Sun Jan 3 01:59:59 2066 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jan 3 02:00:00 2066 UT = Sun Jan 3 03:00:00 2066 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 14 01:59:59 2066 UT = Sun Nov 14 02:59:59 2066 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 14 02:00:00 2066 UT = Sun Nov 14 02:00:00 2066 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 19 01:59:59 2066 UT = Sun Dec 19 01:59:59 2066 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 19 02:00:00 2066 UT = Sun Dec 19 03:00:00 2066 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 6 01:59:59 2067 UT = Sun Nov 6 02:59:59 2067 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 6 02:00:00 2067 UT = Sun Nov 6 02:00:00 2067 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 11 01:59:59 2067 UT = Sun Dec 11 01:59:59 2067 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 11 02:00:00 2067 UT = Sun Dec 11 03:00:00 2067 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 21 01:59:59 2068 UT = Sun Oct 21 02:59:59 2068 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 21 02:00:00 2068 UT = Sun Oct 21 02:00:00 2068 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 2 01:59:59 2068 UT = Sun Dec 2 01:59:59 2068 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Dec 2 02:00:00 2068 UT = Sun Dec 2 03:00:00 2068 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 13 01:59:59 2069 UT = Sun Oct 13 02:59:59 2069 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 13 02:00:00 2069 UT = Sun Oct 13 02:00:00 2069 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 17 01:59:59 2069 UT = Sun Nov 17 01:59:59 2069 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 17 02:00:00 2069 UT = Sun Nov 17 03:00:00 2069 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 5 01:59:59 2070 UT = Sun Oct 5 02:59:59 2070 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 5 02:00:00 2070 UT = Sun Oct 5 02:00:00 2070 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 9 01:59:59 2070 UT = Sun Nov 9 01:59:59 2070 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Nov 9 02:00:00 2070 UT = Sun Nov 9 03:00:00 2070 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 20 01:59:59 2071 UT = Sun Sep 20 02:59:59 2071 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 20 02:00:00 2071 UT = Sun Sep 20 02:00:00 2071 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 25 01:59:59 2071 UT = Sun Oct 25 01:59:59 2071 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 25 02:00:00 2071 UT = Sun Oct 25 03:00:00 2071 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 11 01:59:59 2072 UT = Sun Sep 11 02:59:59 2072 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 11 02:00:00 2072 UT = Sun Sep 11 02:00:00 2072 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 16 01:59:59 2072 UT = Sun Oct 16 01:59:59 2072 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 16 02:00:00 2072 UT = Sun Oct 16 03:00:00 2072 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 27 01:59:59 2073 UT = Sun Aug 27 02:59:59 2073 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 27 02:00:00 2073 UT = Sun Aug 27 02:00:00 2073 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 8 01:59:59 2073 UT = Sun Oct 8 01:59:59 2073 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Oct 8 02:00:00 2073 UT = Sun Oct 8 03:00:00 2073 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 19 01:59:59 2074 UT = Sun Aug 19 02:59:59 2074 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 19 02:00:00 2074 UT = Sun Aug 19 02:00:00 2074 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 23 01:59:59 2074 UT = Sun Sep 23 01:59:59 2074 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 23 02:00:00 2074 UT = Sun Sep 23 03:00:00 2074 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 11 01:59:59 2075 UT = Sun Aug 11 02:59:59 2075 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 11 02:00:00 2075 UT = Sun Aug 11 02:00:00 2075 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 15 01:59:59 2075 UT = Sun Sep 15 01:59:59 2075 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 15 02:00:00 2075 UT = Sun Sep 15 03:00:00 2075 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 26 01:59:59 2076 UT = Sun Jul 26 02:59:59 2076 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 26 02:00:00 2076 UT = Sun Jul 26 02:00:00 2076 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 6 01:59:59 2076 UT = Sun Sep 6 01:59:59 2076 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Sep 6 02:00:00 2076 UT = Sun Sep 6 03:00:00 2076 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 18 01:59:59 2077 UT = Sun Jul 18 02:59:59 2077 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 18 02:00:00 2077 UT = Sun Jul 18 02:00:00 2077 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 22 01:59:59 2077 UT = Sun Aug 22 01:59:59 2077 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 22 02:00:00 2077 UT = Sun Aug 22 03:00:00 2077 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 10 01:59:59 2078 UT = Sun Jul 10 02:59:59 2078 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 10 02:00:00 2078 UT = Sun Jul 10 02:00:00 2078 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 14 01:59:59 2078 UT = Sun Aug 14 01:59:59 2078 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Aug 14 02:00:00 2078 UT = Sun Aug 14 03:00:00 2078 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 25 01:59:59 2079 UT = Sun Jun 25 02:59:59 2079 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 25 02:00:00 2079 UT = Sun Jun 25 02:00:00 2079 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 30 01:59:59 2079 UT = Sun Jul 30 01:59:59 2079 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 30 02:00:00 2079 UT = Sun Jul 30 03:00:00 2079 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 16 01:59:59 2080 UT = Sun Jun 16 02:59:59 2080 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 16 02:00:00 2080 UT = Sun Jun 16 02:00:00 2080 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 21 01:59:59 2080 UT = Sun Jul 21 01:59:59 2080 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 21 02:00:00 2080 UT = Sun Jul 21 03:00:00 2080 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 1 01:59:59 2081 UT = Sun Jun 1 02:59:59 2081 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 1 02:00:00 2081 UT = Sun Jun 1 02:00:00 2081 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 13 01:59:59 2081 UT = Sun Jul 13 01:59:59 2081 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jul 13 02:00:00 2081 UT = Sun Jul 13 03:00:00 2081 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 24 01:59:59 2082 UT = Sun May 24 02:59:59 2082 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 24 02:00:00 2082 UT = Sun May 24 02:00:00 2082 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 28 01:59:59 2082 UT = Sun Jun 28 01:59:59 2082 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 28 02:00:00 2082 UT = Sun Jun 28 03:00:00 2082 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 16 01:59:59 2083 UT = Sun May 16 02:59:59 2083 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun May 16 02:00:00 2083 UT = Sun May 16 02:00:00 2083 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 20 01:59:59 2083 UT = Sun Jun 20 01:59:59 2083 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 20 02:00:00 2083 UT = Sun Jun 20 03:00:00 2083 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 30 01:59:59 2084 UT = Sun Apr 30 02:59:59 2084 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 30 02:00:00 2084 UT = Sun Apr 30 02:00:00 2084 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 11 01:59:59 2084 UT = Sun Jun 11 01:59:59 2084 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun Jun 11 02:00:00 2084 UT = Sun Jun 11 03:00:00 2084 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 22 01:59:59 2085 UT = Sun Apr 22 02:59:59 2085 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 22 02:00:00 2085 UT = Sun Apr 22 02:00:00 2085 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 27 01:59:59 2085 UT = Sun May 27 01:59:59 2085 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 27 02:00:00 2085 UT = Sun May 27 03:00:00 2085 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 14 01:59:59 2086 UT = Sun Apr 14 02:59:59 2086 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Apr 14 02:00:00 2086 UT = Sun Apr 14 02:00:00 2086 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 19 01:59:59 2086 UT = Sun May 19 01:59:59 2086 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 19 02:00:00 2086 UT = Sun May 19 03:00:00 2086 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 30 01:59:59 2087 UT = Sun Mar 30 02:59:59 2087 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca Sun Mar 30 02:00:00 2087 UT = Sun Mar 30 02:00:00 2087 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 4 01:59:59 2087 UT = Sun May 4 01:59:59 2087 +00 isdst=0 gmtoff=0
/usr/share/zoneinfo/Africa/Casablanca Sun May 4 02:00:00 2087 UT = Sun May 4 03:00:00 2087 +01 isdst=1 gmtoff=3600
/usr/share/zoneinfo/Africa/Casablanca 9223372036854689407 = NULL
/usr/share/zoneinfo/Africa/Casablanca 9223372036854775807 = NULL

rpm -q tzdata

tzdata-2019c-1.el8.noarch
@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Nov 4, 2019

@tmds the data looks good there.

could you please try to run the test manually on that machine and look if it fail? otherwise we'll need to try to get a local repro to investigate.

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Nov 4, 2019

I think I was able to repro this issue using a RHEL 8 docker image, and updating it to tzdata-2019c-1.el8.noarch. It appears we are having trouble with parsing the Casablanca tzfile, in particular the "futureTransitionsPosixFormat" string. Since we are throwing an exception trying to make the AdjustmentRules, TimeZoneInfo is falling back to disabling daylight savings time here:

try
{
return new TimeZoneInfo(rawData, id, dstDisabled: false); // create a TimeZoneInfo instance from the TZif data w/ DST support
}
catch (ArgumentException) { }
catch (InvalidTimeZoneException) { }
try
{
return new TimeZoneInfo(rawData, id, dstDisabled: true); // create a TimeZoneInfo instance from the TZif data w/o DST support
}
catch (ArgumentException) { }
catch (InvalidTimeZoneException) { }

Then, the returned TimeZoneInfo instance doesn't have any AdjustmentRules - thus all DST is turned off.

The reason the exception is being thrown is because we can't parse the futureTransitionsPosixFormat string. On my machine the string looks like:

<+00>0<+01>,0/0,J365/25

The troublesome part is that 0/0 right in the middle. According to http://man7.org/linux/man-pages/man3/tzset.3.html,

   n      This specifies the zero-based Julian day with n between 0 and 365.  February 29 is counted in leap years.

See this comment:

if (date[0] != 'J')
{
// should be n Julian day format which we don't support.
//
// This specifies the Julian day, with n between 0 and 365. February 29 is counted in leap years.
//
// n would be a relative number from the begining of the year. which should handle if the
// the year is a leap year or not.
//
// In leap year, n would be counted as:
//
// 0 30 31 59 60 90 335 365
// |-------Jan--------|-------Feb--------|-------Mar--------|....|-------Dec--------|
//
// while in non leap year we'll have
//
// 0 30 31 58 59 89 334 364
// |-------Jan--------|-------Feb--------|-------Mar--------|....|-------Dec--------|
//
//
// For example if n is specified as 60, this means in leap year the rule will start at Mar 1,
// while in non leap year the rule will start at Mar 2.
//
// If we need to support n format, we'll have to have a floating adjustment rule support this case.
throw new InvalidTimeZoneException(SR.InvalidTimeZone_NJulianDayNotSupported);

A potential spot-fix for this exact scenario would be to support n where n < 59. As long as the date isn't past Feb 28, we are able to model this TransitionTime with our current design.

Also related to #29192

Attaching the Africa/Casablanca file from my RHEL 8 machine:
Casablanca.zip

@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Nov 4, 2019

@eerhardt can't we fully support this by adding some flag (or value inside the transition time) telling it is not fixed date rule and it need a calculation of the day?

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Nov 4, 2019

Yes, that will be the full-blown fix. It would be more expensive though, as we would have to take into account serialization, and if we want to expose it as a new API or not.

@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Nov 4, 2019

Serialization need more work anyway to fix the reported issue especially on Linux. I am still thinking what is the best way to fix that (which mainly fixing TZI.GetAdjustmentRules()).

I agree with you if we can have a quick fix now for this Moroccan TZ issue as I am guessing this problem will show up on all Linux distros when upgrading to the new TZ data I guess.

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Nov 5, 2019

@tmds - so an interesting thing about 2019c is that I just built it from source on my Ubuntu box:

  1. https://github.com/eggert/tz/tree/2019c
  2. make TOPDIR=$HOME/tzdir install

Looking at the ~/tzdir/usr/share/zoneinfo/Africa/Casablanca file that is produced by that, I see it is different than the one I got from RedHat 8 after yum update tzdata.

image

On the left is the file from RedHat. On the right is the file I built locally. You can see the POSIX strings are different between the two files. The RedHat one has <+00>0<+01>,0/0,J365/25 while the locally built one doesn't.

@tmds @omajid - do you know why RedHat is different here?

@omajid

This comment has been minimized.

Copy link
Member

@omajid omajid commented Nov 5, 2019

@eerhardt Can you reproduce with:

make TOPDIR=$HOME/tzdir DATAFORM=rearguard install

If so, this is being caused by the 'rearguard' data format. I found some information in the NEWS file and some in this blog.

This looks like the commit that adds this Casablanca negative DST change: eggert/tz@8539a44

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Nov 5, 2019

Thanks @omajid, rearguard answered my question on why I was seeing different data. I was able to get the same as RedHat by building with DATAFORM=rearguard.

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Nov 5, 2019

For fixing this issue, I have 3 different changes in mind, and I am looking for opinions on how to proceed.

  1. A cheaper, targeted fix as explained above is to add support for the n format when n < 59 in the POSIX string. This can be done without changes to the underlying TransitionTime structure.
  2. A more thorough fix would be to update TransitionTime to support the n format fully. This may take some design work as the current struct looks like:
        public readonly struct TransitionTime
        {
            private readonly DateTime _timeOfDay;
            private readonly byte _month;
            private readonly byte _week;
            private readonly byte _day;
            private readonly DayOfWeek _dayOfWeek;
            private readonly bool _isFixedDateRule;

The issue with the n format is that it will include Feb 29 during leap years, and doesn't include Feb 29 in non leap years. So the n is the number of days from Jan 1 in that year when DST transitions. Given the above structure - byte month, byte week, byte day - we would have to add more data to this type (which is already at 16 bytes, so this could potentially be impacting performance). How exactly to change this structure isn't clear to me at this point.

No matter the decision on which route to take above, I think we should make the following change as well:

  1. In this case, we were able to successfully read all the TZ information until the year 2087, but then we threw that all away because we couldn't support the "future" POSIX string after the year 2087. And so DST was completely turned off for this time zone because we fell back to suppressing DST. We should change the logic such that, when we find out we can't support the "future" POSIX string, we should still return all the other DST rules that we parsed. That way datetimes before 2087 will be able to do DST transitions successfully. And only for datetimes after the last transition rule will DST be shut off if we can't support the "future" POSIX rule.

This bug could be "fixed" with just change (3) above. I think implementing that makes the most sense and that change could potentially be ported to 3.1 if we deemed it necessary. I was wondering what's people's opinions on (1) and (2) above? Would doing either of them make sense? Or should we skip those and just do (3)?

@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Nov 6, 2019

@eerhardt for number 2 can't we recycle some of the TransitionTime fields to be used for this case. I mean somehow we use specific value of one of the fields to indicate this is the type of the posix rule (e.g. negative month for example or some bigger month value like Max byte value) and then use the _day to store the value we read from the rule which indicate how many days from year start. do we need to store any other information?

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Nov 6, 2019

can't we recycle some of the TransitionTime fields to be used for this case

I can't think of a way to do that that wouldn't seem like a total hack and we would have to re-write our docs on this. It would totally change the meaning of these fields.

then use the _day to store the value we read from the rule

The rule can go from 0 to 365. _day is a byte, which can only store 256 values.


UPDATE:

Maybe one way to do this that wouldn't be a complete hack is to use this scheme:

_month = 0
_week = n / 7
_day = n % 7

In this scheme - month == 0 (today it goes from 1-12) would put us in this mode. And then week would mean which week in the current year DST switches (values from 0-52), and day would mean which day in that week.

So the biggest changes would be to allow month == 0 and then when month == 0 allow for week to go from 0-52. And then we would need to update all the places that inspect TransitionTime and update their usage.

@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Nov 6, 2019

I like the last idea you mentioned and I think wouldn't be too much to check all places we use TransitionTime to ensure handling breaking cases.

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Nov 6, 2019

Thanks, @tarekgh. How about this for a plan:

  1. To solve this bug (#42192), we implement fix (3) above. This change could potentially be back-ported to 3.1 if we see it we see a need for it.
  2. Separately we fix #29192 using the above idea, which only goes into .NET 5+. We will need to update docs to account for the new possible values of TransitionTime Month, Week, and Day. I don't think it would be reasonable to make that kind of change in a servicing release.
@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Nov 6, 2019

@eerhardt this is good plan. one question, do you think this posix format can show up in non future dates? just trying to know if we can hit this issue again with non future dates. In general, your plan is good and should put us in much better position handling this posix case. thanks for helping with it.

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Nov 6, 2019

The posix format only affects for datetimes after the last transition in the tzdata file.

// create the AdjustmentRule that will be used for all DateTimes after the last transition
// NOTE: index == dts.Length
DateTime startTransitionDate = dts[index - 1];
if (!string.IsNullOrEmpty(futureTransitionsPosixFormat))
{
AdjustmentRule? r = TZif_CreateAdjustmentRuleForPosixFormat(futureTransitionsPosixFormat, startTransitionDate, timeZoneBaseUtcOffset);

The last transition in the file may have been in the past, so it isn't guaranteed to be "in the future" from right now. But relative to all the transitions in the file, it is used for all "future" datetimes after those transitions.

@tarekgh

This comment has been minimized.

Copy link
Member

@tarekgh tarekgh commented Nov 6, 2019

This means there is a possibility we may service 3.1 with the bigger fix. At least for now we don't have to I guess.

@zhangjie0819

This comment has been minimized.

Copy link

@zhangjie0819 zhangjie0819 commented Nov 13, 2019

Hello, may I ask, is there a document indicating the meaning of each field in this binary time zone file?

@eerhardt

This comment has been minimized.

Copy link
Member

@eerhardt eerhardt commented Nov 13, 2019

@zhangjie0819

This comment has been minimized.

Copy link

@zhangjie0819 zhangjie0819 commented Nov 15, 2019

eerhardt added a commit to eerhardt/runtime that referenced this issue Dec 2, 2019
IsDaylightSavingTime_CasablancaMultiYearDaylightSavings fails on rhel.8

When parsing the tzdata POSIX string that contains an 'n' Julian date, we are currently throwing an exception, and then falling back to a TimeZoneInfo without DST enabled. However, this is a mistake because there are other DST transitions that were read from the tzdata file that are valid and usable. We shouldn't be throwing that information away.

So instead, we now skip the POSIX string if we detect an unsupported 'n' Julian date, and just use the last transition as the AdjustmentRule for all the DateTimes in the future. This way we can still make DST determinations correctly for some DateTimes.

Fix dotnet/corefx#42192
@danmosemsft

This comment has been minimized.

Copy link
Member

@danmosemsft danmosemsft commented Dec 5, 2019

reopening for possible backport

@danmosemsft danmosemsft reopened this Dec 5, 2019
@danmosemsft danmosemsft modified the milestones: 5.0, 3.1.x Dec 5, 2019
@eerhardt eerhardt reopened this Dec 5, 2019
eerhardt added a commit to eerhardt/coreclr that referenced this issue Dec 11, 2019
IsDaylightSavingTime_CasablancaMultiYearDaylightSavings fails on rhel.8

When parsing the tzdata POSIX string that contains an 'n' Julian date, we are currently throwing an exception, and then falling back to a TimeZoneInfo without DST enabled. However, this is a mistake because there are other DST transitions that were read from the tzdata file that are valid and usable. We shouldn't be throwing that information away.

So instead, we now skip the POSIX string if we detect an unsupported 'n' Julian date, and just use the last transition as the AdjustmentRule for all the DateTimes in the future. This way we can still make DST determinations correctly for some DateTimes.

Fix dotnet/corefx#42192
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
8 participants
You can’t perform that action at this time.