Miscalculation of a date using microseconds
Offen
Dieses Issue hat noch niemand übernommen.
Bug
Extension: date
Status: Needs Triage
- Vorherrschende Sprache
- C
- Sterne
- 40.4k
- Forks
- 8.1k
- Ø Merge
- 2 T. 13 Std.
- Gemergte PRs (30 T.)
- 96
Beschreibung
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
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
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.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- php
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 42/100