Help me to decide this task, please. (PHP, Symfony)
What I have: List of time zone like
"Europe/Riga" "Europe/Rome" "Europe/Samara" "Europe/San_Marino" "Europe/Sarajevo"
In result I want to see:
(+00:00) Riga (+01:30) Rome (+03:00) Samara (-01:00) San_Marino (+05:00) Sarajevo
What I did:
$timeZoneIdentifierList = DateTimeZone::listIdentifiers(); $timeZoneUtc = new DateTimeZone('UTC'); $nowByUtc = new DateTime('now', $timeZoneUtc); foreach ($timeZoneIdentifierList as $timeZoneIdentifier) { $dateTimezoneItem = new DateTimeZone($timeZoneIdentifier); $timeZone = $dateTimezoneItem->getOffset($nowByUtc); $humanFriendlyOffset = $timeZone / 3600; }
And if I dump $humanFriendlyOffset I get only digital value like this: 0, 1, -7, 2, 1.5
Question: Is something prepared method in PHP/Symfony to convert
- 1 -> +01:00,
- -7 -> -07:00,
- 2 -> +02:00,
- 1.5 -> +01:30
May be exist more easy way?
Advertisement
Answer
This solution creates a new DateTime object for each time zone.
$tzArr = ["Europe/Riga", "Europe/Rome", "Europe/Samara", "Europe/San_Marino", "Europe/Sarajevo", "UTC"]; foreach($tzArr as $tz){ $dt = date_create('Now',new DateTimeZone($tz)); $formatTz = $dt->format('(P) e'); echo $formatTz."<br>n"; }
Output:
(+02:00) Europe/Riga (+01:00) Europe/Rome (+04:00) Europe/Samara (+01:00) Europe/San_Marino (+01:00) Europe/Sarajevo (+00:00) UTC
With a preg_replace the continent can be hidden and an output can be achieved exactly as desired.
foreach($tzArr as $tz){ $dt = date_create('Now',new DateTimeZone($tz)); $loc = preg_replace('~^[a-z]+/~i','', $dt->format('e')); $formatTz = $dt->format('(P) ').$loc; echo $formatTz."<br>n"; }
Output:
(+02:00) Riga (+01:00) Rome (+04:00) Samara (+01:00) San_Marino (+01:00) Sarajevo (+00:00) UTC