time/serde/timestamp/
milliseconds.rs1use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
12
13use crate::OffsetDateTime;
14
15#[inline]
17pub 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;
22 timestamp.serialize(serializer)
23}
24
25#[inline]
27pub fn deserialize<'a, D: Deserializer<'a>>(deserializer: D) -> Result<OffsetDateTime, D::Error> {
28 let value: i128 = <_>::deserialize(deserializer)?;
29 OffsetDateTime::from_unix_timestamp_nanos(value * 1_000_000)
30 .map_err(|err| de::Error::invalid_value(de::Unexpected::Signed(err.value), &err))
31}
32
33pub mod option {
43 use super::*;
44
45 #[inline]
47 pub fn serialize<S: Serializer>(
48 option: &Option<OffsetDateTime>,
49 serializer: S,
50 ) -> Result<S::Ok, S::Error> {
51 option
52 .map(|timestamp| timestamp.unix_timestamp_nanos() / 1_000_000)
53 .serialize(serializer)
54 }
55
56 #[inline]
58 pub fn deserialize<'a, D: Deserializer<'a>>(
59 deserializer: D,
60 ) -> Result<Option<OffsetDateTime>, D::Error> {
61 Option::deserialize(deserializer)?
62 .map(|value: i128| OffsetDateTime::from_unix_timestamp_nanos(value * 1_000_000))
63 .transpose()
64 .map_err(|err| de::Error::invalid_value(de::Unexpected::Signed(err.value), &err))
65 }
66}