Skip to content

DateTimeImmutable (and DateTime) modify does not respect Daylight Saving Time shifts #15880

Open
@karptonite

Description

@karptonite

Description

The following code:

<?php
date_default_timezone_set("America/Chicago");

$startDate = new DateTimeImmutable( "2024-11-01" );
var_dump( $startDate );
$endDate = $startDate->modify( '+72 hour' );
var_dump($endDate);
$otherEndDate = $startDate->add( new DateInterval( 'PT72H' ) );
var_dump( $otherEndDate );

Resulted in this output:

object(DateTimeImmutable)#1 (3) {
  ["date"]=>
  string(26) "2024-11-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(15) "America/Chicago"
}
object(DateTimeImmutable)#2 (3) {
  ["date"]=>
  string(26) "2024-11-04 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(15) "America/Chicago"
}
object(DateTimeImmutable)#4 (3) {
  ["date"]=>
  string(26) "2024-11-03 23:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(15) "America/Chicago"
}

But I expected this output instead:

object(DateTimeImmutable)#1 (3) {
  ["date"]=>
  string(26) "2024-11-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(15) "America/Chicago"
}
object(DateTimeImmutable)#4 (3) {
  ["date"]=>
  string(26) "2024-11-03 23:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(15) "America/Chicago"
}
object(DateTimeImmutable)#4 (3) {
  ["date"]=>
  string(26) "2024-11-03 23:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(15) "America/Chicago"
}

Note that the from 11-1 to 11-4, Daylight Saving time ends. If you change the time by adding a DateInterval, it gets it right, but it gets it wrong with modify. Also note that if instead of adding 72 hours, you add 3 days, the inconsistency goes away--DateInterval understands, apparently, that one of those days is 25 hours, and adjusts correctly (at least, it seems correct to me) to Midnight on 11-4.

PHP Version

PHP 8.3

Operating System

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions