Skip to main content

rstime/
lib.rs

1use std::{time::{SystemTime, UNIX_EPOCH}};
2
3
4/// 时间戳对象,存储从 UNIX 纪元起经过的秒数、微秒数和纳秒数。
5//时间戳对象
6pub struct Timestamp {
7    pub timestamp_s: u64,  // 存数值而不是 SystemTime
8    pub timestamp_ms:u128,
9    pub timestamp_ns:u128,
10}
11
12impl Default for Timestamp {
13    fn default() -> Self {
14        Timestamp {
15            timestamp_s: 0,
16            timestamp_ms: 0,
17            timestamp_ns: 0,
18        }
19    }
20}
21
22impl Timestamp {
23    /// 创建一个默认的 `Timestamp` 实例(所有字段初始化为 0)。
24    //使用默认宏赋予实例参数
25    pub fn new() -> Self {Timestamp::default()}
26
27    /// 获取当前时间戳,填充秒、微秒、纳秒字段。
28    //获取时间戳
29    pub fn get_timestamp(mut self) -> Self{
30        let d_timestamp =SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
31        let timestamp_s_temp=d_timestamp.as_secs();
32        let timestamp_ms_temp =d_timestamp.as_micros();
33        let timestamp_ns_temp =d_timestamp.as_nanos();
34
35        self.timestamp_s=timestamp_s_temp;
36        self.timestamp_ms=timestamp_ms_temp;
37        self.timestamp_ns=timestamp_ns_temp;
38
39        self
40    }
41}
42
43/// 日期时间对象,存储年、月、日、时、分、秒及 UTC+8 时区偏移后的本地时间。
44//datetime对象
45pub struct Time {
46    pub year:i32,
47    pub mouth:i8,
48    pub day:i8,
49    pub hour:i8,
50    pub minute:i8,
51    pub secend:i8,
52    timezone_offset:i32,  // 时区偏移量(秒),默认 UTC+8
53}
54
55impl Default for Time {
56    fn default() -> Self {
57        Time {
58            year: 0,
59            mouth: 0,
60            day: 0,
61            hour: 0,
62            minute: 0,
63            secend: 0,
64            timezone_offset: 8 * 3600,
65        }
66    }
67}
68
69impl Time {
70    /// 创建一个默认的 `Time` 实例(所有字段初始化为 0,时区默认 UTC+8)。
71    //创建实例
72    pub fn new () ->Self{Time::default()}
73    /// 判断当前年份是否为闰年。
74    //判断是否为闰年
75    pub fn is_leap_year(&self) -> bool {
76        if self.year % 400 == 0 {
77            true
78        } else if self.year % 100 == 0 {
79            false
80        } else if self.year % 4 == 0 {
81            true
82        } else {
83            false
84        }
85    }
86
87    /// 修改时区偏移量,单位为小时(如传入 `8` 表示 UTC+8,传入 `-5` 表示 UTC-5)。
88    //修改时区偏移量,单位为小时
89    pub fn set_timezone(mut self, hours: i32) -> Self {
90        self.timezone_offset = hours * 3600;
91        self
92    }
93
94    /// 获取当前日期时间,按配置的时区转换为年/月/日/时/分/秒。
95    pub fn get_time(mut self) -> Self{
96        let t = Timestamp::new().get_timestamp().timestamp_s as i128;
97
98        // 加上时区偏移
99        let t = t + self.timezone_offset as i128;
100
101        //时间戳里完整的天数
102        let mut days = t / 86400;
103        //除下完整天数,余下的秒数
104        let other_s = t % 86400;
105
106        // 时分秒
107        let hour = (other_s / 3600) as i8;
108        let minute = ((other_s % 3600) / 60) as i8;
109        let second = (other_s % 60) as i8;
110
111        // 从1970年开始算年
112        let mut year: i32 = 1970;
113        loop {
114            self.year = year;
115            //根据是否为闰年,给年中天数赋值
116            let days_in_year = if self.is_leap_year() { 366 } else { 365 };
117            //如果剩下的天数少于这一年的年中天数,停止,否则天数-该年中天数,年份+1
118            if days < days_in_year { break; }
119            days -= days_in_year;
120            year += 1;
121        }
122
123        // 算月日
124        self.year = year;
125        let month_days = if self.is_leap_year() {
126            [31,29,31,30,31,30,31,31,30,31,30,31]
127        } else {
128            [31,28,31,30,31,30,31,31,30,31,30,31]
129        };
130
131        let mut month: i8 = 1;
132        for &md in &month_days {
133            //如果剩下的天数少于这一月的月中天数,停止,否则,天数-该月中天数,月份+1
134            if days < md { break; }
135            days -= md;
136            month += 1;
137        }
138
139        let day = (days + 1) as i8;
140
141        self.year = year;
142        self.mouth = month;
143        self.day = day;
144        self.hour = hour;
145        self.minute = minute;
146        self.secend = second;
147
148        self
149    }
150}