1: <?php
2: declare(strict_types=1);
3:
4: namespace om\ICal\Timezone;
5:
6: use DateTimeZone;
7: use om\ICal\Component;
8:
9: /**
10: * Resolves IANA timezone names like "Europe/Prague" (case-insensitive).
11: */
12: final class IanaTimezoneResolver implements TimezoneResolver {
13: /** @var array<string, string>|null lower-case name => name */
14: private static ?array $names = null;
15:
16: public function resolve(string $tzid, Component $calendar): ?ResolvedTimezone {
17: self::$names ??= array_change_key_case(array_combine(
18: $identifiers = DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC),
19: $identifiers,
20: ));
21: $name = self::$names[strtolower(trim($tzid))] ?? null;
22: return $name === null ? null : new ResolvedTimezone($tzid, new DateTimeZone($name), TimezoneSource::Iana);
23: }
24: }
25: