Skip to main content

polars_utils/
time.rs

1//! Calendar constants and helpers.
2
3pub const DAYS_PER_MONTH: [[i64; 12]; 2] = [
4    //J   F   M   A   M   J   J   A   S   O   N   D
5    [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], // non-leap year
6    [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], // leap year
7];
8
9pub const fn is_leap_year(year: i32) -> bool {
10    year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
11}
12
13/// Get the number of days in the given month of the given year
14pub const fn days_in_month(year: i32, month: u8) -> u8 {
15    DAYS_PER_MONTH[is_leap_year(year) as usize][(month - 1) as usize] as u8
16}
17
18/// nanoseconds per unit
19pub const NS_MICROSECOND: i64 = 1_000;
20pub const NS_MILLISECOND: i64 = 1_000_000;
21pub const NS_SECOND: i64 = 1_000_000_000;
22pub const NS_MINUTE: i64 = 60 * NS_SECOND;
23pub const NS_HOUR: i64 = 60 * NS_MINUTE;
24pub const NS_DAY: i64 = 24 * NS_HOUR;
25pub const NS_WEEK: i64 = 7 * NS_DAY;
26
27/// Not-to-exceed (NTE) nanoseconds per unit, accounting for DST.
28/// This is an upper bound. Leap seconds do not matter for correctness.
29pub const NTE_NS_DAY: i64 = (24 + 1) * NS_HOUR + 1;
30pub const NTE_NS_WEEK: i64 = 6 * NS_DAY + NTE_NS_DAY;