From f66bcf0556638a73c24746406fa04acb7aa82b62 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 28 Feb 2025 18:20:21 +0000 Subject: [PATCH] Add `statamic.system.localize_dates_in_modifiers` config option --- config/system.php | 13 +++++++++++++ src/Modifiers/CoreModifiers.php | 4 ++++ tests/Modifiers/FormatTest.php | 8 ++++++++ tests/Modifiers/FormatTranslatedTest.php | 8 ++++++++ tests/Modifiers/IsoFormatTest.php | 8 ++++++++ 5 files changed, 41 insertions(+) diff --git a/config/system.php b/config/system.php index 9a80cfb9ae..3ab84d0215 100644 --- a/config/system.php +++ b/config/system.php @@ -88,6 +88,19 @@ 'display_timezone' => 'UTC', + /* + |-------------------------------------------------------------------------- + | Localize Dates in Modifiers? + |-------------------------------------------------------------------------- + | + | Since Statamic stores dates in UTC, any modifiers you chain onto a date + | field will be working with the UTC value. If you'd prefer modifiers to + | always use your `display_timezone`, set this to `true`. + | + */ + + 'localize_dates_in_modifiers' => false, + /* |-------------------------------------------------------------------------- | Default Character Set diff --git a/src/Modifiers/CoreModifiers.php b/src/Modifiers/CoreModifiers.php index 9dda002169..ca97fb24ea 100644 --- a/src/Modifiers/CoreModifiers.php +++ b/src/Modifiers/CoreModifiers.php @@ -3218,6 +3218,10 @@ private function carbon($value) $value = (is_numeric($value)) ? Date::createFromTimestamp($value, config('app.timezone')) : Date::parse($value); } + if (config('statamic.system.localize_dates_in_modifiers')) { + $value->setTimezone(config('statamic.system.display_timezone')); + } + return $value; } diff --git a/tests/Modifiers/FormatTest.php b/tests/Modifiers/FormatTest.php index ccd78caed1..78bc8d7c7c 100644 --- a/tests/Modifiers/FormatTest.php +++ b/tests/Modifiers/FormatTest.php @@ -22,6 +22,14 @@ public function it_formats_date() $this->assertSame('1st January 2025 3:45pm', $this->modify(Carbon::parse('2025-01-01 15:45'), 'jS F Y g:ia')); } + #[Test] + public function it_formats_date_and_outputs_in_display_timezone() + { + config()->set('statamic.system.localize_dates_in_modifiers', true); + + $this->assertSame('1st January 2025 4:45pm', $this->modify(Carbon::parse('2025-01-01 15:45'), 'jS F Y g:ia')); + } + public function modify($value, $format) { return Modify::value($value)->format($format)->fetch(); diff --git a/tests/Modifiers/FormatTranslatedTest.php b/tests/Modifiers/FormatTranslatedTest.php index 9bcc6752b8..2512074dc7 100644 --- a/tests/Modifiers/FormatTranslatedTest.php +++ b/tests/Modifiers/FormatTranslatedTest.php @@ -24,6 +24,14 @@ public function it_formats_date() $this->assertSame('Mittwoch 1 Januar 2025, 15:45', $this->modify(Carbon::parse('2025-01-01 15:45'), 'l j F Y, H:i')); } + #[Test] + public function it_formats_date_and_outputs_in_display_timezone() + { + config()->set('statamic.system.localize_dates_in_modifiers', true); + + $this->assertSame('Mittwoch 1 Januar 2025, 16:45', $this->modify(Carbon::parse('2025-01-01 15:45'), 'l j F Y, H:i')); + } + public function modify($value, $format) { return Modify::value($value)->formatTranslated($format)->fetch(); diff --git a/tests/Modifiers/IsoFormatTest.php b/tests/Modifiers/IsoFormatTest.php index 34957a278e..5f78c66a5e 100644 --- a/tests/Modifiers/IsoFormatTest.php +++ b/tests/Modifiers/IsoFormatTest.php @@ -22,6 +22,14 @@ public function it_formats_date() $this->assertSame('2025.01.01 15:45', $this->modify(Carbon::parse('2025-01-01 15:45'), 'YYYY.MM.DD HH:mm')); } + #[Test] + public function it_formats_date_and_outputs_in_display_timezone() + { + config()->set('statamic.system.localize_dates_in_modifiers', true); + + $this->assertSame('2025.01.01 16:45', $this->modify(Carbon::parse('2025-01-01 15:45'), 'YYYY.MM.DD HH:mm')); + } + public function modify($value, $format) { return Modify::value($value)->isoFormat($format)->fetch();