xp-framework / core

The XP Framework is an all-purpose, object oriented PHP framework.
Other
19 stars 6 forks source link

Timezone Europe/Berlin does not have DST transitions #268

Closed thekid closed 3 years ago

thekid commented 3 years ago

With a current PHP 8.1 build, we see these when running the date & time test suite.

PHP 8.0, expected result

$ xp -w 'use util\{Date, TimeZone}; $tz= new TimeZone("Europe/Berlin"); return $tz->previousTransition(Date::now())'
util.TimeZoneTransition@{
  transition at: 2021-03-28 03:00:00+0200
  transition to: 7200 (CEST), DST
}

PHP 8.1-dev, incorrect

$ xp -w 'use util\{Date, TimeZone}; $tz= new TimeZone("Europe/Berlin"); return $tz->previousTransition(Date::now())'
Uncaught exception: Exception lang.IllegalArgumentException (Timezone Europe/Berlin does not have DST transitions.)
# ...

$ xp -e 'phpinfo()' | head -8
phpinfo()
PHP Version => 8.1.0-dev

System => Windows NT SURFACE 10.0 build 19042 (Windows 10) AMD64
Build Date => Apr 16 2021 23:42:47
Build System => Microsoft Windows Server 2019 Datacenter [10.0.17763]
Compiler => Visual C++ 2019
Architecture => x64
thekid commented 3 years ago

Most probably related to php/php-src@091c0920b9db057a54dc43ece6e864bce6818d5e, which is a huge diff (52,924 additions and 29,617 deletions).

I've opened a PHP bug: https://bugs.php.net/bug.php?id=80963

thekid commented 3 years ago

Quoting from the bug:

This is a tricky one. The data format that the library uses has changed, and will now only contain a list of transitions up until the last time the rules changed.

For America/New_York, that was in 2007, and Europe/London, in 1996

thekid commented 3 years ago

The tests in question have been disabled for the time being by only running them with PHP up until 8.1.0-dev:

$ grep -Hirn -A 1 8.1.0-dev src/test/php/ | cut -d / -f 6-
unittest/util/CalendarTest.class.php:89:  #[Test, Action(eval: 'new RuntimeVersion("<8.1.0-dev")')]
unittest/util/CalendarTest.class.php-90-  public function testCalendarDSTBegin() {
--
unittest/util/CalendarTest.class.php:100:  #[Test, Action(eval: 'new RuntimeVersion("<8.1.0-dev")')]
unittest/util/CalendarTest.class.php-101-  public function testCalendarDSTBeginByDate() {
--
unittest/util/CalendarTest.class.php:111:  #[Test, Action(eval: 'new RuntimeVersion("<8.1.0-dev")')]
unittest/util/CalendarTest.class.php-112-  public function testCalendarDSTBeginUS() {
--
unittest/util/CalendarTest.class.php:121:  #[Test, Action(eval: 'new RuntimeVersion("<8.1.0-dev")')]
unittest/util/CalendarTest.class.php-122-  public function testCalendarDSTEnd() {
--
unittest/util/TimeZoneTest.class.php:43:  #[Test, Action(eval: 'new RuntimeVersion("<8.1.0-dev")')]
unittest/util/TimeZoneTest.class.php-44-  public function previousTransition() {
--
unittest/util/TimeZoneTest.class.php:52:  #[Test, Action(eval: 'new RuntimeVersion("<8.1.0-dev")')]
unittest/util/TimeZoneTest.class.php-53-  public function previousPreviousTransition() {
--
unittest/util/TimeZoneTest.class.php:62:  #[Test, Action(eval: 'new RuntimeVersion("<8.1.0-dev")')]
unittest/util/TimeZoneTest.class.php-63-  public function previousNextTransition() {
--
unittest/util/TimeZoneTest.class.php:72:  #[Test, Action(eval: 'new RuntimeVersion("<8.1.0-dev")')]
unittest/util/TimeZoneTest.class.php-73-  public function nextTransition() {
thekid commented 3 years ago

https://bugs.php.net/bug.php?id=80963 was closed on August 8th, retesting with current PHP verifies this once again works as expected.