proto_types/duration/
duration_data.rs1use super::data::{Days, Hours, Minutes, Months, Seconds, Weeks, Years};
2use crate::Duration;
3
4const SECONDS_PER_MINUTE: u64 = 60;
5const SECONDS_PER_HOUR: u64 = 3600;
6const SECONDS_PER_DAY: u64 = 86400;
7const SECONDS_PER_WEEK: u64 = 604800;
8const SECONDS_PER_MONTH_AVG: u64 = 2_629_746;
9const SECONDS_PER_YEAR_AVG: u64 = 31_556_952;
10
11#[derive(Debug, Default, Clone)]
13pub struct DurationData {
14 pub years: Years,
15 pub months: Months,
16 pub weeks: Weeks,
17 pub days: Days,
18 pub hours: Hours,
19 pub minutes: Minutes,
20 pub seconds: Seconds,
21 pub is_negative: bool,
22}
23
24impl Duration {
25 pub fn is_negative(&self) -> bool {
27 self.normalized().seconds < 0
28 }
29
30 pub fn get_data(&self) -> DurationData {
32 let mut total_seconds = self.seconds.unsigned_abs();
33 let years = Years {
34 value: total_seconds / SECONDS_PER_YEAR_AVG,
35 };
36 total_seconds %= SECONDS_PER_YEAR_AVG;
37
38 let months = Months {
39 value: total_seconds / SECONDS_PER_MONTH_AVG,
40 };
41 total_seconds %= SECONDS_PER_MONTH_AVG;
42
43 let weeks = Weeks {
44 value: total_seconds / SECONDS_PER_WEEK,
45 };
46 total_seconds %= SECONDS_PER_WEEK;
47
48 let days = Days {
49 value: total_seconds / SECONDS_PER_DAY,
50 };
51 total_seconds %= SECONDS_PER_DAY;
52
53 let hours = Hours {
54 value: total_seconds / SECONDS_PER_HOUR,
55 };
56 total_seconds %= SECONDS_PER_HOUR;
57
58 let minutes = Minutes {
59 value: total_seconds / SECONDS_PER_MINUTE,
60 };
61 let seconds = Seconds {
62 value: total_seconds % SECONDS_PER_MINUTE,
63 };
64
65 DurationData {
66 years,
67 months,
68 weeks,
69 days,
70 hours,
71 minutes,
72 seconds,
73 is_negative: self.is_negative(),
74 }
75 }
76}