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;