rsiot/message/
timestamp.rs

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
use chrono::{DateTime, FixedOffset, Timelike, Utc};
use serde::{Deserialize, Serialize};

/// Метка времени
///
/// Тип на основе `chrono::DateTime<FixedOffset>`. По-умолчанию создается текущая метка времени.
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct Timestamp(pub DateTime<FixedOffset>);

impl Timestamp {
    /// Преобразовать в строку с заданным форматом
    pub fn format(&self, fmt: &str) -> String {
        self.0.format(fmt).to_string()
    }

    /// Returns an RFC 3339 and ISO 8601 date and time string such as `1996-12-19T16:39:57-08:00`.
    pub fn to_rfc3339(&self) -> String {
        self.0.to_rfc3339()
    }

    /// Возвращает время Unix с наносекундной точностью
    pub fn timestamp_nanos_opt(&self) -> Option<i64> {
        self.0.timestamp_nanos_opt()
    }

    /// Часы
    pub fn hour(&self) -> u32 {
        self.0.hour()
    }

    /// Минуты
    pub fn minute(&self) -> u32 {
        self.0.minute()
    }
}

/// TODO - вместо Utc использовать местный часовой пояс?
impl Default for Timestamp {
    fn default() -> Self {
        Self(Utc::now().into())
    }
}

impl PartialOrd for Timestamp {
    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
        self.0.partial_cmp(&other.0)
    }
}