php / php/php-src

DateTimeZone->getTransitions can return first transition twice

Offen
#18,051 0 Kommentare 0 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

@derickr arbeitet bereits daran.

Seit 15.3.2025.

Bug Extension: date Status: Needs Triage
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.2k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

Description

If timestamp_begin is the exact timestamp of an existing transition the transition will be included twice in the resulting array.

The following code:

<?php

$tzBln = new DateTimeZone('Europe/Berlin');
var_dump($tzBln->getTransitions(922582799, 941331599)); // works
var_dump($tzBln->getTransitions(922582800, 941331600)); // first transition reported twice
var_dump($tzBln->getTransitions(922582801, 941331601)); // works

Resulted in this output:

array(2) {
  [0]=>
  array(5) {
    ["ts"]=>
    int(922582799)
    ["time"]=>
    string(25) "1999-03-28T00:59:59+00:00"
    ["offset"]=>
    int(3600)
    ["isdst"]=>
    bool(false)
    ["abbr"]=>
    string(3) "CET"
  }
  [1]=>
  array(5) {
    ["ts"]=>
    int(922582800)
    ["time"]=>
    string(25) "1999-03-28T01:00:00+00:00"
    ["offset"]=>
    int(7200)
    ["isdst"]=>
    bool(true)
    ["abbr"]=>
    string(4) "CEST"
  }
}
array(3) {
  [0]=>
  array(5) {
    ["ts"]=>
    int(922582800)
    ["time"]=>
    string(25) "1999-03-28T01:00:00+00:00"
    ["offset"]=>
    int(7200)
    ["isdst"]=>
    bool(true)
    ["abbr"]=>
    string(4) "CEST"
  }
  [1]=>
  array(5) {
    ["ts"]=>
    int(922582800)
    ["time"]=>
    string(25) "1999-03-28T01:00:00+00:00"
    ["offset"]=>
    int(7200)
    ["isdst"]=>
    bool(true)
    ["abbr"]=>
    string(4) "CEST"
  }
  [2]=>
  array(5) {
    ["ts"]=>
    int(941331600)
    ["time"]=>
    string(25) "1999-10-31T01:00:00+00:00"
    ["offset"]=>
    int(3600)
    ["isdst"]=>
    bool(false)
    ["abbr"]=>
    string(3) "CET"
  }
}
array(2) {
  [0]=>
  array(5) {
    ["ts"]=>
    int(922582801)
    ["time"]=>
    string(25) "1999-03-28T01:00:01+00:00"
    ["offset"]=>
    int(7200)
    ["isdst"]=>
    bool(true)
    ["abbr"]=>
    string(4) "CEST"
  }
  [1]=>
  array(5) {
    ["ts"]=>
    int(941331600)
    ["time"]=>
    string(25) "1999-10-31T01:00:00+00:00"
    ["offset"]=>
    int(3600)
    ["isdst"]=>
    bool(false)
    ["abbr"]=>
    string(3) "CET"
  }
}

But I expected this output instead:

array(2) {
  [0]=>
  array(5) {
    ["ts"]=>
    int(922582799)
    ["time"]=>
    string(25) "1999-03-28T00:59:59+00:00"
    ["offset"]=>
    int(3600)
    ["isdst"]=>
    bool(false)
    ["abbr"]=>
    string(3) "CET"
  }
  [1]=>
  array(5) {
    ["ts"]=>
    int(922582800)
    ["time"]=>
    string(25) "1999-03-28T01:00:00+00:00"
    ["offset"]=>
    int(7200)
    ["isdst"]=>
    bool(true)
    ["abbr"]=>
    string(4) "CEST"
  }
}
array(2) {
  [0]=>
  array(5) {
    ["ts"]=>
    int(922582800)
    ["time"]=>
    string(25) "1999-03-28T01:00:00+00:00"
    ["offset"]=>
    int(7200)
    ["isdst"]=>
    bool(true)
    ["abbr"]=>
    string(4) "CEST"
  }
  [1]=>
  array(5) {
    ["ts"]=>
    int(941331600)
    ["time"]=>
    string(25) "1999-10-31T01:00:00+00:00"
    ["offset"]=>
    int(3600)
    ["isdst"]=>
    bool(false)
    ["abbr"]=>
    string(3) "CET"
  }
}
array(2) {
  [0]=>
  array(5) {
    ["ts"]=>
    int(922582801)
    ["time"]=>
    string(25) "1999-03-28T01:00:01+00:00"
    ["offset"]=>
    int(7200)
    ["isdst"]=>
    bool(true)
    ["abbr"]=>
    string(4) "CEST"
  }
  [1]=>
  array(5) {
    ["ts"]=>
    int(941331600)
    ["time"]=>
    string(25) "1999-10-31T01:00:00+00:00"
    ["offset"]=>
    int(3600)
    ["isdst"]=>
    bool(false)
    ["abbr"]=>
    string(3) "CET"
  }
}
PHP Version

PHP 8.x

Operating System

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.