php / php/php-src

DateTime::diff() miscounts hours in days where a DST transition happens

オープン
#18,393 コメント 4 件 リアクション 0 件 担当者 1 名 GitHub で見る

@derickr がすでに取り組んでいます。

2025年4月22日 から。

Bug Extension: date Status: Needs Triage
主要言語
C
スター
40.4k
フォーク
8.1k
平均マージ
2日 13時間
マージ済み PR(30日)
96

説明

Description

The following code:

<?php

$ref = new DateTime('2024-01-01 00:00:00', new DateTimeZone('Europe/Berlin'));
$t1 = new DateTime('2024-03-31 12:00:00', new DateTimeZone('Europe/Berlin'));
$t2 = new DateTime('2024-04-01 12:00:00', new DateTimeZone('Europe/Berlin'));
$t3 = new DateTime('2024-10-27 12:00:00', new DateTimeZone('Europe/Berlin'));
$t4 = new DateTime('2024-10-28 12:00:00', new DateTimeZone('Europe/Berlin'));

// DST start
$diff1 = $ref->diff($t1);
$diff2 = $ref->diff($t2);
// DST end
$diff3 = $ref->diff($t3);
$diff4 = $ref->diff($t4);

echo('DST start' . PHP_EOL);
var_dump($diff1->h, $diff2->h);

echo('DST end' . PHP_EOL);
var_dump($diff3->h, $diff4->h);

Resulted in this output:

DST start
int(11)
int(12)
DST end
int(12)
int(12)

But I expected this output instead:

DST start
int(12)
int(12)
DST end
int(12)
int(12)

https://3v4l.org/VkM09

As far as I understand it DateTime::diff() is supposed to count the time based on the local clock of a time zone.
But on the day of a forward time transition when DST starts (2024-03-31), DateTime::diff() only counts 11 hours when the time on the local clock is actually 12 o'clock.

This is also inconsistent with the day of a backwards time transition when DST ends (2024-10-27), where DateTime::diff() still counts 12 hours when actually 13 hours have elapsed.

This issue started with PHP version 8.1. Prior versions work correctly.

PHP Version

PHP 8.1.32 (cli) (built: Mar 13 2025 18:27:44) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.32, Copyright (c) Zend Technologies
with Zend OPcache v8.1.32, Copyright (c), by Zend Technologies

Operating System

Ubuntu 24.04.1

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。