athwari / laravel-user-timezone
Per-user timezone management for Laravel applications.
Fund package maintenance!
v1.0.0
2026-06-29 23:32 UTC
Requires
- php: ^8.1
- illuminate/support: ^8.0|^9.0|^10.0|^11.0|^12.0
Requires (Dev)
- laravel/pint: ^1.1
- orchestra/testbench: ^6.47|^7.22|^8.25|^9.10|^10.0
- pestphp/pest: ^1.0|^2.0|^3.0
- pestphp/pest-plugin-laravel: ^1.0|^2.0|^3.0
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.10|^2.0
- phpunit/phpunit: ^9.0|^10.0 <10.5.60|^11.0
- rector/rector: ^1.0|^2.0
This package is not auto-updated.
Last update: 2026-06-29 23:41:19 UTC
README
Store dates in UTC, display in each user's preferred timezone.
Installation
composer require athwari/laravel-user-timezone
Publish the config and migration:
php artisan vendor:publish --tag=user-timezone-config php artisan vendor:publish --tag=user-timezone-migrations php artisan migrate
Configuration
// config/user-timezone.php return [ 'user_model' => env('USER_TIMEZONE_MODEL', 'App\\Models\\User'), 'column' => env('USER_TIMEZONE_COLUMN', 'timezone'), 'fallback' => env('USER_TIMEZONE_FALLBACK', config('app.timezone')), 'middleware' => [ 'enabled' => env('USER_TIMEZONE_MIDDLEWARE_ENABLED', true), 'set_php_timezone' => env('USER_TIMEZONE_SET_PHP_TIMEZONE', true), ], ];
Usage
Facade
use Athwari\LaravelUserTimezone\Facades\UserTimezone; UserTimezone::get(); // 'Europe/London' UserTimezone::resolveFromUser($user); // 'Europe/London' or fallback UserTimezone::set('America/New_York'); // override for request UserTimezone::clear(); // remove override UserTimezone::now(); // Carbon in user's timezone UserTimezone::convert($post->created_at); // Carbon converted to user's timezone UserTimezone::isValid('Invalid/Zone'); // false
Helper
user_timezone(); // string
Middleware
The ApplyUserTimezone middleware is registered automatically. It resolves the user's timezone and sets both app.timezone and PHP's default timezone for the request lifecycle.
Model Trait
Add HasTimezone to your User model:
use Athwari\LaravelUserTimezone\Traits\HasTimezone; class User extends Authenticatable { use HasTimezone; }
$user->getTimezone(); // 'Europe/London' or fallback $user->setTimezone('Asia/Tokyo'); // validates and sets $user->timezone = 'UTC'; // validated attribute mutator
Opt-in Date Conversion
For models where you want explicit timezone-aware accessors:
use Athwari\LaravelUserTimezone\Traits\ConvertsDatesToUserTimezone; class Post extends Model { use ConvertsDatesToUserTimezone; }
$post->inUserTimezone('created_at'); // Carbon in user's timezone
Testing
composer test
Changelog
Please see CHANGELOG for details.
License
MIT