sqldatetime 0.1.38

SQL date/time types written in Rust
Documentation
use libc::{time_t, tm};
use std::time::{SystemTime, UNIX_EPOCH};

#[derive(Copy, Clone)]
pub struct Local {
    year: i32,
    month: u32,
    day: u32,
    hour: u32,
    minute: u32,
    second: u32,
    usec: u32,
}

impl Local {
    #[inline]
    pub fn now() -> Self {
        let now = SystemTime::now()
            .duration_since(UNIX_EPOCH)
            .expect("system time before Unix epoch");

        let res = local_time(now.as_secs() as time_t);
        Local {
            year: res.tm_year + 1900,
            month: (res.tm_mon + 1) as u32,
            day: res.tm_mday as u32,
            hour: res.tm_hour as u32,
            minute: res.tm_min as u32,
            second: res.tm_sec as u32,
            usec: now.subsec_micros(),
        }
    }

    #[inline]
    pub fn year(&self) -> i32 {
        self.year
    }

    #[inline]
    pub fn month(&self) -> u32 {
        self.month
    }

    #[inline]
    pub fn day(&self) -> u32 {
        self.day
    }

    #[inline]
    pub fn hour(&self) -> u32 {
        self.hour
    }

    #[inline]
    pub fn minute(&self) -> u32 {
        self.minute
    }

    #[inline]
    pub fn second(&self) -> u32 {
        self.second
    }

    #[inline]
    pub fn usec(&self) -> u32 {
        self.usec
    }
}

#[cfg(unix)]
fn local_time(time: time_t) -> tm {
    use libc::{c_char, localtime_r};

    let mut res = tm {
        tm_sec: 0,
        tm_min: 0,
        tm_hour: 0,
        tm_mday: 0,
        tm_mon: 0,
        tm_year: 0,
        tm_wday: 0,
        tm_yday: 0,
        tm_isdst: 0,
        tm_gmtoff: 0,
        tm_zone: std::ptr::null::<c_char>(),
    };
    unsafe {
        localtime_r(&time, &mut res);
    }
    res
}

#[cfg(windows)]
fn local_time(time: time_t) -> tm {
    use libc::localtime_s;

    let mut res = tm {
        tm_sec: 0,
        tm_min: 0,
        tm_hour: 0,
        tm_mday: 0,
        tm_mon: 0,
        tm_year: 0,
        tm_wday: 0,
        tm_yday: 0,
        tm_isdst: 0,
    };
    unsafe {
        localtime_s(&mut res, &time);
    }
    res
}