kairos/
util.rs

1#[inline]
2pub fn adjust_times_add(
3    mut y: i64,
4    mut mo: i64,
5    mut d: i64,
6    mut h: i64,
7    mut mi: i64,
8    mut s: i64,
9) -> (i64, i64, i64, i64, i64, i64) {
10    // Subtract $border from the $base as long as the $base is bigger or equal to the $border.
11    // The number of subtractions are added to $next.
12    macro_rules! fix {
13        {
14            $base:ident,
15            $border:expr,
16            $next:ident
17        } => {
18            $next += ($base - ($base % $border)) / $border;
19            $base %= $border;
20        }
21    }
22
23    fix! { s , 60, mi }
24    fix! { mi, 60, h  }
25    fix! { h , 24, d  }
26
27    while d > get_num_of_days_in_month(y, mo) {
28        d -= get_num_of_days_in_month(y, mo);
29        mo += 1;
30    }
31
32    while mo > 12 {
33        y += 1;
34        mo -= 12;
35    }
36
37    (y, mo, d, h, mi, s)
38}
39
40#[inline]
41pub fn adjust_times_sub(
42    mut y: i64,
43    mut mo: i64,
44    mut d: i64,
45    mut h: i64,
46    mut mi: i64,
47    mut s: i64,
48) -> (i64, i64, i64, i64, i64, i64) {
49    if s < 0 {
50        mi -= (s.abs() / 60) + 1;
51        s = 60 - (0 - s).abs();
52    }
53
54    if mi < 0 {
55        h -= (mi.abs() / 60) + 1;
56        mi = 60 - (0 - mi).abs();
57    }
58
59    if h < 0 {
60        d -= (h.abs() / 24) + 1;
61        h = 24 - (0 - h).abs();
62    }
63
64    if d < 1 {
65        mo -= (d.abs() / 32) + 1;
66        d = 31 - (0 - d).abs();
67    }
68
69    if mo < 1 {
70        y -= (mo.abs() / 13) + 1;
71        mo = 12 - (0 - mo).abs();
72    }
73
74    (y, mo, d, h, mi, s)
75}
76
77#[inline]
78pub fn get_num_of_days_in_month(y: i64, m: i64) -> i64 {
79    if m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12 {
80        31
81    } else if m == 2 {
82        if is_leap_year(y as i32) {
83            29
84        } else {
85            28
86        }
87    } else {
88        30
89    }
90}
91
92#[inline]
93pub fn is_leap_year(y: i32) -> bool {
94    (y % 4 == 0) && (y % 100 != 0 || y % 400 == 0)
95}
96
97#[test]
98fn test_is_leap_year() {
99    let leaps = [
100        1880, 1884, 1888, 1892, 1896, 1904, 1908, 1912, 1916, 1920, 1924, 1928, 1932, 1936, 1940, 1944, 1948, 1952,
101        1956, 1960, 1964, 1968, 1972, 1976, 1980, 1984, 1988, 1992, 1996, 2000, 2004, 2008, 2012, 2020, 2024, 2028,
102        2032, 2036, 2040, 2044, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2104,
103        2108, 2112, 2116, 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176,
104        2180, 2184, 2188, 2192, 2196, 2204, 2208,
105    ];
106
107    for i in leaps.iter() {
108        assert!(is_leap_year(*i), "Is no leap year: {}", i);
109        assert!(
110            !is_leap_year(*i + 1),
111            "Seems to be leap year: {}, but should not be",
112            i + 1
113        );
114    }
115}
116
117#[test]
118fn test_get_num_of_days_in_month() {
119    assert_eq!(31, get_num_of_days_in_month(2000, 1));
120    assert_eq!(29, get_num_of_days_in_month(2000, 2));
121    assert_eq!(31, get_num_of_days_in_month(2000, 3));
122    assert_eq!(30, get_num_of_days_in_month(2000, 4));
123    assert_eq!(31, get_num_of_days_in_month(2000, 5));
124    assert_eq!(30, get_num_of_days_in_month(2000, 6));
125    assert_eq!(31, get_num_of_days_in_month(2000, 7));
126    assert_eq!(31, get_num_of_days_in_month(2000, 8));
127    assert_eq!(30, get_num_of_days_in_month(2000, 9));
128    assert_eq!(31, get_num_of_days_in_month(2000, 10));
129    assert_eq!(30, get_num_of_days_in_month(2000, 11));
130    assert_eq!(31, get_num_of_days_in_month(2000, 12));
131
132    assert_eq!(31, get_num_of_days_in_month(2001, 1));
133    assert_eq!(28, get_num_of_days_in_month(2001, 2));
134    assert_eq!(31, get_num_of_days_in_month(2001, 3));
135    assert_eq!(30, get_num_of_days_in_month(2001, 4));
136    assert_eq!(31, get_num_of_days_in_month(2001, 5));
137    assert_eq!(30, get_num_of_days_in_month(2001, 6));
138    assert_eq!(31, get_num_of_days_in_month(2001, 7));
139    assert_eq!(31, get_num_of_days_in_month(2001, 8));
140    assert_eq!(30, get_num_of_days_in_month(2001, 9));
141    assert_eq!(31, get_num_of_days_in_month(2001, 10));
142    assert_eq!(30, get_num_of_days_in_month(2001, 11));
143    assert_eq!(31, get_num_of_days_in_month(2001, 12));
144
145    assert_eq!(31, get_num_of_days_in_month(2002, 1));
146    assert_eq!(28, get_num_of_days_in_month(2002, 2));
147    assert_eq!(31, get_num_of_days_in_month(2002, 3));
148    assert_eq!(30, get_num_of_days_in_month(2002, 4));
149    assert_eq!(31, get_num_of_days_in_month(2002, 5));
150    assert_eq!(30, get_num_of_days_in_month(2002, 6));
151    assert_eq!(31, get_num_of_days_in_month(2002, 7));
152    assert_eq!(31, get_num_of_days_in_month(2002, 8));
153    assert_eq!(30, get_num_of_days_in_month(2002, 9));
154    assert_eq!(31, get_num_of_days_in_month(2002, 10));
155    assert_eq!(30, get_num_of_days_in_month(2002, 11));
156    assert_eq!(31, get_num_of_days_in_month(2002, 12));
157
158    assert_eq!(31, get_num_of_days_in_month(2003, 1));
159    assert_eq!(28, get_num_of_days_in_month(2003, 2));
160    assert_eq!(31, get_num_of_days_in_month(2003, 3));
161    assert_eq!(30, get_num_of_days_in_month(2003, 4));
162    assert_eq!(31, get_num_of_days_in_month(2003, 5));
163    assert_eq!(30, get_num_of_days_in_month(2003, 6));
164    assert_eq!(31, get_num_of_days_in_month(2003, 7));
165    assert_eq!(31, get_num_of_days_in_month(2003, 8));
166    assert_eq!(30, get_num_of_days_in_month(2003, 9));
167    assert_eq!(31, get_num_of_days_in_month(2003, 10));
168    assert_eq!(30, get_num_of_days_in_month(2003, 11));
169    assert_eq!(31, get_num_of_days_in_month(2003, 12));
170
171    assert_eq!(31, get_num_of_days_in_month(2004, 1));
172    assert_eq!(29, get_num_of_days_in_month(2004, 2));
173    assert_eq!(31, get_num_of_days_in_month(2004, 3));
174    assert_eq!(30, get_num_of_days_in_month(2004, 4));
175    assert_eq!(31, get_num_of_days_in_month(2004, 5));
176    assert_eq!(30, get_num_of_days_in_month(2004, 6));
177    assert_eq!(31, get_num_of_days_in_month(2004, 7));
178    assert_eq!(31, get_num_of_days_in_month(2004, 8));
179    assert_eq!(30, get_num_of_days_in_month(2004, 9));
180    assert_eq!(31, get_num_of_days_in_month(2004, 10));
181    assert_eq!(30, get_num_of_days_in_month(2004, 11));
182    assert_eq!(31, get_num_of_days_in_month(2004, 12));
183}