如何在Rust中获取本地时区名称?

3

我知道可以通过以下方式获取时区偏移量:

chrono::Local::now().offset()

但我需要一个名称,例如“美国/丹佛”或至少是一个缩写。

1个回答

0
我想知道这样的东西对你是否有用:
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/然后展开操作。


1
这样做无法获取实际的时区,因为存在重叠的时区。我希望能够获取机器上指定的实际时区。 - undefined
是的,我知道。那只是一个便宜的戏法哈哈。好吧,这里有一个时区列表。我见过这种类型的实现方式基本上就是你在上面看到的那样。你希望得到多细致的结果? - undefined
1
我想要获取用户设置的内容。由于我有一个目标操作系统,所以我可以从文件系统中提取它。 - undefined
是的!我认为你可以从文件系统中获取它。我已经在我的答案中更新了一些细节。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接