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

如何在Rust中获得本地时区名称?,rust,Rust,我知道你可以通过 chrono::Local::now().offset() 但是我需要一个名字,例如“America/Denver”或者至少是一个缩写。我想知道这样的东西是否适合你: let mut zone_names = HashMap::new(); zone_names.insert("-08:00", "America/Los-Angeles"); zone_names.insert("-07:00", "Ame

我知道你可以通过

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

但是我需要一个名字,例如“America/Denver”或者至少是一个缩写。

我想知道这样的东西是否适合你:

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
,您将看到丹佛也包括在这个列表中,但这并不能真正让您到达您想要去的地方

在我的macOS机器上,我可以运行
sudo系统设置-gettimezone
,它会打印出我当前的时区:
时区:美国/洛杉矶

但是,如果您不能在目标机器上执行sudo,那么这可能不适用于您


事实上,我刚找到这个。它已经好几年没有更新了,但它似乎做了你想做的事情。也许你可以从中获得一些见解和灵感。破坏者,它读入
/usr/share/zoneinfo/
,然后从那里开始。

我想知道这样的东西是否适合你:

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
,您将看到丹佛也包括在这个列表中,但这并不能真正让您到达您想要去的地方

在我的macOS机器上,我可以运行
sudo系统设置-gettimezone
,它会打印出我当前的时区:
时区:美国/洛杉矶

但是,如果您不能在目标机器上执行sudo,那么这可能不适用于您


事实上,我刚找到这个。它已经好几年没有更新了,但它似乎做了你想做的事情。也许你可以从中获得一些见解和灵感。破坏者,它读入
/usr/share/zoneinfo/
,然后从那里开始。

这不会得到实际的时区,因为存在重叠的时区。我希望得到机器上指定的实际时区。是的,我知道。这是一个廉价的lol。嗯,是一个时区列表。我所看到的这类事情的实现方式或多或少与您上面看到的方式相同。你希望得到多大的粒度?我希望得到用户设置的粒度。因为我心中有一个目标操作系统,我可能可以从文件系统中提取它。是的!我想你可以把它从文件系统中取出来。我用一些细节更新了我的答案。这不会得到实际的时区,因为有重叠的时区。我希望得到机器上指定的实际时区。是的,我知道。这是一个廉价的lol。嗯,是一个时区列表。我所看到的这类事情的实现方式或多或少与您上面看到的方式相同。你希望得到多大的粒度?我希望得到用户设置的粒度。因为我心中有一个目标操作系统,我可能可以从文件系统中提取它。是的!我想你可以把它从文件系统中取出来。我用一些细节更新了我的答案。