use chrono::Utc; use serde::{Deserializer, Serializer}; use std::fmt; pub fn serialize_datetime( date: &Option>, serializer: S, ) -> Result where S: Serializer, { serializer.serialize_str(&date.unwrap().to_rfc3339()) } pub fn deserialize_datetime<'de, D>( deserializer: D, ) -> Result>, D::Error> where D: Deserializer<'de>, { struct DateTimeVisitor; impl<'de> serde::de::Visitor<'de> for DateTimeVisitor { type Value = Option>; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("an ISO 8601 formatted date string or null") } fn visit_str(self, value: &str) -> Result where E: serde::de::Error, { match chrono::DateTime::parse_from_rfc3339(value) { Ok(dt) => Ok(Some(dt.with_timezone(&Utc))), Err(e) => Err(E::custom(format!("Failed to parse datetime: {}", e))), } } fn visit_none(self) -> Result where E: serde::de::Error, { Ok(None) } fn visit_some(self, deserializer: D) -> Result where D: Deserializer<'de>, { deserializer.deserialize_str(self) } } deserializer.deserialize_option(DateTimeVisitor) }