blob: 781f774d8b1f84d856c0caae492752409244f341 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/settings/timezone_settings_helper.h"
#include "base/logging.h"
#include "chromeos/chromeos_export.h"
namespace chromeos {
namespace system {
CHROMEOS_EXPORT const icu::TimeZone* GetKnownTimezoneOrNull(
const icu::TimeZone& timezone,
const std::vector<icu::TimeZone*>& timezone_list) {
const icu::TimeZone* known_timezone = NULL;
icu::UnicodeString id, canonical_id;
timezone.getID(id);
UErrorCode status = U_ZERO_ERROR;
icu::TimeZone::getCanonicalID(id, canonical_id, status);
DCHECK(U_SUCCESS(status));
for (const auto* entry : timezone_list) {
if (*entry == timezone)
return entry;
// Compare the canonical IDs as well.
// For instance, Asia/Ulan_Bator -> Asia/Ulaanbaatar or
// Canada/Pacific -> America/Vancouver
icu::UnicodeString entry_id, entry_canonical_id;
entry->getID(entry_id);
icu::TimeZone::getCanonicalID(entry_id, entry_canonical_id, status);
DCHECK(U_SUCCESS(status));
if (entry_canonical_id == canonical_id)
return entry;
// Last resort: If no match is found, the last timezone in the list
// with matching rules will be returned.
if (entry->hasSameRules(timezone))
known_timezone = entry;
}
// May return NULL if we did not find a matching timezone in our list.
return known_timezone;
}
} // namespace system
} // namespace chromeos