protected function getTree(DateTimeParseContext $context) { if ($this->textStyle == TextStyle::NARROW()) { return parent::getTree($context); } $locale = $context->getLocale(); $isCaseSensitive = $context->isCaseSensitive(); $regionIds = ZoneRulesProvider::getAvailableZoneIds(); $regionIdsSize = $regionIds->size(); $cached = $isCaseSensitive ? self::$cachedTree : self::$cachedTreeCI; $entry = null; $tree = null; $zoneStrings = null; if (($entry = $cached->get($locale)) == null || ($entry->getKey() != $regionIdsSize || ($tree = $entry->getValue()->get()) == null)) { $tree = PrefixTree::newTree($context); $zoneStrings = TimeZoneNameUtility::getZoneStrings($locale); foreach ($zoneStrings as $names) { $zid = $names[0]; if (!$regionIds->contains($zid)) { continue; } $tree->add($zid, $zid); // don't convert zid -> metazone $zid = ZoneName::toZid($zid, $locale); $i = $this->textStyle == TextStyle::FULL() ? 1 : 2; for (; $i < count($names); $i += 2) { $tree->add($names[$i], $zid); } } // if we have a set of preferred zones, need a copy and // add the preferred zones again to overwrite if (self::$preferredZones != null) { foreach ($zoneStrings as $names) { $zid = $names[0]; if (!self::$preferredZones->contains($zid) || !$regionIds->contains($zid)) { continue; } $i = $this->textStyle == TextStyle::FULL() ? 1 : 2; for (; $i < count($names); $i += 2) { $tree->add($names[$i], $zid); } } } $cached->put($locale, new SimpleImmutableEntry($regionIdsSize, $tree)); } return $tree; }
private function parse(DateTimeFormatter $fmt, $zid, $expected, $text, Locale $locale, TextStyle $style, $ci) { if ($ci) { $text = $text->toUpperCase(); } /** @var ZoneId $ret */ $ret = $fmt->parseQuery($text, TemporalQueries::zone())->getId(); // TBD: need an excluding list // assertEquals(...); if ($ret->equals($expected) || $ret->equals($zid) || $ret->equals(ZoneName::toZid($zid)) || $ret->equals($expected->replace("UTC", "UCT"))) { return; } echo printf("[%-5s %s %s %16s] %24s -> %s(%s)%n", $locale->__toString(), $ci ? "ci" : " ", $style == TextStyle::FULL() ? " full" : "short", $zid, $text, $ret, $expected); }