logikinc
7/28/2015 - 11:25 AM

PHP Timezones

PHP Timezones

<?php namespace App\Services\Datasets;

use DateTime;
use DateTimeZone;
use Illuminate\Support\Collection;

class Timezones extends Dataset
{
    /**
     * Get all timezones.
     *
     * @return Collection
     */
    protected function getDataset()
    {
        $allTimezones = DateTimeZone::listIdentifiers();

        $timezones = new Collection();
        $now = time();

        foreach ($allTimezones as $timezoneIdentifier) {
            $dateTimeZone = new DateTimeZone($timezoneIdentifier);

            //Read the current transition to get if the timezone is currently in DST
            $transitions = $dateTimeZone->getTransitions($now, $now);

            $timezones->push(new Collection([
                'timezone_identifier' => $dateTimeZone->getName(),
                'offset' => $offset = $dateTimeZone->getOffset(new DateTime()),
                'is_dst' => $transitions[0]['isdst'], //only use the first transition
                'display_offset' => $this->formatDisplayOffset($offset),
            ]));
        }
        return $timezones;
    }

    /**
     * Format the time offset for display.
     *
     * @param  int  $offset
     * @return string
     */
    protected function formatDisplayOffset($offset)
    {
        $inital = new DateTime();
        $inital->setTimestamp(abs($offset));
        $hoursFormatted = $inital->format('H:i');

        return ($offset >= 0 ? '+':'-') . $hoursFormatted;
    }
}