use chrono::{Date, DateTime, Datelike, Duration, TimeZone, Weekday};
use std::ops::Sub;
#[cfg(test)]
mod test {
use super::*;
use chrono::Utc;
#[test]
fn begin_of_week_from_monday_test() {
let date = Utc.ymd(2008, 8, 8);
let actual = Utc.ymd(2008, 8, 4);
let result = begin_of_week(date, Weekday::Mon);
assert_eq!(result, actual);
}
#[test]
fn begin_of_week_from_sunday_test() {
let date = Utc.ymd(2008, 8, 8);
let actual = Utc.ymd(2008, 8, 3);
let result = begin_of_week(date, Weekday::Sun);
assert_eq!(result, actual);
}
}
pub fn begin_of_week<Tz: TimeZone>(date: Date<Tz>, from: Weekday) -> Date<Tz> {
let date_weekday = date.weekday();
let num = date_weekday.number_from_monday();
let num2 = from.number_from_monday();
let diff = (num + 7 - num2) % 7;
date.sub(Duration::days(diff as i64))
}
pub fn begin_of_week_with_time<Tz: TimeZone>(datetime: DateTime<Tz>, from: Weekday) -> Date<Tz> {
begin_of_week(datetime.date(), from)
}