php / php/php-src

Wrong DateInterval when going from summer time to winter time

Aperta
#16,547 10 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Extension: date Status: Verified
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:

PHP Version

PHP 8.2.21 and up

Operating System

No response

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. 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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.