Skip to content

Commit 1d2c462

Browse files
committed
Try to use browser timezone
1 parent 7df9097 commit 1d2c462

10 files changed

Lines changed: 88 additions & 6 deletions

File tree

app/Http/Controllers/Posts/PostController.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414
use App\Services\LdJsonService;
1515
use App\Services\PostService;
1616
use App\Traits\PostTrait;
17+
use App\Traits\SessionTimezoneTrait;
1718
use App\Traits\SubsiteTrait;
1819
use Illuminate\Contracts\View\View;
1920

2021
final class PostController extends BaseController
2122
{
2223
use PostTrait;
24+
use SessionTimezoneTrait;
2325
use SubsiteTrait;
2426

2527
protected int $subsiteId;
@@ -55,6 +57,7 @@ public function show(Post $post): View
5557
'next' => $post->next(),
5658
'previous' => $post->previous(),
5759
'canonicalUrl' => $this->getCanonicalUrl($post),
60+
'displayTimezone' => $this->getDisplayTimezone(),
5861
'relatedPosts' => $relatedPosts,
5962
'subdomain' => $subdomain,
6063
'useLivewire' => true,

app/Livewire/Comments/CommentComponent.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use App\Models\Post;
1111
use App\Models\User;
1212
use App\Traits\CommentComponentTrait;
13+
use App\Traits\SessionTimezoneTrait;
1314
use Illuminate\Contracts\View\View;
1415
use Illuminate\Support\Facades\DB;
1516
use Livewire\Attributes\On;
@@ -18,6 +19,7 @@
1819
final class CommentComponent extends Component
1920
{
2021
use CommentComponentTrait;
22+
use SessionTimezoneTrait;
2123

2224
// Data
2325
public ?int $authorizedUserId;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Livewire\Localization;
6+
7+
use App\Traits\SessionTimezoneTrait;
8+
use Illuminate\Contracts\View\View;
9+
use Livewire\Component;
10+
11+
final class SwitchTimezoneComponent extends Component
12+
{
13+
use SessionTimezoneTrait;
14+
15+
public function render(): View
16+
{
17+
return view('livewire.localization.switch-timezone-component');
18+
}
19+
}

app/Livewire/Posts/PostIndexComponent.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use App\Models\Post;
88
use App\Traits\PaginationTrait;
99
use App\Traits\PostTrait;
10+
use App\Traits\SessionTimezoneTrait;
1011
use App\Traits\SubsiteTrait;
1112
use Illuminate\Contracts\Pagination\CursorPaginator;
1213
use Illuminate\Contracts\View\View;
@@ -19,6 +20,7 @@ final class PostIndexComponent extends Component
1920
{
2021
use PaginationTrait;
2122
use PostTrait;
23+
use SessionTimezoneTrait;
2224
use SubsiteTrait;
2325
use WithPagination;
2426

@@ -59,6 +61,7 @@ public function render(): View
5961

6062
return view('livewire.posts.post-index-component', [
6163
'posts' => $posts,
64+
'displayTimezone' => $this->getDisplayTimezone(),
6265
]);
6366
}
6467

@@ -72,7 +75,7 @@ public function query(): Builder
7275
private function getPosts(): CursorPaginator
7376
{
7477
$dateQueries = [
75-
DB::raw('DATE_FORMAT(posts.created_at, "%m-%d") as month_day'),
78+
DB::raw("DATE_FORMAT(CONVERT_TZ(posts.created_at, 'UTC', " . DB::connection()->getPdo()->quote($this->getDisplayTimezone()) . "), '%m-%d') as month_day"),
7679
DB::raw('COUNT(*) as total_posts'),
7780
];
7881

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Traits;
6+
7+
use Carbon\CarbonTimezone;
8+
use Carbon\Exceptions\InvalidTimeZoneException;
9+
use Livewire\Attributes\Locked;
10+
use Livewire\Attributes\Session;
11+
12+
trait SessionTimezoneTrait
13+
{
14+
use LoggingTrait;
15+
16+
#[Session(key: 'displayTimezone')]
17+
#[Locked]
18+
public ?string $displayTimezone = null;
19+
20+
public function getDisplayTimezone(): string
21+
{
22+
// For some reason, calling session('displayTimezone') will sometimes return a value
23+
// when $this->displayTimezone is null.
24+
return $this->displayTimezone ?? session('displayTimezone') ?? config('app.timezone');
25+
}
26+
27+
public function setDisplayTimezone(string $timezone): void
28+
{
29+
try {
30+
// Try to create a CarbonTimezone object to validate the timezone string.
31+
CarbonTimezone::create($timezone);
32+
33+
// If we get here, the timezone is valid, so we can set it.
34+
$this->displayTimezone = $timezone;
35+
} catch (InvalidTimeZoneException $e) {
36+
$this->logError('Invalid timezone: ' . $timezone);
37+
}
38+
}
39+
}

app/View/Components/Dates/FormattedDateTimeComponent.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44

55
namespace App\View\Components\Dates;
66

7+
use App\Traits\SessionTimezoneTrait;
78
use Carbon\Carbon;
89
use Illuminate\Contracts\View\View;
910
use Illuminate\View\Component;
1011

1112
final class FormattedDateTimeComponent extends Component
1213
{
14+
use SessionTimezoneTrait;
15+
1316
public Carbon $date;
1417
public string $format = 'Y-m-d H:i:s';
1518

@@ -36,7 +39,8 @@ public function render(): View
3639

3740
private function getFormattedDate(): string
3841
{
39-
$formattedDate = $this->date->format($this->format());
42+
$date = $this->date->tz($this->getDisplayTimezone());
43+
$formattedDate = $date->format($this->format());
4044

4145
return $this->addPeriods($formattedDate);
4246
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<time datetime="{{ $comment->created_at->format('Y-m-d H:i:d') }}">
22
<a href="#{{ $comment->id }}" class="footer-info" title="{{ trans('Permanent link to this comment') }}">
33
<x-icons.icon-component filename="clock" class="icon-small" />
4-
{{ $comment->created_at->format('g:i a') }}
4+
{{ $comment->created_at->tz($displayTimezone)->format('g:i a') }}
55
</a>
66

77
<span class="footer-info">
88
<x-icons.icon-component filename="calendar3" class="icon-small" />
9-
{{ $comment->created_at->format('F j') }}
9+
{{ $comment->created_at->tz($displayTimezone)->format('F j') }}
1010
</span>
1111
</time>

resources/views/layouts/app.blade.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
<meta name="ckeditor-config" content='@json(config("ckeditor"))'>
2222
@endif
2323

24+
<livewire:localization.switch-timezone-component />
25+
2426
</head>
2527
<body>
2628

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<div style="display: none;" wire:init="$js.setDisplayTimezone"></div>
2+
3+
@script
4+
<script>
5+
$js('setDisplayTimezone', () => {
6+
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
7+
$wire.setDisplayTimezone(timezone);
8+
});
9+
</script>
10+
@endscript

resources/views/posts/show.blade.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
<p class="dateline">
1919
<time datetime="{{ $post->created_at->format('Y-m-d H:i:d') }}">
2020
<x-icons.icon-component filename="calendar3" class="icon-small" />
21-
{{ $post->created_at->format('F j, Y') }}
21+
{{ $post->created_at->tz($displayTimezone)->format('F j, Y') }}
2222

2323
<x-icons.icon-component filename="clock" class="icon-small" />
24-
{{ $post->created_at->format('g:i a') }}
24+
{{ $post->created_at->tz($displayTimezone)->format('g:i a') }}
2525
</time>
2626

2727
<x-posts.post-rss-button :post="$post" />

0 commit comments

Comments
 (0)