#时区 #本地时间 #接口 #iana #tz #系统 #libtz

sys libtz-sys

是IANA时区库libtz的FFI接口

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

C 7K SLoC // 0.2% comments AWK 1K SLoC // 0.2% comments Korn shell 478 SLoC // 0.1% comments Rust 158 SLoC // 0.0% comments Shell 32 SLoC // 0.1% comments

libtz-sys

Rust的FFI接口,用于IANA的libtz (git仓库)。

这是一个低级库——您可能更倾向于使用libtz,这是一个更符合Rust风格的接口,它建立在之上。

它提供了一个与libc的localtime_r()函数(及相关函数)等效的接口。不同之处在于,这个库被编译成使用Rust的std::env::var_os(),这可以保护它免受std::env::set_var()竞争,否则这可能导致在未提供多线程安全实现的系统上发生段错误。

除此之外,它应该可以作为大多数libc localtime实现的直接替代品。它将读取系统已安装的tzdata文件,以计算诸如闰秒和夏令时等问题。

链接:[文档] [Git仓库] [Crates.io]

用法

将此添加到您的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 了解详情。

依赖项