tz-rs

A pure Rust reimplementation of libc functions localtime, gmtime and mktime.

Usage

Construct a time zone object

```rust let unix_time = 946684800; // 2000-01-01T00:00:00Z

// Get UTC time zone
let time_zone_utc = TimeZone::utc();
assert_eq!(time_zone_utc.find_local_time(unix_time)?.ut_offset(), 0);

// Get fixed time zone at GMT-1
let time_zone_fixed = TimeZone::fixed(-3600);
assert_eq!(time_zone_fixed.find_local_time(unix_time)?.ut_offset(), -3600);

// Get local time zone
TimeZone::local()?;

// Get time zone from a TZ string:
// From an absolute file
let _ = TimeZone::from_posix_tz("/usr/share/zoneinfo/Pacific/Auckland");
// From a file relative to the system timezone directory
let _ = TimeZone::from_posix_tz("Pacific/Auckland");
// From a time zone description
TimeZone::from_posix_tz("HST10")?;
TimeZone::from_posix_tz("<-03>3")?;
TimeZone::from_posix_tz("NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0")?;

```

Construct a date time object

```rust // Create a new UTC date time let utcdatetime = UtcDateTime::new(2000, 0, 1, 0, 0, 0)?; // 2000-01-01T00:00:00Z let datetime = utcdatetime.todatetime(); asserteq!(datetime.second(), 0); asserteq!(datetime.minute(), 0); asserteq!(datetime.hour(), 0); asserteq!(datetime.monthday(), 1); asserteq!(datetime.month(), 0); asserteq!(datetime.year(), 100); asserteq!(datetime.fullyear(), 2000); asserteq!(datetime.weekday(), 6); asserteq!(datetime.yearday(), 0); asserteq!(datetime.localtime().ut_offset(), 0);

// Create a date time from a time zone and an UTC date time
let time_zone_fixed = TimeZone::fixed(-3600);

let utc_date_time = UtcDateTime::new(2000, 0, 1, 0, 0, 0)?; // 2000-01-01T00:00:00Z
let date_time = DateTime::from_utc_date_time(&time_zone_fixed, utc_date_time)?;
assert_eq!(date_time.second(), 0);
assert_eq!(date_time.minute(), 0);
assert_eq!(date_time.hour(), 23);
assert_eq!(date_time.month_day(), 31);
assert_eq!(date_time.month(), 11);
assert_eq!(date_time.year(), 99);
assert_eq!(date_time.full_year(), 1999);
assert_eq!(date_time.week_day(), 5);
assert_eq!(date_time.year_day(), 364);
assert_eq!(date_time.local_time().ut_offset(), -3600);

// Create a date time from a time zone and an unix time
let date_time = DateTime::from_unix_time(&time_zone_fixed, 946684800)?; // 2000-01-01T00:00:00Z
assert_eq!(date_time.second(), 0);
assert_eq!(date_time.minute(), 0);
assert_eq!(date_time.hour(), 23);
assert_eq!(date_time.month_day(), 31);
assert_eq!(date_time.month(), 11);
assert_eq!(date_time.year(), 99);
assert_eq!(date_time.full_year(), 1999);
assert_eq!(date_time.week_day(), 5);
assert_eq!(date_time.year_day(), 364);
assert_eq!(date_time.local_time().ut_offset(), -3600);

// Get the corresponding UTC unix time
let unix_time = date_time.unix_time();
assert_eq!(unix_time, 946684800);

```

License

This project is licensed under either of

at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in time by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.