Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions lib/TimezoneGuesser/FindFromTimezoneMap.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ public function find(string $tzid, ?bool $failIfUncertain = false): ?\DateTimeZo
{
// Next, we check if the tzid is somewhere in our tzid map.
if ($this->hasTzInMap($tzid)) {
return new \DateTimeZone($this->getTzFromMap($tzid));
try {
return new \DateTimeZone($this->getTzFromMap($tzid));
} catch (\Exception $e) {
return null;
}
}

// Some Microsoft products prefix the offset first, so let's strip that off
Expand All @@ -34,7 +38,11 @@ public function find(string $tzid, ?bool $failIfUncertain = false): ?\DateTimeZo
}
$tzidAlternate = $matches[3];
if ($this->hasTzInMap($tzidAlternate)) {
return new \DateTimeZone($this->getTzFromMap($tzidAlternate));
try {
return new \DateTimeZone($this->getTzFromMap($tzidAlternate));
} catch (\Exception $e) {
return null;
}
}
}

Expand Down
6 changes: 3 additions & 3 deletions lib/timezonedata/exchangezones.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@
'Kabul' => 'Asia/Kabul',
'Ekaterinburg' => 'Asia/Yekaterinburg',
'Islamabad, Karachi, Tashkent' => 'Asia/Karachi',
'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta',
'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Kolkata',
'Kathmandu, Nepal' => 'Asia/Kathmandu',
'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty',
'Astana, Dhaka' => 'Asia/Dhaka',
'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo',
'Rangoon' => 'Asia/Rangoon',
'Rangoon' => 'Asia/Yangon',
'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok',
'Krasnoyarsk' => 'Asia/Krasnoyarsk',
'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai',
Expand All @@ -72,7 +72,7 @@
'Mid-Atlantic' => 'America/Noronha',
'Brasilia' => 'America/Sao_Paulo', // Best guess
'Buenos Aires' => 'America/Argentina/Buenos_Aires',
'Greenland' => 'America/Godthab',
'Greenland' => 'America/Nuuk',
'Newfoundland' => 'America/St_Johns',
'Atlantic Time (Canada)' => 'America/Halifax',
'Caracas, La Paz' => 'America/Caracas',
Expand Down
6 changes: 3 additions & 3 deletions lib/timezonedata/lotuszones.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
'Newfoundland' => 'America/St_Johns',
'Argentina' => 'America/Argentina/Buenos_Aires',
'E. South America' => 'America/Belem',
'Greenland' => 'America/Godthab',
'Greenland' => 'America/Nuuk',
'Montevideo' => 'America/Montevideo',
'SA Eastern' => 'America/Belem',
// 'Mid-Atlantic' => 'Etc/GMT-2', // conflict with windows timezones.
Expand Down Expand Up @@ -71,12 +71,12 @@
'Ekaterinburg' => 'Asia/Yekaterinburg',
'Pakistan' => 'Asia/Karachi',
'West Asia' => 'Asia/Tashkent',
'India' => 'Asia/Calcutta',
'India' => 'Asia/Kolkata',
'Sri Lanka' => 'Asia/Colombo',
'Nepal' => 'Asia/Kathmandu',
'Central Asia' => 'Asia/Dhaka',
'N. Central Asia' => 'Asia/Almaty',
'Myanmar' => 'Asia/Rangoon',
'Myanmar' => 'Asia/Yangon',
'North Asia' => 'Asia/Krasnoyarsk',
'SE Asia' => 'Asia/Bangkok',
'China' => 'Asia/Shanghai',
Expand Down
14 changes: 7 additions & 7 deletions lib/timezonedata/windowszones.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
'Arab Standard Time' => 'Asia/Riyadh',
'Arabian Standard Time' => 'Asia/Dubai',
'Arabic Standard Time' => 'Asia/Baghdad',
'Argentina Standard Time' => 'America/Buenos_Aires',
'Argentina Standard Time' => 'America/Argentina/Buenos_Aires',
'Astrakhan Standard Time' => 'Europe/Astrakhan',
'Atlantic Standard Time' => 'America/Halifax',
'Aus Central W. Standard Time' => 'Australia/Eucla',
Expand Down Expand Up @@ -55,16 +55,16 @@
'Eastern Standard Time (Mexico)' => 'America/Cancun',
'Egypt Standard Time' => 'Africa/Cairo',
'Ekaterinburg Standard Time' => 'Asia/Yekaterinburg',
'FLE Standard Time' => 'Europe/Kiev',
'FLE Standard Time' => 'Europe/Kyiv',
'Fiji Standard Time' => 'Pacific/Fiji',
'GMT Standard Time' => 'Europe/London',
'GTB Standard Time' => 'Europe/Bucharest',
'Georgian Standard Time' => 'Asia/Tbilisi',
'Greenland Standard Time' => 'America/Godthab',
'Greenland Standard Time' => 'America/Nuuk',
'Greenwich Standard Time' => 'Atlantic/Reykjavik',
'Haiti Standard Time' => 'America/Port-au-Prince',
'Hawaiian Standard Time' => 'Pacific/Honolulu',
'India Standard Time' => 'Asia/Calcutta',
'India Standard Time' => 'Asia/Kolkata',
'Iran Standard Time' => 'Asia/Tehran',
'Israel Standard Time' => 'Asia/Jerusalem',
'Jordan Standard Time' => 'Asia/Amman',
Expand All @@ -82,10 +82,10 @@
'Morocco Standard Time' => 'Africa/Casablanca',
'Mountain Standard Time' => 'America/Denver',
'Mountain Standard Time (Mexico)' => 'America/Chihuahua',
'Myanmar Standard Time' => 'Asia/Rangoon',
'Myanmar Standard Time' => 'Asia/Yangon',
'N. Central Asia Standard Time' => 'Asia/Novosibirsk',
'Namibia Standard Time' => 'Africa/Windhoek',
'Nepal Standard Time' => 'Asia/Katmandu',
'Nepal Standard Time' => 'Asia/Kathmandu',
'New Zealand Standard Time' => 'Pacific/Auckland',
'Newfoundland Standard Time' => 'America/St_Johns',
'Norfolk Standard Time' => 'Pacific/Norfolk',
Expand Down Expand Up @@ -127,7 +127,7 @@
'Transbaikal Standard Time' => 'Asia/Chita',
'Turkey Standard Time' => 'Europe/Istanbul',
'Turks And Caicos Standard Time' => 'America/Grand_Turk',
'US Eastern Standard Time' => 'America/Indianapolis',
'US Eastern Standard Time' => 'America/Indiana/Indianapolis',
'US Mountain Standard Time' => 'America/Phoenix',
'UTC' => 'Etc/GMT',
'UTC+12' => 'Etc/GMT-12',
Expand Down
65 changes: 65 additions & 0 deletions tests/VObject/TimezoneGuesser/FindFromTimezoneMapTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

declare(strict_types=1);

namespace Sabre\VObject\TimezoneGuesser;

use PHPUnit\Framework\TestCase;

class FindFromTimezoneMapTest extends TestCase
{
/**
* Verify that previously-deprecated IANA names have been replaced with
* their canonical successors and resolve correctly.
*
* @dataProvider updatedTimezoneProvider
*/
public function testUpdatedTimezonesResolve(string $mapKey, string $expectedOlson): void
{
$finder = new FindFromTimezoneMap();
$tz = $finder->find($mapKey);

self::assertNotNull($tz, "Expected '$mapKey' to resolve to '$expectedOlson'");
self::assertSame($expectedOlson, $tz->getName());
}

public function updatedTimezoneProvider(): array
{
return [
// windowszones.php
['FLE Standard Time', 'Europe/Kyiv'],
['India Standard Time', 'Asia/Kolkata'],
['Nepal Standard Time', 'Asia/Kathmandu'],
['Myanmar Standard Time', 'Asia/Yangon'],
['Greenland Standard Time', 'America/Nuuk'],
['Argentina Standard Time', 'America/Argentina/Buenos_Aires'],
['US Eastern Standard Time', 'America/Indiana/Indianapolis'],
// lotuszones.php
['India', 'Asia/Kolkata'],
['Myanmar', 'Asia/Yangon'],
// exchangezones.php
['Kolkata, Chennai, Mumbai, New Delhi, India Standard Time', 'Asia/Kolkata'],
['Rangoon', 'Asia/Yangon'],
];
}

/**
* Verify that the Microsoft-offset-prefix stripping path still works
* with updated timezone values.
*/
public function testMicrosoftOffsetPrefixStripping(): void
{
$finder = new FindFromTimezoneMap();
$tz = $finder->find('(UTC+02:00) FLE Standard Time');

self::assertNotNull($tz);
self::assertSame('Europe/Kyiv', $tz->getName());
}

public function testUnknownTimezoneReturnsNull(): void
{
$finder = new FindFromTimezoneMap();

self::assertNull($finder->find('This/Does_Not_Exist'));
}
}