Miscalculation of a date using microseconds
Aperta
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
The following code:
<?php
date_default_timezone_set("UTC");
$beginningOfYear = new \DateTimeImmutable('1st january this year')
->setTime(0, 0);
$endOfYear = new \DateTimeImmutable('31th december this year')
->setTime(23, 59, 59, 999999);
$uuThisYear = (int) $endOfYear->format('Uu') - (int) $beginningOfYear->format('Uu');
$sThisYear = (int) $endOfYear->format('U') - (int) $beginningOfYear->format('U');
$usThisYear = (int) $endOfYear->format('u') - (int) $beginningOfYear->format('u');
$uuThisYear2 = (int) ($sThisYear . $usThisYear);
echo "<pre>" . var_export([
'from' => $beginningOfYear,
'fromMs' => (int) $beginningOfYear->format('Uu'),
'to' => $endOfYear,
'toMs' => (int) $endOfYear->format('Uu'),
'nbMicrosecondsBetweenToAndFrom' => $uuThisYear,
'nbMicrosecondsBetweenToAndFromOtherCalculation' => $uuThisYear2,
'equal' => $uuThisYear === $uuThisYear2,
'nbSecondsBetweenToAndFrom' => $sThisYear,
'nbUsecondsBetweenToAndFrom' => $usThisYear,
'shouldEqualToFromButDoesntWork' => (clone $endOfYear)->modify('-' . $uuThisYear . ' µsec'),
'shouldEqualToFromWorks' => (clone $endOfYear)
->modify('-' . $sThisYear . ' seconds')
->modify('-' . $usThisYear . ' microseconds'),
], true);
Resulted in this output:
array (
'from' =>
\DateTimeImmutable::__set_state(array(
'date' => '2025-01-01 00:00:00.000000',
'timezone_type' => 3,
'timezone' => 'UTC',
)),
'fromMs' => 1735689600000000,
'to' =>
\DateTimeImmutable::__set_state(array(
'date' => '2025-12-31 23:59:59.999999',
'timezone_type' => 3,
'timezone' => 'UTC',
)),
'toMs' => 1767225599999999,
'nbMicrosecondsBetweenToAndFrom' => 31535999999999,
'nbMicrosecondsBetweenToAndFromOtherCalculation' => 31535999999999,
'equal' => true,
'nbSecondsBetweenToAndFrom' => 31535999,
'nbUsecondsBetweenToAndFrom' => 999999,
'shouldEqualToFromButDoesntWork' =>
\DateTimeImmutable::__set_state(array(
'date' => '2026-01-01 09:59:59.999998',
'timezone_type' => 3,
'timezone' => 'UTC',
)),
'shouldEqualToFromWorks' =>
\DateTimeImmutable::__set_state(array(
'date' => '2025-01-01 00:00:00.000000',
'timezone_type' => 3,
'timezone' => 'UTC',
)),
)
But I expected this output instead:
array (
'from' =>
\DateTimeImmutable::__set_state(array(
'date' => '2025-01-01 00:00:00.000000',
'timezone_type' => 3,
'timezone' => 'UTC',
)),
'fromMs' => 1735689600000000,
'to' =>
\DateTimeImmutable::__set_state(array(
'date' => '2025-12-31 23:59:59.999999',
'timezone_type' => 3,
'timezone' => 'UTC',
)),
'toMs' => 1767225599999999,
'nbMicrosecondsBetweenToAndFrom' => 31535999999999,
'nbMicrosecondsBetweenToAndFromOtherCalculation' => 31535999999999,
'equal' => true,
'nbSecondsBetweenToAndFrom' => 31535999,
'nbUsecondsBetweenToAndFrom' => 999999,
'shouldEqualToFromButDoesntWork' =>
\DateTimeImmutable::__set_state(array(
'date' => '2025-01-01 00:00:00.000000',
'timezone_type' => 3,
'timezone' => 'UTC',
)),
'shouldEqualToFromWorks' =>
\DateTimeImmutable::__set_state(array(
'date' => '2025-01-01 00:00:00.000000',
'timezone_type' => 3,
'timezone' => 'UTC',
)),
)
Check the "shouldEqualToFromButDoesntWork" value.
PHP Version
8.4.14
Operating System
Mint 22.2 Zara
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
Start by reproducing the DateTimeImmutable::modify('-... µsec') case from the issue on PHP 8.4.14, then trace the date/time implementation that handles microsecond modifiers. Compare it with the separate seconds-and-microseconds calls; done when the single microsecond subtraction produces the same 2025-01-01 00:00:00.000000 result.
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
- Specificata chiaramente
- Idoneità per principianti
- 42/100