bcdt/
lib.rs

1
2use time::PrimitiveDateTime;
3use std::mem::transmute;
4
5pub fn encode_datetime(epoch: i64) -> [u8; 4] {
6    let dt = time::OffsetDateTime::from_unix_timestamp(epoch).unwrap();
7
8    let mut ym : u8 = (dt.year() - 2022) as u8;
9    ym <<= 4;
10    ym |= dt.month() as u8;
11
12    let d = dt.day() as u8;
13    let h = dt.hour() as u8;
14    let m = dt.minute() as u8;
15
16    return [ym, d, h, m];
17}
18
19pub fn decode_datetime(datetime: [u8; 4]) -> i64 {
20    let y8 = (datetime[0] & (15 << 4)) >> 4;
21    let m8 = datetime[0] & 15;
22
23    let y = y8 as i32 + 2022;
24    let mm: time::Month = unsafe { transmute(m8 as u8) };
25    let d = datetime[1];
26    let h = datetime[2];
27    let m = datetime[3];
28
29    let date = time::Date::from_calendar_date(y, mm, d).unwrap();
30    let time = time::Time::from_hms(h, m, 0).unwrap();
31
32    return PrimitiveDateTime::new(date, time).assume_utc().unix_timestamp();
33}