time_systems 0.1.1

A library for basic time system operations in Rust
Documentation
pub fn iso_string_to_date_time_array(iso_string: &str) -> [f64; 6] {
    let year = iso_string[0..4].parse::<f64>().unwrap();
    let month = iso_string[5..7].parse::<f64>().unwrap();
    let day = iso_string[8..10].parse::<f64>().unwrap();
    let hour = iso_string[11..13].parse::<f64>().unwrap();
    let minute = iso_string[14..16].parse::<f64>().unwrap();
    let second = iso_string[17..23].parse::<f64>().unwrap();
    [year, month, day, hour, minute, second]
}

pub fn iso_string_to_julian_date(iso_string: &str) -> f64 {
    let date_time_array = iso_string_to_date_time_array(iso_string);
    let mut year = date_time_array[0];
    let mut month = date_time_array[1];
    let day = date_time_array[2];
    let hour = date_time_array[3];
    let minute = date_time_array[4];
    let second = date_time_array[5];
    if month <= 2.0 {
        year -= 1.0;
        month += 12.0;
    }
    let mut s_den = 60.0;
    if is_leap_second_day(iso_string) {
        s_den = 61.0;
    }
    let int_yr_div_100 = (year / 100.0).floor();
    let b = 2.0 - int_yr_div_100 + (int_yr_div_100 / 4.0).floor();
    let c = ((second / s_den + minute) / 60.0 + hour) / 24.0;
    (365.25 * (year + 4716.0)).floor() + (30.6001 * (month + 1.0)).floor() + day + b - 1524.5 + c
}

pub fn is_leap_second_day(iso_string: &str) -> bool {
    matches!(
        &iso_string[0..10],
        "2016-12-31"
            | "2015-06-30"
            | "2012-06-30"
            | "2008-12-31"
            | "2005-12-31"
            | "1998-12-31"
            | "1997-06-30"
            | "1995-12-31"
            | "1994-06-30"
            | "1993-06-30"
            | "1992-06-30"
            | "1990-12-31"
            | "1989-12-31"
            | "1987-12-31"
            | "1985-06-30"
            | "1983-06-30"
            | "1982-06-30"
            | "1981-06-30"
            | "1979-12-31"
            | "1978-12-31"
            | "1977-12-31"
            | "1976-12-31"
            | "1975-12-31"
            | "1974-12-31"
            | "1973-12-31"
            | "1972-12-31"
            | "1972-06-30"
    )
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_iso_string_to_date_time_array() {
        assert_eq!(
            iso_string_to_date_time_array("2021-01-01T00:00:00.000000Z"),
            [2021.0, 1.0, 1.0, 0.0, 0.0, 0.0]
        );
        assert_eq!(
            iso_string_to_date_time_array("2021-01-01T00:00:00.000000Z"),
            [2021.0, 1.0, 1.0, 0.0, 0.0, 0.0]
        );
        assert_eq!(
            iso_string_to_date_time_array("2021-01-01T00:00:00.000000Z"),
            [2021.0, 1.0, 1.0, 0.0, 0.0, 0.0]
        );
    }

    #[test]
    fn test_iso_string_to_julian_date() {
        assert_eq!(
            iso_string_to_julian_date("2021-01-01T00:00:00.000000Z"),
            2459215.5
        );
        assert_eq!(
            iso_string_to_julian_date("1996-10-26T14:20:00.000000Z"),
            2450383.097222222
        );
    }
}