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