Timezones is a PSR-2 compliant package used for easily converting dates into UTC or into your local timezones. Bundled is also support for Laravel Facades and blade directives to make usage even easier!
Simply require the package via composer into your app.
composer require mbarlow/timezones 2.*
To get started simply instantiate the Timezones object with the new
keyword in PHP.
$timezones = new \MBarlow\Timezones\Timezones;
Bundled with this package is a Laravel Service provider that is setup for auto-discovery.
If you are not using Laravel 5.5 then you can add the following Service Provider to your config/app.php
config.
[
/*
* Package Service Providers...
*/
\MBarlow\Timezones\TimezonesServiceProvider::class,
];
The service provider will bind the Timezones Object to the container allowing you to type hint in the object.
use MBarlow\Timezones\Timezones;
class MyController
{
public function myControllerAction(Timezones $timezones)
{
//
}
}
To use, first instantiate the object or typehint the object into your method.
$timezones = new \MBarlow\Timezones\Timezones;
$dateTime = '2020-08-14 12:23:00';
$tz = 'America/New_York';
$format = 'Y-m-d H:i:s';
$timezones->convertToUTC($dateTime, $tz, $format);
use MBarlow\Timezones\Timezones;
class MyController
{
public function myControllerAction(Timezones $timezones)
{
$dateTime = '2020-08-14 12:23:00';
$tz = 'America/New_York';
$format = 'Y-m-d H:i:s';
$timezones->convertToUTC($dateTime, $tz, $format);
}
}
This method should be used when parsing an user inputted date to convert it to UTC ready for storing in your database.
$dateTime
is a required field and can either be an instance of \DateTime
that was created with the correct local timezone or it can be a string which will be passed into an instance of \DateTime
.
If $dateTime
is an instance of \DateTime
then $tz
is not required and should default to null
. If $dateTime
is passed through as a string then $tz
should either be an instance of \DateTimeZone
or a string describing a valid timezone.
$format
is an optional field that defaults to standard MySQL datetime format of YYYY-MM-DD HH:MM:SS
.
$timezones = new \MBarlow\Timezones\Timezones;
$dateTime = '2020-08-14 12:23:00';
$tz = 'America/New_York';
$format = 'jS F Y H:i';
$timezones->convertToLocal($dateTime, $tz, $format);
use MBarlow\Timezones\Timezones;
class MyController
{
public function myControllerAction(Timezones $timezones)
{
$dateTime = '2020-08-14 12:23:00';
$tz = 'America/New_York';
$format = 'jS F Y H:i';
$timezones->convertToLocal($dateTime, $tz, $format);
}
}
This method should be used in your "views or in your API endpoints" to transform a UTC date stored within your database into the local timezone for the user viewing the page or requesting the data.
$dateTime
is a required field and can either be an instance of \DateTime
that was created with the correct UTC timezone or it can be a string which will be passed into an instance of \DateTime
.
$tz
is a required field and can either be an instance of \DateTimeZone
or a string describing a valid timezone and should be the timezone of the end user.
$format
is an optional field that defaults to standard MySQL datetime format of YYYY-MM-DD HH:MM:SS
.
This method can be used for API endpoints or within your templates to generate an array of formatted timezones. The generated array will return an associative array with the timezone as the key and a nice label with offset as the value.
$timezones = new \MBarlow\Timezones\Timezones;
print_r($timezones->timezoneList());
/*
Array
(
[Pacific/Midway] => (UTC -11:00) Midway
[Pacific/Niue] => (UTC -11:00) Niue
[Pacific/Pago_Pago] => (UTC -11:00) Pago Pago
[Pacific/Honolulu] => (UTC -10:00) Honolulu
[Pacific/Rarotonga] => (UTC -10:00) Rarotonga
[Pacific/Tahiti] => (UTC -10:00) Tahiti
[Pacific/Marquesas] => (UTC -09:30) Marquesas
[America/Adak] => (UTC -09:00) Adak
[Pacific/Gambier] => (UTC -09:00) Gambier
[America/Anchorage] => (UTC -08:00) Anchorage
[America/Juneau] => (UTC -08:00) Juneau
[America/Metlakatla] => (UTC -08:00) Metlakatla
[America/Nome] => (UTC -08:00) Nome
[Pacific/Pitcairn] => (UTC -08:00) Pitcairn
[America/Sitka] => (UTC -08:00) Sitka
....
)
*/
$timezones = new \MBarlow\Timezones\Timezones;
$list = $timezones->timezoneList();
echo '<select="timezone">';
foreach ($list as $timezone => $label) {
echo '<option value="' . $timezone . '">' . $label . '</option>';
}
echo '</select>';
If you have installed the package into a Laravel application a few extra goodies are available.
Should you prefer to use a Facade, one has been bundled and made available with the Service Provider. The facade is available at `\Timezones'.
Both methods described in the "Usage" section above are available.
\Timezones::convertToUTC();
\Timezones::convertToLocal();
A blade directive will also be registered by the Service Provider. This only supports the convertToLocal
method and is designed for use within your blade templates to convert a UTC datetime into the end users time and display on the page in the correct format.
@displayDate($dateTime, $tz, $format)
All parameters match those defined for the convertToLocal
method however all fields are required when using the blade directive.
If you wish to run the tests, clone out the repository
git clone [email protected]:mikebarlow/Timezones.git
Change to the root of the repository and run composer install with the dev dependencies
cd Timezones
composer install
A script is defined in the composer.json
to run both the code sniffer and the unit tests
composer run test
Or run them individually as required
./vendor/bin/phpunit
./vendor/bin/phpcs --standard=PSR2 --ignore=src/Facade/* src
You can view the changelog HERE
Please see CONTRIBUTING for details.
The MIT License (MIT). Please see License File for more information.