rsiot/message/
timestamp.rs

1use chrono::{DateTime, Datelike, FixedOffset, Local, Timelike, Weekday};
2use serde::{Deserialize, Serialize};
3
4/// Метка времени
5///
6/// Тип на основе `chrono::DateTime<FixedOffset>`. По-умолчанию создается текущая метка времени.
7#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
8pub struct Timestamp(pub DateTime<FixedOffset>);
9
10impl Timestamp {
11    /// Преобразовать в строку с заданным форматом
12    pub fn format(&self, fmt: &str) -> String {
13        self.0.format(fmt).to_string()
14    }
15
16    /// Returns an RFC 3339 and ISO 8601 date and time string such as `1996-12-19T16:39:57-08:00`.
17    pub fn to_rfc3339(&self) -> String {
18        self.0.to_rfc3339()
19    }
20
21    /// Возвращает время Unix с наносекундной точностью
22    pub fn timestamp_nanos_opt(&self) -> Option<i64> {
23        self.0.timestamp_nanos_opt()
24    }
25
26    /// Возвращает номер дня недели. 1 = понедельник, 7 = воскресенье
27    pub fn weekday(&self) -> u8 {
28        match self.0.weekday() {
29            Weekday::Mon => 1,
30            Weekday::Tue => 2,
31            Weekday::Wed => 3,
32            Weekday::Thu => 4,
33            Weekday::Fri => 5,
34            Weekday::Sat => 6,
35            Weekday::Sun => 7,
36        }
37    }
38
39    /// Часы
40    pub fn hour(&self) -> u32 {
41        self.0.hour()
42    }
43
44    /// Минуты
45    pub fn minute(&self) -> u32 {
46        self.0.minute()
47    }
48
49    /// Секунды
50    pub fn second(&self) -> u32 {
51        self.0.second()
52    }
53}
54
55/// TODO - вместо Utc использовать местный часовой пояс?
56impl Default for Timestamp {
57    fn default() -> Self {
58        Self(Local::now().into())
59    }
60}
61
62impl PartialOrd for Timestamp {
63    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
64        self.0.partial_cmp(&other.0)
65    }
66}