php / php/php-src

DateTimeZone->getTransitions can return first transition twice

Abierto
#18,051 0 comentarios 0 reacciones 1 asignado Ver en GitHub

@derickr ya está trabajando en esto.

Desde el 15/3/2025.

Bug Extension: date Status: Needs Triage
Lenguaje dominante
C
Estrellas
40.4k
Forks
8.1k
Merge medio
2 d 13 h
PR fusionados (30 d)
96

Descripción

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

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.