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