bson_oid_timestamp/
lib.rs

1use chrono::NaiveDateTime;
2
3//
4pub fn timestamp(bytes: &[u8; 12]) -> NaiveDateTime {
5    // https://github.com/mongodb/bson-rust/blob/v2.4.0/src/oid.rs#L156
6    let seconds_since_epoch = u32::from_be_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]);
7    NaiveDateTime::from_timestamp_opt(seconds_since_epoch as i64, 0)
8        .expect("invalid or out-of-range datetime")
9}
10
11#[cfg(test)]
12mod tests {
13    use super::*;
14
15    use chrono::Utc;
16
17    #[test]
18    fn test_for_crate_bson() {
19        // https://github.com/mongodb/bson-rust/blob/v2.4.0/src/oid.rs#L329
20        let v = "FFFFFFFF0000000000000000"
21            .parse::<bson::oid::ObjectId>()
22            .unwrap();
23        assert_eq!(
24            timestamp(&v.bytes()),
25            NaiveDateTime::parse_from_str("2106-02-07T06:28:15UTC", "%Y-%m-%dT%H:%M:%S%Z").unwrap()
26        );
27
28        //
29        let dt_start = Utc::now().naive_utc();
30        let dt = timestamp(&bson::oid::ObjectId::new().bytes());
31        let dt_end = Utc::now().naive_utc();
32        assert!(dt_start.timestamp() <= dt.timestamp());
33        assert!(dt.timestamp() <= dt_end.timestamp());
34    }
35}