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
use super::{DateTime, CarbonDuration, zeller_congurence};

pub struct Start<'a> {
    date_time: &'a DateTime
}

impl<'a> Start<'a> {
    pub fn new(dt: &'a DateTime) -> Start {
        Start {
            date_time: dt
        }
    }
}

impl<'a> CarbonDuration for Start<'a> {
    fn month(&self) -> DateTime {
        let mut copied_tm = self.date_time.tm;
        copied_tm.tm_mday = 1;

        copied_tm.tm_wday = zeller_congurence(
            self.date_time.tm.tm_year as f32,
            self.date_time.tm.tm_mon as f32,
            1.0
        );

        match self.date_time.tm.tm_mon {
            0 => copied_tm.tm_yday = 0,
            _ => {
                let mut yday = 0;
                for m in 0..self.date_time.tm.tm_mon {
                    yday += self.date_time.days_in_month(m);
                }
                copied_tm.tm_yday = yday;
            }
        }

        DateTime::create_from_tm(copied_tm).start_of().day()
    }

    fn day(&self) -> DateTime {
        let mut copied_tm = self.date_time.tm;
        copied_tm.tm_hour = 0;
        DateTime::create_from_tm(copied_tm).start_of().hour()
    }

    fn hour(&self) -> DateTime {
        let mut copied_tm = self.date_time.tm;
        copied_tm.tm_min = 0;
        DateTime::create_from_tm(copied_tm).start_of().minute()
    }

    fn minute(&self) -> DateTime {
        let mut copied_tm = self.date_time.tm;
        copied_tm.tm_sec = 0;
        DateTime::create_from_tm(copied_tm).start_of().second()
    }

    fn second(&self) -> DateTime {
        let mut copied_tm = self.date_time.tm;
        copied_tm.tm_nsec = 0;
        DateTime::create_from_tm(copied_tm)
    }
}