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 End<'a> {
    date_time: &'a DateTime
}

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

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

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

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

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

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

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

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

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