Rust 当地时间始终返回目标 UTC

问题描述 投票:0回答:1

以下代码在我的主机系统上运行良好

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 的)解决方案。

rust timezone utc
1个回答
0
投票

看起来从 std::env::set_var 设置 TZ 变量解决了我的问题。在启动进程之前设置 TZ 没有帮助,但没关系。

© www.soinside.com 2019 - 2024. All rights reserved.