@@ -23,6 +23,11 @@ pub use hex_string_as_object_id::{
2323 serialize as serialize_hex_string_as_object_id,
2424} ;
2525#[ doc( inline) ]
26+ pub use i64_as_datetime:: {
27+ deserialize as deserialize_i64_from_datetime,
28+ serialize as serialize_i64_as_datetime,
29+ } ;
30+ #[ doc( inline) ]
2631pub use rfc3339_string_as_bson_datetime:: {
2732 deserialize as deserialize_rfc3339_string_from_bson_datetime,
2833 serialize as serialize_rfc3339_string_as_bson_datetime,
@@ -412,6 +417,40 @@ pub mod hex_string_as_object_id {
412417 }
413418}
414419
420+ /// Contains functions to `serialize` a `i64` integer as `DateTime` and `deserialize`
421+ /// a `i64` integer from `DateTime`
422+ ///
423+ /// ### The i64 should represent seconds `(DateTime::timestamp_millis(..))`.
424+ ///
425+ /// ```rust
426+ /// # use serde::{Serialize, Deserialize};
427+ /// # use bson::serde_helpers::i64_as_datetime;
428+ /// #[derive(Serialize, Deserialize)]
429+ /// struct Item {
430+ /// #[serde(with = "i64_as_datetime")]
431+ /// pub now: i64,
432+ /// }
433+ /// ```
434+ pub mod i64_as_datetime {
435+ use crate :: DateTime ;
436+ use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
437+
438+ /// Deserializes a i64 integer from a DateTime.
439+ pub fn deserialize < ' de , D > ( deserializer : D ) -> Result < i64 , D :: Error >
440+ where
441+ D : Deserializer < ' de > ,
442+ {
443+ let date: DateTime = DateTime :: deserialize ( deserializer) ?;
444+ Ok ( date. timestamp_millis ( ) )
445+ }
446+
447+ /// Serializes a i64 integer as a DateTime.
448+ pub fn serialize < S : Serializer > ( val : & i64 , serializer : S ) -> Result < S :: Ok , S :: Error > {
449+ let date_time = DateTime :: from_millis ( * val) ;
450+ date_time. serialize ( serializer)
451+ }
452+ }
453+
415454#[ allow( unused_macros) ]
416455macro_rules! as_binary_mod {
417456 ( $feat: meta, $uu: path) => {
0 commit comments