user8555937
user8555937

Reputation: 2387

PHP: Get timezone identifier offset from UTC

I know \DateTimeZone::listIdentifiers() returns all timezone identifiers, but how can I retrieve their actual offset from UTC?

Upvotes: 1

Views: 840

Answers (3)

JS TECH
JS TECH

Reputation: 1583

If you are using https://carbon.nesbot.com/

// You will get timezone offset as string
Carbon::now('Asia/Kathmandu')->getOffsetString(); // +05:45 

Upvotes: 0

Oluwafemi Sule
Oluwafemi Sule

Reputation: 38922

You can build an associative array mapping timezones and their offset using the getOffset method of DateTime instance.

getOffset returns the difference in seconds of a date evaluated in the time zone of the provided datetime argument (in our example, this is the current time in utc), and the same datetime as evaluated in the local time zone.

$utcNow = new DateTime('now', (new DateTimeZone('UTC')));
$identOffset = array_map(
    function ($ident) use ($utcNow) {
        $localTimeZone = new DateTimeZone($ident);
        $offset = $localTimeZone->getOffset($utcNow);
        return [$ident => $offset] ;
    },
    DateTimeZone::listIdentifiers()
);
$identOffset = array_merge(...$identOffset);
var_dump($identOffset);

Upvotes: 1

rkosegi
rkosegi

Reputation: 14618

There is method getoffset

<?php
// Create two timezone objects, one for Taipei (Taiwan) and one for
// Tokyo (Japan)
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei");
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo");

// Create two DateTime objects that will contain the same Unix timestamp, but
// have different timezones attached to them.
$dateTimeTaipei = new DateTime("now", $dateTimeZoneTaipei);
$dateTimeJapan = new DateTime("now", $dateTimeZoneJapan);

// Calculate the GMT offset for the date/time contained in the $dateTimeTaipei
// object, but using the timezone rules as defined for Tokyo
// ($dateTimeZoneJapan).
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei);

// Should show int(32400) (for dates after Sat Sep 8 01:00:00 1951 JST).
var_dump($timeOffset);
?>

Upvotes: 1

Related Questions