php / php/php-src

Respect timezone offset given after timezone name

Aperta
#16,276 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Extension: date Status: Needs Triage
Lingua principale
C
Stelle
40.4k
Fork
8.2k
Merge medio
2g 13h
PR unite (30g)
96

Descrizione

Description

Hello 👋 With the following code:

<?php
$date = new DateTime('2024-11-03 01:30:00 America/Toronto -0500');

echo $date->format('Y-m-d H:i:s e O');

Resulted in this output:

2024-11-03 01:30:00 America/Toronto -0400

https://3v4l.org/qg4aN

But I expected this output instead:

2024-11-03 01:30:00 America/Toronto -0500

Both exist, and it's possible to obtain the first with:

$date = new DateTime('@1730611800');
$date->setTimezone(new DateTimeZone('America/Toronto'));

As per the test above, it sounds like whatever offset coming after a named timezone like "America/Toronto" is ignored, so we can have the timezone set by name or by offset but we cannot have both while it's actually needed to distinguish 2 possibly different moments during DST such as Nov 3rd 1:30 -0400 and Nov 3rd 1:30 -0500 which both exist in America/Toronto.

A possible implementation would to:

  • Detect both named timezone and offset timezone,
  • if only one is present:
    • no change: keep current behavior
  • if both are present:
    • and the current date-time + timezone offset exist in the given timezone city
      • apply both
    • but the current date-time + timezone offset is invalid
      • ignore offset (i.e. current behavior)

Thanks 🙏

PHP Version

PHP 8.3.12 and also 8.4.0-dev (78767de197d1b2a6d2dd2757258b4c642bda8052)

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

Riproduci il comportamento con il costruttore DateTime usando il nome America/Toronto e l’offset -0500, quindi confrontalo con l’esempio con @timestamp e setTimezone. Traccia il punto di ingresso dell’analisi di data e ora e aggiungi la copertura per entrambi gli offset validi del 3 novembre 2024; il lavoro è completato quando l’offset esplicito viene rispettato se identifica un’ora locale esistente e il comportamento attuale rimane invariato per le combinazioni non valide.

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
34/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.