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
);
}
}