6个版本
0.2.2 | 2023年1月28日 |
---|---|
0.2.1 | 2023年1月28日 |
0.1.1 | 2023年1月25日 |
0.0.0 | 2023年1月25日 |
#8 在 #tz
每月29次下载
用于 libtz
600KB
8K SLoC
libtz-sys
Rust的FFI接口,用于IANA的libtz (git仓库)。
这是一个低级库——您可能更倾向于使用libtz,这是一个更符合Rust风格的接口,它建立在之上。
它提供了一个与libc的localtime_r()
函数(及相关函数)等效的接口。不同之处在于,这个库被编译成使用Rust的std::env::var_os()
,这可以保护它免受std::env::set_var()
竞争,否则这可能导致在未提供多线程安全实现的系统上发生段错误。
除此之外,它应该可以作为大多数libc localtime实现的直接替代品。它将读取系统已安装的tzdata文件,以计算诸如闰秒和夏令时等问题。
用法
将此添加到您的Cargo.toml
[dependencies]
libtz-sys = "0.2"
示例
use std::ffi::{CString,CStr};
use std::mem::MaybeUninit;
use libtz_sys::{tzalloc, localtime_rz, mktime_z, tzfree, TimeT, Tm};
let tzname = CString::new("America/New_York").unwrap();
let tz = unsafe { tzalloc(tzname.as_ptr()) };
if tz == std::ptr::null_mut() {
return Err(std::io::Error::last_os_error());
}
let time: TimeT = 127810800;
let mut tm = MaybeUninit::<Tm>::uninit();
let ret = unsafe { localtime_rz(tz, &time, tm.as_mut_ptr()) };
if ret == std::ptr::null_mut() {
return Err(std::io::Error::last_os_error());
}
let tm = unsafe { tm.assume_init() };
let zone: &str = unsafe { CStr::from_ptr(tm.tm_zone).to_str().expect("correct utf8") };
assert_eq!((tm.tm_sec, tm.tm_min, tm.tm_hour, tm.tm_mday, tm.tm_mon),
(0, 0, 3, 19, 0, ));
assert_eq!((tm.tm_year, tm.tm_wday, tm.tm_yday, tm.tm_isdst, tm.tm_gmtoff, zone),
(74, 6, 18, 1, -14400, "EDT"));
let time_again = unsafe { mktime_z(tz, &tm) }; // Round trip
if time_again == -1 {
// Didn't work (errno is not reliably set in this case)
} else {
assert_eq!(time_again, time);
}
unsafe { tzfree(tz) };
# Ok(())
状态
这是一段较新的代码,设计为libtz
的后端。它可能会迅速变化。
许可证
Rust代码根据MIT许可证分发。
libtz代码基本上是公共领域,有几个文件使用BSD-3条款许可证。
请参阅 LICENSE.md 了解详情。