Wrong DateInterval when going from summer time to winter time
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.2k
- Merge medio
- 2 d 13 h
- PR fusionados (30 d)
- 96
Descripción
Description
The following code:
<?php
$timezone = new \DateTimeZone('Europe/Paris');
$periodStart = (new \DateTimeImmutable('2024-10-21'))->setTimezone($timezone)->setTime(00, 00, 00);
$periodEnd = (new \DateTimeImmutable('2024-10-27'))->setTimezone($timezone)->setTime(23, 59, 59);
var_dump($periodStart);
var_dump($periodEnd);
var_dump($timezone->getOffset($periodStart));
var_dump($timezone->getOffset($periodEnd));
var_dump($periodStart->diff($periodEnd)->format('%y years %m months %a days %H hours %I minutes %s seconds'));
Resulted in this output:
object(DateTimeImmutable)#2 (3) {
["date"]=>
string(26) "2024-10-21 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(12) "Europe/Paris"
}
object(DateTimeImmutable)#3 (3) {
["date"]=>
string(26) "2024-10-27 23:59:59.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(12) "Europe/Paris"
}
int(7200) // UTC+2
int(3600) // UTC+1
string(54) "0 years 0 months 6 days 23 hours 59 minutes 59 seconds"
But I expected this output instead:
object(DateTimeImmutable)#2 (3) {
["date"]=>
string(26) "2024-10-21 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(12) "Europe/Paris"
}
object(DateTimeImmutable)#3 (3) {
["date"]=>
string(26) "2024-10-27 23:59:59.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(12) "Europe/Paris"
}
int(7200)
int(3600)
string(54) "0 years 0 months 7 days 0 hours 59 minutes 59 seconds"
I did the same test using winter to summer time switch and the result is good.
<?php
$timezone = new \DateTimeZone('Europe/Paris');
$periodStart = (new \DateTimeImmutable('2024-03-25'))->setTimezone($timezone)->setTime(00, 00, 00);
$periodEnd = (new \DateTimeImmutable('2024-03-31'))->setTimezone($timezone)->setTime(23, 59, 59);
var_dump($periodStart);
var_dump($periodEnd);
var_dump($timezone->getOffset($periodStart));
var_dump($timezone->getOffset($periodEnd));
var_dump($periodStart->diff($periodEnd)->format('%y years %m months %a days %H hours %I minutes %s seconds'));
Output:
object(DateTimeImmutable)#2 (3) {
["date"]=>
string(26) "2024-03-25 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(12) "Europe/Paris"
}
object(DateTimeImmutable)#3 (3) {
["date"]=>
string(26) "2024-03-31 23:59:59.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(12) "Europe/Paris"
}
int(3600)
int(7200)
string(54) "0 years 0 months 6 days 22 hours 59 minutes 59 seconds"
3v4l.org links:
- Winter time to summer time: https://3v4l.org/AbF3B#v8.2.21 (good interval)
- Summer time to winter time: https://3v4l.org/5dsek#v8.2.21 (bad interval)
- Without DST transition: https://3v4l.org/eCGdj#v8.2.21 (same interval as summer to winter)
PHP Version
PHP 8.2.21 and up
Operating System
No response
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza ejecutando la reproducción proporcionada de DateTimeImmutable::diff para la transición de verano a invierno en Europe/Paris y compárala con el caso de invierno a verano. Rastrea el comportamiento de DateTimeImmutable::diff y el manejo relacionado de los offsets de DateTimeZone; se considera terminado cuando el intervalo coincide con la salida esperada indicada y los casos de transición siguen siendo correctos.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- php
- Área
- backend
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100