-
-
Save pmkroeker/4c1b7d7a5b452486a05439ba39788d80 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::convert::TryInto; | |
use chrono::prelude::*; // 0.4.11 | |
pub struct Mondays {} | |
impl Mondays { | |
pub fn count(birth: chrono::NaiveDate, curr_date: chrono::NaiveDate) -> i64 { | |
// start work at age 22 | |
let start_work = birth + chrono::Duration::days(22 * 365); | |
// retire at age 78 | |
let retire = birth + chrono::Duration::days(78 * 365); | |
// check if they have retired or not | |
let end_work = if curr_date > retire { retire } else { curr_date }; | |
// check days from monday, if 0 set to 7 | |
let start_from_monday = match start_work.weekday().num_days_from_monday() { | |
0 => 7, | |
x => x, | |
}; | |
// get first monday | |
let first_monday = start_work + chrono::Duration::days((7 - start_from_monday).try_into().unwrap()); | |
// get last monday | |
let last_monday = end_work - chrono::Duration::days((end_work.weekday().num_days_from_monday()).try_into().unwrap()); | |
// count days between mondays | |
let between_mondays = last_monday.signed_duration_since(first_monday).num_days(); | |
// if more than 7 days, div by 7 | |
if between_mondays > 7 { | |
between_mondays / 7 | |
} else if between_mondays >= 0 { | |
1 | |
} else { | |
0 | |
} | |
} | |
} | |
#[cfg(test)] | |
mod tests { | |
use super::*; | |
#[test] | |
fn test_1() { | |
assert_eq!(Mondays::count(chrono::NaiveDate::from_ymd(1995, 4, 3), chrono::NaiveDate::from_ymd(2017, 4, 3)), 1); | |
} | |
#[test] | |
fn test_2() { | |
assert_eq!(Mondays::count(chrono::NaiveDate::from_ymd(1995, 4, 2), chrono::NaiveDate::from_ymd(2018, 4, 2)), 53); | |
} | |
#[test] | |
fn test_3() { | |
assert_eq!(Mondays::count(chrono::NaiveDate::from_ymd(1995, 4, 2), chrono::NaiveDate::from_ymd(2017, 3, 2)), 0); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment