@jarcas I like to explicitly convert dates and times to the user’s preferred timezone with a method on the User model itself:
class User extends Authenticatable implements MustVerifyEmail
{
public function convertTimezone(DateTimeInterface $dateTime): DateTimeInterface
{
return Date::instance($dateTime)->timezone(new DateTimeZone($user->timezone ?? 'UTC'));
}
}
<dt>{{ __('Start date') }}</dt>
<dd>{{ $user->convertTimezone($event->start_date)->toDateTimeString() }}</dd>
If you need to do this for multiple models, then you could define and implement an interface, similar to Laravel’s built-in HasLocalePreference interface, and combine it with a trait to provide the actual implementation:
interface HasTimezonePreference
{
public function preferredTimezone(): DateTimeZone;
public function convertTimezone(DateTimeInterface $dateTime): DateTimeInterface;
}
trait ConvertsTimezones
{
public function convertTimezone(DateTimeInterface $dateTime): DateTimeInterface
{
return Date::instance($dateTime)->timezone($this->preferredTimezone());
}
}
class Venue extends Model implements HasTimezonePreference
{
use ConvertsTimezones;
public function preferredTimezone(): DateTimeZone
{
return new DateTimeZone($this->country->timezone);
}
}
<dt>{{ __('Opens') }}</dt>
<dd>{{ $venue->convertTimezone($venue->opening_time)->toTimeString() }}</dd>