Wrong result from DateTimeImmutable::diff
Nessuno ha ancora preso questa issue.
- Lingua principale
- C
- Stelle
- 40.4k
- Fork
- 8.1k
- Merge medio
- 2g 13h
- PR unite (30g)
- 96
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia riproducendo lo script PHP 8.1 fornito e confrontando DateTimeImmutable::diff con e senza setTimezone('UTC'). Traccia il punto di ingresso di DateTimeImmutable::diff e la gestione del fuso orario, quindi aggiungi una copertura che dimostri che il caso America/Los_Angeles produce l'intervallo previsto di 11 minuti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- php
- Ambito
- backend
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100