| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- <?php
- declare(strict_types=1);
- namespace Sabre\VObject\TimezoneGuesser;
- use DateTimeZone;
- /**
- * Some clients add 'X-LIC-LOCATION' with the olson name.
- */
- class FindFromTimezoneMap implements TimezoneFinder
- {
- private $map = [];
- private $patterns = [
- '/^\((UTC|GMT)(\+|\-)[\d]{2}\:[\d]{2}\) (.*)/',
- '/^\((UTC|GMT)(\+|\-)[\d]{2}\.[\d]{2}\) (.*)/',
- ];
- public function find(string $tzid, bool $failIfUncertain = false): ?DateTimeZone
- {
- // Next, we check if the tzid is somewhere in our tzid map.
- if ($this->hasTzInMap($tzid)) {
- return new DateTimeZone($this->getTzFromMap($tzid));
- }
- // Some Microsoft products prefix the offset first, so let's strip that off
- // and see if it is our tzid map. We don't want to check for this first just
- // in case there are overrides in our tzid map.
- foreach ($this->patterns as $pattern) {
- if (!preg_match($pattern, $tzid, $matches)) {
- continue;
- }
- $tzidAlternate = $matches[3];
- if ($this->hasTzInMap($tzidAlternate)) {
- return new DateTimeZone($this->getTzFromMap($tzidAlternate));
- }
- }
- return null;
- }
- /**
- * This method returns an array of timezone identifiers, that are supported
- * by DateTimeZone(), but not returned by DateTimeZone::listIdentifiers().
- *
- * We're not using DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC) because:
- * - It's not supported by some PHP versions as well as HHVM.
- * - It also returns identifiers, that are invalid values for new DateTimeZone() on some PHP versions.
- * (See timezonedata/php-bc.php and timezonedata php-workaround.php)
- *
- * @return array
- */
- private function getTzMaps()
- {
- if ([] === $this->map) {
- $this->map = array_merge(
- include __DIR__.'/../timezonedata/windowszones.php',
- include __DIR__.'/../timezonedata/lotuszones.php',
- include __DIR__.'/../timezonedata/exchangezones.php',
- include __DIR__.'/../timezonedata/php-workaround.php'
- );
- }
- return $this->map;
- }
- private function getTzFromMap(string $tzid): string
- {
- return $this->getTzMaps()[$tzid];
- }
- private function hasTzInMap(string $tzid): bool
- {
- return isset($this->getTzMaps()[$tzid]);
- }
- }
|