Wrong result from DateTimeImmutable::diff
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- C
- Estrellas
- 40.4k
- Forks
- 8.1k
- Merge medio
- 2 d 13 h
- PR fusionados (30 d)
- 96
Descripción
Description
If you execute this code, it produces an extremely weird result. The first DTI is 11 minutes after what we’re ->diff() ’ing against, but when in the America/Los_Angeles TZ, it produces a very strange result. Converting the first DTI to UTC then produces the expected difference of 11 minutes.
//Difference of -1 year, 11 months, 31 days, etc.
<?php
$invalid_result = (new \DateTimeImmutable('2024-01-31 17:00:00', new \DateTimeZone('America/Los_Angeles')))
->diff(new \DateTimeImmutable('2024-02-01 00:49:00'));
//Difference of 11 minutes
$correct_result = (new \DateTimeImmutable('2024-01-31 17:00:00', new \DateTimeZone('America/Los_Angeles')))
->setTimezone(new \DateTimeZone('UTC'))
->diff(new \DateTimeImmutable('2024-02-01 00:49:00'));
var_dump($invalid_result);
var_dump($correct_result);
$invalid_result Resulted in this output:
object(DateInterval)#3 (10) {
["y"]=>
int(-1)
["m"]=>
int(11)
["d"]=>
int(31)
["h"]=>
int(0)
["i"]=>
int(11)
["s"]=>
int(0)
["f"]=>
float(0)
["invert"]=>
int(1)
["days"]=>
int(0)
["from_string"]=>
bool(false)
}
But I expected this output instead:
object(DateInterval)#2 (10) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(0)
["h"]=>
int(0)
["i"]=>
int(11)
["s"]=>
int(0)
["f"]=>
float(0)
["invert"]=>
int(1)
["days"]=>
int(0)
["from_string"]=>
bool(false)
}
PHP Version
PHP 8.1
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 reproduciendo el script proporcionado de PHP 8.1 y comparando DateTimeImmutable::diff con y sin setTimezone('UTC'). Rastrea el punto de entrada de DateTimeImmutable::diff y el manejo de la zona horaria; después, añade cobertura que demuestre que el caso America/Los_Angeles produce el intervalo esperado de 11 minutos.
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