php / php/php-src

DateTime setISODate() results in wrong timestamp?

Aperta
#13,267 9 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.1k
Merge medio
2g 13h
PR unite (30g)
96

Descrizione

Description

I call every Monday a cronjob at 00:01. I want known the year and week from last week.

<?php
$dt = new DateTime('last week monday 00:00:01', new DateTimeZone('Europe/Berlin'));
$year = (int)$dt->format('Y');
$week = (int)$dt->format('W');

// After this, I call a second script with parameters ($year and $week) few times for different tasks

$dto = new DateTime();
$dto->setISODate($year, $week);

$fmt = new IntlDateFormatter('de_DE', IntlDateFormatter::NONE, IntlDateFormatter::NONE, 'Europe/Berlin');
$fmt->setPattern('LLL dd');

// Hint: $dto->getTimestamp() is the date a week ago, but with current time. So its always the time its called.

$week_start = $fmt->format($dto->getTimestamp());
$dto->modify('+6 days'); // for sunday
$week_end = $fmt->format($dto->getTimestamp());

echo $week_start . ' - ' . $week_end;

Resulted in this output:

Jan 23 - Jan 29

But I expected this output instead, for Timezone 'Europe/Berlin':

Jan 22 - Jan 28

The parameters $year and $week are only determined once. With these two values, the same script is called several times to create each time a graphic containing the date for the Monday and Sunday of the previous week. The script is called by a cronjob 00:01 every Monday. The graphics were created on the server at 00:01:23 and later. The script needs less than 1 second to create the graphics.

So I remove the images and call the script again ~9 o'clock and its shows me now the correct values "Jan 22 - Jan 28".
Is this a bug or am I doing something wrong here?

Because its worked for many years, but since 2024 its startet with wrong dates (one date shifted). Executed/Generated on:
✗ 03.01. wrong date for last week December.
✗ 08.01. again wrong date for first week January
15.01. shows the correct dates! "08 - 14"
22.01. shows the correct dates! "15 - 21"
✗ 29.01. again wrong date "23 - 29" must be "22 - 28"

So its strange.

Server timezone with timedatectl shows:

Local time: Mon 2024-01-29 10:53:00 CET
Universal time: Mon 2024-01-29 09:53:00 UTC
RTC time: Mon 2024-01-29 09:53:00
Time zone: Europe/Berlin (CET, +0100)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

PHP Version

PHP 8.2.15

Operating System

AlmaLinux 8.9

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 riproducendo lo script PHP 8.2.15 fornito relativo a DateTime::setISODate(), alla gestione del fuso orario e al valore dell’ora conservato. Confronta l’output del lunedì e della domenica negli orari di esecuzione indicati, quindi esamina l’implementazione e i test pertinenti relativi a data e ora. Il lavoro è completato quando si è stabilito se si tratta di un comportamento errato e si è aggiunto un test di regressione mirato oppure si è documentato l’utilizzo previsto.

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.