@@ -23,6 +23,11 @@ pub use hex_string_as_object_id::{
23
23
serialize as serialize_hex_string_as_object_id,
24
24
} ;
25
25
#[ 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) ]
26
31
pub use rfc3339_string_as_bson_datetime:: {
27
32
deserialize as deserialize_rfc3339_string_from_bson_datetime,
28
33
serialize as serialize_rfc3339_string_as_bson_datetime,
@@ -412,6 +417,40 @@ pub mod hex_string_as_object_id {
412
417
}
413
418
}
414
419
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
+
415
454
#[ allow( unused_macros) ]
416
455
macro_rules! as_binary_mod {
417
456
( $feat: meta, $uu: path) => {
0 commit comments