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
//! a datetime type

/// A simple datetime type.
///
/// This represented as a number of seconds since 12:00 midnight, January 1, 1904, UTC.
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "bytemuck", derive(bytemuck::AnyBitPattern))]
#[repr(transparent)]
pub struct LongDateTime(i64);

impl LongDateTime {
    /// Create with a number of seconds relative to 1904-01-01 00:00.
    pub const fn new(secs: i64) -> Self {
        Self(secs)
    }

    /// The number of seconds since 00:00 1904-01-01, UTC.
    ///
    /// This can be a negative number, which presumably represents a date prior
    /// to the reference date.
    pub const fn as_secs(&self) -> i64 {
        self.0
    }

    /// The representation of this datetime as a big-endian byte array.
    pub const fn to_be_bytes(self) -> [u8; 8] {
        self.0.to_be_bytes()
    }
}

crate::newtype_scalar!(LongDateTime, [u8; 8]);
//TODO: maybe a 'chrono' feature for constructing these sanely?