1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
//! Utility functions. use crate::Month; /// Whether to adjust the date, and in which direction. Useful when implementing arithmetic. pub(crate) enum DateAdjustment { /// The previous day should be used. Previous, /// The next day should be used. Next, /// The date should be used as-is. None, } /// Get the number of days in the month of a given year. /// /// ```rust /// # use time::{Month, util}; /// assert_eq!(util::days_in_year_month(2020, Month::February), 29); /// ``` pub const fn days_in_year_month(year: i32, month: Month) -> u8 { use Month::*; match month { January | March | May | July | August | October | December => 31, April | June | September | November => 30, February if is_leap_year(year) => 29, February => 28, } } /// Returns if the provided year is a leap year in the proleptic Gregorian calendar. Uses /// [astronomical year numbering](https://en.wikipedia.org/wiki/Astronomical_year_numbering). /// /// ```rust /// # use time::util::is_leap_year; /// assert!(!is_leap_year(1900)); /// assert!(is_leap_year(2000)); /// assert!(is_leap_year(2004)); /// assert!(!is_leap_year(2005)); /// assert!(!is_leap_year(2100)); /// ``` pub const fn is_leap_year(year: i32) -> bool { year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) } /// Get the number of calendar days in a given year. /// /// The returned value will always be either 365 or 366. /// /// ```rust /// # use time::util::days_in_year; /// assert_eq!(days_in_year(1900), 365); /// assert_eq!(days_in_year(2000), 366); /// assert_eq!(days_in_year(2004), 366); /// assert_eq!(days_in_year(2005), 365); /// assert_eq!(days_in_year(2100), 365); /// ``` pub const fn days_in_year(year: i32) -> u16 { if is_leap_year(year) { 366 } else { 365 } } /// Get the number of weeks in the ISO year. /// /// The returned value will always be either 52 or 53. /// /// ```rust /// # use time::util::weeks_in_year; /// assert_eq!(weeks_in_year(2019), 52); /// assert_eq!(weeks_in_year(2020), 53); /// ``` pub const fn weeks_in_year(year: i32) -> u8 { match rem_euclid!(year, 400) { 4 | 9 | 15 | 20 | 26 | 32 | 37 | 43 | 48 | 54 | 60 | 65 | 71 | 76 | 82 | 88 | 93 | 99 | 105 | 111 | 116 | 122 | 128 | 133 | 139 | 144 | 150 | 156 | 161 | 167 | 172 | 178 | 184 | 189 | 195 | 201 | 207 | 212 | 218 | 224 | 229 | 235 | 240 | 246 | 252 | 257 | 263 | 268 | 274 | 280 | 285 | 291 | 296 | 303 | 308 | 314 | 320 | 325 | 331 | 336 | 342 | 348 | 353 | 359 | 364 | 370 | 376 | 381 | 387 | 392 | 398 => 53, _ => 52, } }