Rust中Local::now()在armv7目标设备始终返回UTC时间的问题
主机系统上,以下Rust代码可正常返回本地时间:
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"***,执行date命令可显示正确本地时间:
Mon Jun 10 16:14:27 EDT 2024
通过extern调用C代码可正确获取本地时间,但原生Rust代码仅返回UTC时间:
C代码部分:
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); }
Rust调用部分:
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
Current local time and date: Mon Jun 10 16:30:15 2024
尝试直接设置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
Current local time and date: Mon Jun 10 16:38:46 2024
TZ Err(NotPresent)
TZ Ok("PST8PDT,M3.2.0,M11.1.0")
local_dt 2024-06-10 20:38:46.517983048 +00:00
Current local time and date: Mon Jun 10 13:38:46 2024
编辑补充:发现设置TZ后需延迟调用,应用运行期间后续调用Local::now()可返回正确本地时间:
local_dt 2024-06-10 13:47:29.738219435 -07:00
Current local time and date: Mon Jun 10 13:47:29 2024
TZ Ok("PST8PDT,M3.2.0,M11.1.0")
TZ Ok("PST8PDT,M3.2.0,M11.1.0")
local_dt 2024-06-10 13:47:29.739639177 -07:00
Current local time and date: Mon Jun 10 13:47:29 2024
现寻求更符合Rust风格的解决方案。
内容的提问来源于stack exchange,提问作者Tim Ross

