以下代码在我的主机系统上运行良好
use chrono::{Local};
fn main()
{
let local_dt = Local::now();
println!("local_dt {}", local_dt);
}
local_dt 2024-06-10 16:13:46.339768796-04:00
但是当我在目标(armv7-unknown-linux-gnueabihf)上运行它时,它总是返回 UTC 时间。
目标的 /etc/TZ 已配置 ("EST5EDT,M3.2.0,M11.1.0") 并返回正确的日期时间。
$日期
2024 年 6 月 10 日星期一 16:14:27 美国东部时间
如果我编写 C 代码并 extern 它并从我的 Rust 应用程序调用它,那么它也可以正常工作。这只是本机 Rust 代码,似乎只理解 UTC 时间。
int print_time ()
{
time_t rawtime;
struct tm *info;
time( &rawtime );
info = localtime( &rawtime );
printf("Current local time and date: %s", asctime(info));
return(0);
}
extern "C" { fn print_time(); }
...
let local_dt = Local::now();
println!("local_dt {}", local_dt);
unsafe{ print_time(); }`
local_dt 2024-06-10 20:30:15.344901619 +00:00
当前本地时间和日期:2024 年 6 月 10 日星期一 16:30:15
我也尝试过直接设置 TZ 并且确实改变了 C 输出,但 Rust 仍然只是 UTC。
let local_dt = Local::now();
println!("local_dt {}", local_dt);
unsafe{ print_time(); }
let key = "TZ";
println!("TZ {:?}", env::var(key));
env::set_var(key, "PST8PDT,M3.2.0,M11.1.0");
println!("TZ {:?}", env::var(key));
let local_dt = Local::now();
println!("local_dt {}", local_dt);
unsafe{ print_time(); }
local_dt 2024-06-10 20:38:46.517170940 +00:00
当前本地时间和日期:2024 年 6 月 10 日星期一 16:38:46
TZ 错误(不存在)
TZ 好的(“PST8PDT,M3.2.0,M11.1.0”)
local_dt 2024-06-10 20:38:46.517983048 +00:00
当前本地时间和日期:2024 年 6 月 10 日星期一 13:38:46
编辑 一大警告。我想我没有给 set_var “工作时间”。如果我稍后再次重复该代码(应用程序仍在运行),那么现在当地时间现在是正确的。
local_dt 2024-06-10 13:47:29.738219435-07:00
当前本地时间和日期:2024 年 6 月 10 日星期一 13:47:29
TZ 好的(“PST8PDT,M3.2.0,M11.1.0”)
TZ 好的(“PST8PDT,M3.2.0,M11.1.0”)
local_dt 2024-06-10 13:47:29.739639177-07:00
当前本地时间和日期:2024 年 6 月 10 日星期一 13:47:29
所以这可能会回答我的问题,但与此同时,我应该寻找更好的(更像 Rust 的)解决方案。
看起来从 std::env::set_var 设置 TZ 变量解决了我的问题。在启动进程之前设置 TZ 没有帮助,但没关系。