time/serde/timestamp/
milliseconds_i64.rs1use num_conv::prelude::*;
12use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
13
14use crate::OffsetDateTime;
15
16pub fn serialize<S: Serializer>(
18 datetime: &OffsetDateTime,
19 serializer: S,
20) -> Result<S::Ok, S::Error> {
21 let timestamp = (datetime.unix_timestamp_nanos() / 1_000_000).truncate::<i64>();
22 timestamp.serialize(serializer)
23}
24
25pub fn deserialize<'a, D: Deserializer<'a>>(deserializer: D) -> Result<OffsetDateTime, D::Error> {
27 let value: i64 = <_>::deserialize(deserializer)?;
28 OffsetDateTime::from_unix_timestamp_nanos(value.extend::<i128>() * 1_000_000)
29 .map_err(|err| de::Error::invalid_value(de::Unexpected::Signed(err.value), &err))
30}
31
32pub mod option {
42 #[allow(clippy::wildcard_imports)]
43 use super::*;
44
45 pub fn serialize<S: Serializer>(
47 option: &Option<OffsetDateTime>,
48 serializer: S,
49 ) -> Result<S::Ok, S::Error> {
50 option
51 .map(|timestamp| (timestamp.unix_timestamp_nanos() / 1_000_000).truncate::<i64>())
52 .serialize(serializer)
53 }
54
55 pub fn deserialize<'a, D: Deserializer<'a>>(
57 deserializer: D,
58 ) -> Result<Option<OffsetDateTime>, D::Error> {
59 Option::deserialize(deserializer)?
60 .map(|value: i64| {
61 OffsetDateTime::from_unix_timestamp_nanos(value.extend::<i128>() * 1_000_000)
62 })
63 .transpose()
64 .map_err(|err| de::Error::invalid_value(de::Unexpected::Signed(err.value), &err))
65 }
66}