Wrong DateInterval when going from summer time to winter time
Nessuno ha ancora preso questa issue.
- Lingua principale
- C
- Stelle
- 40.4k
- Fork
- 8.2k
- Merge medio
- 2g 13h
- PR unite (30g)
- 96
Descrizione
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
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 eseguendo la riproduzione fornita di DateTimeImmutable::diff per la transizione dall’ora legale all’ora solare in Europe/Paris e confrontala con il caso dall’ora solare all’ora legale. Traccia il comportamento di DateTimeImmutable::diff e la gestione correlata degli offset di DateTimeZone; il lavoro è completato quando l’intervallo corrisponde all’output atteso indicato e i casi di transizione rimangono corretti.
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