use time_tz::{timezones, Tz};
const TIMEZONE_ALIASES: &[(&str, &str)] = &[
("中国标准时间", "Asia/Shanghai"),
("北京时间", "Asia/Shanghai"),
("China Standard Time", "Asia/Shanghai"),
("Greenwich Mean Time", "Europe/London"),
("GMT Standard Time", "Europe/London"),
("British Summer Time", "Europe/London"),
];
pub fn find_timezone(name: &str) -> Vec<&'static Tz> {
let mapped = map_timezone_name(name);
timezones::find_by_name(mapped)
}
fn map_timezone_name(name: &str) -> &str {
for &(alias, iana) in TIMEZONE_ALIASES {
if name == alias {
return iana;
}
}
if name.contains('\u{FFFD}') {
return "Asia/Shanghai";
}
name
}
#[cfg(test)]
mod tests {
use super::*;
use time_tz::TimeZone;
#[test]
fn test_find_timezone_standard() {
assert!(!find_timezone("PST").is_empty());
assert!(!find_timezone("America/New_York").is_empty());
}
#[test]
fn test_find_timezone_china_utf8() {
let zones = find_timezone("中国标准时间");
assert!(!zones.is_empty());
assert_eq!(zones[0].name(), "Asia/Shanghai");
let zones = find_timezone("北京时间");
assert!(!zones.is_empty());
assert_eq!(zones[0].name(), "Asia/Shanghai");
}
#[test]
fn test_find_timezone_china_english() {
let zones = find_timezone("China Standard Time");
assert!(!zones.is_empty());
assert_eq!(zones[0].name(), "Asia/Shanghai");
}
#[test]
fn test_find_timezone_gmt() {
let zones = find_timezone("Greenwich Mean Time");
assert!(!zones.is_empty());
assert_eq!(zones[0].name(), "Europe/London");
let zones = find_timezone("GMT Standard Time");
assert!(!zones.is_empty());
assert_eq!(zones[0].name(), "Europe/London");
let zones = find_timezone("British Summer Time");
assert!(!zones.is_empty());
assert_eq!(zones[0].name(), "Europe/London");
}
#[test]
fn test_find_timezone_mojibake() {
let mojibake = "test\u{FFFD}\u{FFFD}zone";
let zones = find_timezone(mojibake);
assert!(!zones.is_empty());
assert_eq!(zones[0].name(), "Asia/Shanghai");
}
#[test]
fn test_find_timezone_passthrough() {
let zones = find_timezone("Unknown/Timezone");
assert!(zones.is_empty());
}
}