我知道可以通过以下方式获取时区偏移量:
chrono::Local::now().offset()
但我需要一个名称,例如“美国/丹佛”或至少是一个缩写。
let mut zone_names = HashMap::new();
zone_names.insert("-08:00", "America/Los-Angeles");
zone_names.insert("-07:00", "America/Denver");
let tz_str: &str = &chrono::Local::now().offset().to_string();
let local_tz_name = zone_names.get(&tz_str);
println!("{:?}", local_tz_name);
在Unix-y系统(如macOS,FreeBSD)中,这些信息存放在以下位置:
/usr/share/zoneinfo/
如果你运行/usr/share/zoneinfo/America/ ls
,你会发现丹佛(Denver)在列表中,但这并不能真正帮助你到达目的地。
在我的 macOS 机器上,我可以运行sudo systemsetup -gettimezone
命令,它会打印出我的当前时区:Time Zone: America/Los_Angeles
。
但是如果你无法在目标机器上使用 sudo,这可能对你没用。
实际上,我刚刚找到了这个crate。虽然它已经好几年没有更新了,但似乎可以完成你想做的事情。也许你可以从它的源代码中获得一些洞见和灵感。剧透一下,它会读取/usr/share/zoneinfo/
然后展开操作。