Skip to content

Commit d8bbfbc

Browse files
committed
Fix ZonedDateTime issue with DST
1 parent a458b62 commit d8bbfbc

2 files changed

Lines changed: 19 additions & 7 deletions

File tree

src/ZonedDateTime.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -482,39 +482,39 @@ public function plusMonths(int $months): ZonedDateTime
482482
*/
483483
public function plusWeeks(int $weeks): ZonedDateTime
484484
{
485-
return ZonedDateTime::of($this->localDateTime->plusWeeks($weeks), $this->timeZone);
485+
return ZonedDateTime::ofInstant($this->instant->plusDays($weeks * 7), $this->timeZone);
486486
}
487487

488488
/**
489489
* Returns a copy of this ZonedDateTime with the specified period in days added.
490490
*/
491491
public function plusDays(int $days): ZonedDateTime
492492
{
493-
return ZonedDateTime::of($this->localDateTime->plusDays($days), $this->timeZone);
493+
return ZonedDateTime::ofInstant($this->instant->plusDays($days), $this->timeZone);
494494
}
495495

496496
/**
497497
* Returns a copy of this ZonedDateTime with the specified period in hours added.
498498
*/
499499
public function plusHours(int $hours): ZonedDateTime
500500
{
501-
return ZonedDateTime::of($this->localDateTime->plusHours($hours), $this->timeZone);
501+
return ZonedDateTime::ofInstant($this->instant->plusHours($hours), $this->timeZone);
502502
}
503503

504504
/**
505505
* Returns a copy of this ZonedDateTime with the specified period in minutes added.
506506
*/
507507
public function plusMinutes(int $minutes): ZonedDateTime
508508
{
509-
return ZonedDateTime::of($this->localDateTime->plusMinutes($minutes), $this->timeZone);
509+
return ZonedDateTime::ofInstant($this->instant->plusMinutes($minutes), $this->timeZone);
510510
}
511511

512512
/**
513513
* Returns a copy of this ZonedDateTime with the specified period in seconds added.
514514
*/
515515
public function plusSeconds(int $seconds): ZonedDateTime
516516
{
517-
return ZonedDateTime::of($this->localDateTime->plusSeconds($seconds), $this->timeZone);
517+
return ZonedDateTime::ofInstant($this->instant->plusSeconds($seconds), $this->timeZone);
518518
}
519519

520520
/**

tests/ZonedDateTimeTest.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -669,9 +669,21 @@ public function testPlusHours(): void
669669
self::assertIs(ZonedDateTime::class, '2000-01-20T14:34:56.123456789-08:00[America/Los_Angeles]', $this->getTestZonedDateTime()->plusHours(2));
670670
}
671671

672-
public function testPlusMinutes(): void
672+
#[DataProvider('providerPlusMinutes')]
673+
public function testPlusMinutes(string $zonedDateTime, int $plusMinutes, string $expected): void
673674
{
674-
self::assertIs(ZonedDateTime::class, '2000-01-20T12:36:56.123456789-08:00[America/Los_Angeles]', $this->getTestZonedDateTime()->plusMinutes(2));
675+
$actual = ZonedDateTime::parse($zonedDateTime)->plusMinutes($plusMinutes);
676+
self::assertIs(ZonedDateTime::class, $expected, $actual);
677+
}
678+
679+
public function providerPlusMinutes(): array
680+
{
681+
return [
682+
['2000-01-20T12:34:56.123456789-08:00[America/Los_Angeles]', 2, '2000-01-20T12:36:56.123456789-08:00[America/Los_Angeles]'],
683+
// https://github.com/brick/date-time/issues/115
684+
['2025-03-30T01:30+01:00[Europe/Prague]', 50, '2025-03-30T03:20+02:00[Europe/Prague]'],
685+
['2025-03-30T01:30+01:00[Europe/Prague]', 100, '2025-03-30T04:10+02:00[Europe/Prague]'],
686+
];
675687
}
676688

677689
public function testPlusSeconds(): void

0 commit comments

Comments
 (0)