From 1c0602fa00b58299ba21740d1b76bf1312b5d5ee Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Tue, 19 Jun 2018 14:01:45 -0700 Subject: [PATCH] Part 1: Add {From,To}Millis. I think this is just oversight. Generally, we should anticipate what our consumers need to do to interact with Mentat, and producing milli- and micro-second timestamps is part of that need. --- edn/src/lib.rs | 2 ++ edn/src/types.rs | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/edn/src/lib.rs b/edn/src/lib.rs index f9c57c94..2d3d7037 100644 --- a/edn/src/lib.rs +++ b/edn/src/lib.rs @@ -57,9 +57,11 @@ pub use parse::ParseError; pub use uuid::ParseError as UuidParseError; pub use types::{ FromMicros, + FromMillis, Span, SpannedValue, ToMicros, + ToMillis, Value, ValueAndSpan, }; diff --git a/edn/src/types.rs b/edn/src/types.rs index 27b46e4c..51319db1 100644 --- a/edn/src/types.rs +++ b/edn/src/types.rs @@ -649,6 +649,28 @@ impl ToMicros for DateTime { } } +pub trait FromMillis { + fn from_millis(ts: i64) -> Self; +} + +impl FromMillis for DateTime { + fn from_millis(ts: i64) -> Self { + Utc.timestamp(ts / 1_000, ((ts % 1_000).abs() as u32) * 1_000) + } +} + +pub trait ToMillis { + fn to_millis(&self) -> i64; +} + +impl ToMillis for DateTime { + fn to_millis(&self) -> i64 { + let major: i64 = self.timestamp() * 1_000; + let minor: i64 = self.timestamp_subsec_millis() as i64; + major + minor + } +} + #[cfg(test)] mod test { extern crate chrono;