Rust FFI interface for IANA's libtz (git repository).
This is a low level library---You will most likely prefer libtz, a more idomatic Rust interface built on top of this.
This provides an equivalent of libc's localtime_r()
function (and related
functions). The difference is that this library has been compiled such that the
getenv("TZ")
call uses Rust's std::env::var_os()
which protects it from
std::env::set_var()
races which could otherwise cause segfaults on systems
that don't provide multithread safe implementations of getenv()
and
setenv()
.
Aside from that it should be a drop in replacement for most libc localtime implementations. It will read the tzdata files that the system has installed to calculate things like leap seconds and daylight saving time.
Links: [[Documentation](https://docs.rs/libtz-sys/latest)] [[Git Repository](https://github.com/caldwell/libtz-sys)] [[Crates.io](https://crates.io/crates/libtz-sys)]
Add this to your Cargo.toml
:
toml
[dependencies]
libtz-sys = "0.2"
```rust use std::ffi::{CString,CStr}; use std::mem::MaybeUninit; use libtzsys::{tzalloc, localtimerz, mktime_z, tzfree, TimeT, Tm};
let tzname = CString::new("America/NewYork").unwrap();
let tz = unsafe { tzalloc(tzname.asptr()) };
if tz == std::ptr::nullmut() {
return Err(std::io::Error::lastoserror());
}
let time: TimeT = 127810800;
let mut tm = MaybeUninit::
let timeagain = unsafe { mktimez(tz, &tm) }; // Round trip if timeagain == -1 { // Didn't work (errno is not reliably set in this case) } else { asserteq!(time_again, time); } unsafe { tzfree(tz) };
```
This is young code and designed to be a backend for
libtz
. It may change rapidly.
The Rust code is distributed under the MIT license.
The libtz code is mostly public domain with a couple files using the BSD-3 clause license.
See LICENSE.md for details.