/// Serialize a datetime into an integer number of nanoseconds since the epoch /// /// Intended for use with `serde`s `serialize_with` attribute. /// /// # Errors /// /// An `i64` with nanosecond precision can span a range of ~584 years. This function returns an /// error on an out of range `DateTime`. /// /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and /// 2262-04-11T23:47:16.854775804. /// /// # Example: /// /// ```rust /// # use chrono::{NaiveDate, NaiveDateTime}; /// # use serde_derive::Serialize; /// use chrono::naive::serde::ts_nanoseconds::serialize as to_nano_ts; /// #[derive(Serialize)] /// struct S { /// #[serde(serialize_with = "to_nano_ts")] /// time: NaiveDateTime, /// } /// /// let my_s = S { /// time: NaiveDate::from_ymd_opt(2018, 5, 17) /// .unwrap() /// .and_hms_nano_opt(02, 04, 59, 918355733) /// .unwrap(), /// }; /// let as_string = serde_json::to_string(&my_s)?; /// assert_eq!(as_string, r#"{"time":1526522699918355733}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn serialize<S>(dt: &NaiveDateTime, serializer: S) -> Result<S::Ok, S::Error> where
S: ser::Serializer,
{
serializer.serialize_i64(dt.and_utc().timestamp_nanos_opt().ok_or(ser::Error::custom( "value out of range for a timestamp with nanosecond precision",
))?)
}
/// Deserialize a `NaiveDateTime` from a nanoseconds timestamp /// /// Intended for use with `serde`s `deserialize_with` attribute. /// /// # Example: /// /// ```rust /// # use chrono::{DateTime, NaiveDateTime}; /// # use serde_derive::Deserialize; /// use chrono::naive::serde::ts_nanoseconds::deserialize as from_nano_ts; /// #[derive(Debug, PartialEq, Deserialize)] /// struct S { /// #[serde(deserialize_with = "from_nano_ts")] /// time: NaiveDateTime, /// } /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918355733 }"#)?; /// let expected = DateTime::from_timestamp(1526522699, 918355733).unwrap().naive_utc(); /// assert_eq!(my_s, S { time: expected }); /// /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; /// let expected = DateTime::from_timestamp(-1, 999_999_999).unwrap().naive_utc(); /// assert_eq!(my_s, S { time: expected }); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn deserialize<'de, D>(d: D) -> Result<NaiveDateTime, D::Error> where
D: de::Deserializer<'de>,
{
d.deserialize_i64(NanoSecondsTimestampVisitor)
}
pub(super) struct NanoSecondsTimestampVisitor;
impl de::Visitor<'_> for NanoSecondsTimestampVisitor { type Value = NaiveDateTime;
/// Serialize a datetime into an integer number of nanoseconds since the epoch or none /// /// Intended for use with `serde`s `serialize_with` attribute. /// /// # Errors /// /// An `i64` with nanosecond precision can span a range of ~584 years. This function returns an /// error on an out of range `DateTime`. /// /// The dates that can be represented as nanoseconds are between 1677-09-21T00:12:44.0 and /// 2262-04-11T23:47:16.854775804. /// /// # Example: /// /// ```rust /// # use chrono::naive::{NaiveDate, NaiveDateTime}; /// # use serde_derive::Serialize; /// use chrono::naive::serde::ts_nanoseconds_option::serialize as to_nano_tsopt; /// #[derive(Serialize)] /// struct S { /// #[serde(serialize_with = "to_nano_tsopt")] /// time: Option<NaiveDateTime>, /// } /// /// let my_s = S { /// time: Some( /// NaiveDate::from_ymd_opt(2018, 5, 17) /// .unwrap() /// .and_hms_nano_opt(02, 04, 59, 918355733) /// .unwrap(), /// ), /// }; /// let as_string = serde_json::to_string(&my_s)?; /// assert_eq!(as_string, r#"{"time":1526522699918355733}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn serialize<S>(opt: &Option<NaiveDateTime>, serializer: S) -> Result<S::Ok, S::Error> where
S: ser::Serializer,
{ match *opt {
Some(ref dt) => serializer.serialize_some(&dt.and_utc().timestamp_nanos_opt().ok_or(
ser::Error::custom("value out of range for a timestamp with nanosecond precision"),
)?),
None => serializer.serialize_none(),
}
}
/// Deserialize a `NaiveDateTime` from a nanosecond timestamp or none /// /// Intended for use with `serde`s `deserialize_with` attribute. /// /// # Example: /// /// ```rust /// # use chrono::{DateTime, NaiveDateTime}; /// # use serde_derive::Deserialize; /// use chrono::naive::serde::ts_nanoseconds_option::deserialize as from_nano_tsopt; /// #[derive(Debug, PartialEq, Deserialize)] /// struct S { /// #[serde(deserialize_with = "from_nano_tsopt")] /// time: Option<NaiveDateTime>, /// } /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918355733 }"#)?; /// let expected = DateTime::from_timestamp(1526522699, 918355733).unwrap().naive_utc(); /// assert_eq!(my_s, S { time: Some(expected) }); /// /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; /// let expected = DateTime::from_timestamp(-1, 999_999_999).unwrap().naive_utc(); /// assert_eq!(my_s, S { time: Some(expected) }); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn deserialize<'de, D>(d: D) -> Result<Option<NaiveDateTime>, D::Error> where
D: de::Deserializer<'de>,
{
d.deserialize_option(OptionNanoSecondsTimestampVisitor)
}
struct OptionNanoSecondsTimestampVisitor;
impl<'de> de::Visitor<'de> for OptionNanoSecondsTimestampVisitor { type Value = Option<NaiveDateTime>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a unix timestamp in nanoseconds or none")
}
/// Deserialize a timestamp in nanoseconds since the epoch fn visit_some<D>(self, d: D) -> Result<Self::Value, D::Error> where
D: de::Deserializer<'de>,
{
d.deserialize_i64(NanoSecondsTimestampVisitor).map(Some)
}
/// Deserialize a timestamp in nanoseconds since the epoch fn visit_none<E>(self) -> Result<Self::Value, E> where
E: de::Error,
{
Ok(None)
}
/// Deserialize a timestamp in nanoseconds since the epoch fn visit_unit<E>(self) -> Result<Self::Value, E> where
E: de::Error,
{
Ok(None)
}
}
}
/// Used to serialize/deserialize from microsecond-precision timestamps /// /// # Example: /// /// ```rust /// # use chrono::{NaiveDate, NaiveDateTime}; /// # use serde_derive::{Deserialize, Serialize}; /// use chrono::naive::serde::ts_microseconds; /// #[derive(Deserialize, Serialize)] /// struct S { /// #[serde(with = "ts_microseconds")] /// time: NaiveDateTime, /// } /// /// let time = NaiveDate::from_ymd_opt(2018, 5, 17) /// .unwrap() /// .and_hms_micro_opt(02, 04, 59, 918355) /// .unwrap(); /// let my_s = S { time: time.clone() }; /// /// let as_string = serde_json::to_string(&my_s)?; /// assert_eq!(as_string, r#"{"time":1526522699918355}"#); /// let my_s: S = serde_json::from_str(&as_string)?; /// assert_eq!(my_s.time, time); /// # Ok::<(), serde_json::Error>(()) /// ``` pubmod ts_microseconds { use core::fmt; use serde::{de, ser};
/// Serialize a datetime into an integer number of microseconds since the epoch or none /// /// Intended for use with `serde`s `serialize_with` attribute. /// /// # Example: /// /// ```rust /// # use chrono::naive::{NaiveDate, NaiveDateTime}; /// # use serde_derive::Serialize; /// use chrono::naive::serde::ts_microseconds_option::serialize as to_micro_tsopt; /// #[derive(Serialize)] /// struct S { /// #[serde(serialize_with = "to_micro_tsopt")] /// time: Option<NaiveDateTime>, /// } /// /// let my_s = S { /// time: Some( /// NaiveDate::from_ymd_opt(2018, 5, 17) /// .unwrap() /// .and_hms_micro_opt(02, 04, 59, 918355) /// .unwrap(), /// ), /// }; /// let as_string = serde_json::to_string(&my_s)?; /// assert_eq!(as_string, r#"{"time":1526522699918355}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn serialize<S>(opt: &Option<NaiveDateTime>, serializer: S) -> Result<S::Ok, S::Error> where
S: ser::Serializer,
{ match *opt {
Some(ref dt) => serializer.serialize_some(&dt.and_utc().timestamp_micros()),
None => serializer.serialize_none(),
}
}
/// Deserialize a `NaiveDateTime` from a nanosecond timestamp or none /// /// Intended for use with `serde`s `deserialize_with` attribute. /// /// # Example: /// /// ```rust /// # use chrono::{DateTime, NaiveDateTime}; /// # use serde_derive::Deserialize; /// use chrono::naive::serde::ts_microseconds_option::deserialize as from_micro_tsopt; /// #[derive(Debug, PartialEq, Deserialize)] /// struct S { /// #[serde(deserialize_with = "from_micro_tsopt")] /// time: Option<NaiveDateTime>, /// } /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918355 }"#)?; /// let expected = DateTime::from_timestamp(1526522699, 918355000).unwrap().naive_utc(); /// assert_eq!(my_s, S { time: Some(expected) }); /// /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; /// let expected = DateTime::from_timestamp(-1, 999_999_000).unwrap().naive_utc(); /// assert_eq!(my_s, S { time: Some(expected) }); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn deserialize<'de, D>(d: D) -> Result<Option<NaiveDateTime>, D::Error> where
D: de::Deserializer<'de>,
{
d.deserialize_option(OptionMicroSecondsTimestampVisitor)
}
struct OptionMicroSecondsTimestampVisitor;
impl<'de> de::Visitor<'de> for OptionMicroSecondsTimestampVisitor { type Value = Option<NaiveDateTime>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a unix timestamp in microseconds or none")
}
/// Deserialize a timestamp in microseconds since the epoch fn visit_some<D>(self, d: D) -> Result<Self::Value, D::Error> where
D: de::Deserializer<'de>,
{
d.deserialize_i64(MicroSecondsTimestampVisitor).map(Some)
}
/// Deserialize a timestamp in microseconds since the epoch fn visit_none<E>(self) -> Result<Self::Value, E> where
E: de::Error,
{
Ok(None)
}
/// Deserialize a timestamp in microseconds since the epoch fn visit_unit<E>(self) -> Result<Self::Value, E> where
E: de::Error,
{
Ok(None)
}
}
}
/// Used to serialize/deserialize from millisecond-precision timestamps /// /// # Example: /// /// ```rust /// # use chrono::{NaiveDate, NaiveDateTime}; /// # use serde_derive::{Deserialize, Serialize}; /// use chrono::naive::serde::ts_milliseconds; /// #[derive(Deserialize, Serialize)] /// struct S { /// #[serde(with = "ts_milliseconds")] /// time: NaiveDateTime, /// } /// /// let time = /// NaiveDate::from_ymd_opt(2018, 5, 17).unwrap().and_hms_milli_opt(02, 04, 59, 918).unwrap(); /// let my_s = S { time: time.clone() }; /// /// let as_string = serde_json::to_string(&my_s)?; /// assert_eq!(as_string, r#"{"time":1526522699918}"#); /// let my_s: S = serde_json::from_str(&as_string)?; /// assert_eq!(my_s.time, time); /// # Ok::<(), serde_json::Error>(()) /// ``` pubmod ts_milliseconds { use core::fmt; use serde::{de, ser};
/// Serialize a datetime into an integer number of milliseconds since the epoch or none /// /// Intended for use with `serde`s `serialize_with` attribute. /// /// # Example: /// /// ```rust /// # use chrono::naive::{NaiveDate, NaiveDateTime}; /// # use serde_derive::Serialize; /// use chrono::naive::serde::ts_milliseconds_option::serialize as to_milli_tsopt; /// #[derive(Serialize)] /// struct S { /// #[serde(serialize_with = "to_milli_tsopt")] /// time: Option<NaiveDateTime>, /// } /// /// let my_s = S { /// time: Some( /// NaiveDate::from_ymd_opt(2018, 5, 17) /// .unwrap() /// .and_hms_milli_opt(02, 04, 59, 918) /// .unwrap(), /// ), /// }; /// let as_string = serde_json::to_string(&my_s)?; /// assert_eq!(as_string, r#"{"time":1526522699918}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn serialize<S>(opt: &Option<NaiveDateTime>, serializer: S) -> Result<S::Ok, S::Error> where
S: ser::Serializer,
{ match *opt {
Some(ref dt) => serializer.serialize_some(&dt.and_utc().timestamp_millis()),
None => serializer.serialize_none(),
}
}
/// Deserialize a `NaiveDateTime` from a millisecond timestamp or none /// /// Intended for use with `serde`s `deserialize_with` attribute. /// /// # Example: /// /// ```rust /// # use chrono::{DateTime, NaiveDateTime}; /// # use serde_derive::Deserialize; /// use chrono::naive::serde::ts_milliseconds_option::deserialize as from_milli_tsopt; /// #[derive(Debug, PartialEq, Deserialize)] /// struct S { /// #[serde(deserialize_with = "from_milli_tsopt")] /// time: Option<NaiveDateTime>, /// } /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1526522699918 }"#)?; /// let expected = DateTime::from_timestamp(1526522699, 918000000).unwrap().naive_utc(); /// assert_eq!(my_s, S { time: Some(expected) }); /// /// let my_s: S = serde_json::from_str(r#"{ "time": -1 }"#)?; /// let expected = DateTime::from_timestamp(-1, 999_000_000).unwrap().naive_utc(); /// assert_eq!(my_s, S { time: Some(expected) }); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn deserialize<'de, D>(d: D) -> Result<Option<NaiveDateTime>, D::Error> where
D: de::Deserializer<'de>,
{
d.deserialize_option(OptionMilliSecondsTimestampVisitor)
}
struct OptionMilliSecondsTimestampVisitor;
impl<'de> de::Visitor<'de> for OptionMilliSecondsTimestampVisitor { type Value = Option<NaiveDateTime>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a unix timestamp in milliseconds or none")
}
/// Deserialize a timestamp in milliseconds since the epoch fn visit_some<D>(self, d: D) -> Result<Self::Value, D::Error> where
D: de::Deserializer<'de>,
{
d.deserialize_i64(MilliSecondsTimestampVisitor).map(Some)
}
/// Deserialize a timestamp in milliseconds since the epoch fn visit_none<E>(self) -> Result<Self::Value, E> where
E: de::Error,
{
Ok(None)
}
/// Deserialize a timestamp in milliseconds since the epoch fn visit_unit<E>(self) -> Result<Self::Value, E> where
E: de::Error,
{
Ok(None)
}
}
}
/// Used to serialize/deserialize from second-precision timestamps /// /// # Example: /// /// ```rust /// # use chrono::{NaiveDate, NaiveDateTime}; /// # use serde_derive::{Deserialize, Serialize}; /// use chrono::naive::serde::ts_seconds; /// #[derive(Deserialize, Serialize)] /// struct S { /// #[serde(with = "ts_seconds")] /// time: NaiveDateTime, /// } /// /// let time = NaiveDate::from_ymd_opt(2015, 5, 15).unwrap().and_hms_opt(10, 0, 0).unwrap(); /// let my_s = S { time: time.clone() }; /// /// let as_string = serde_json::to_string(&my_s)?; /// assert_eq!(as_string, r#"{"time":1431684000}"#); /// let my_s: S = serde_json::from_str(&as_string)?; /// assert_eq!(my_s.time, time); /// # Ok::<(), serde_json::Error>(()) /// ``` pubmod ts_seconds { use core::fmt; use serde::{de, ser};
/// Serialize a datetime into an integer number of seconds since the epoch or none /// /// Intended for use with `serde`s `serialize_with` attribute. /// /// # Example: /// /// ```rust /// # use chrono::naive::{NaiveDate, NaiveDateTime}; /// # use serde_derive::Serialize; /// use chrono::naive::serde::ts_seconds_option::serialize as to_tsopt; /// #[derive(Serialize)] /// struct S { /// #[serde(serialize_with = "to_tsopt")] /// time: Option<NaiveDateTime>, /// } /// /// let expected = NaiveDate::from_ymd_opt(2018, 5, 17).unwrap().and_hms_opt(02, 04, 59).unwrap(); /// let my_s = S { time: Some(expected) }; /// let as_string = serde_json::to_string(&my_s)?; /// assert_eq!(as_string, r#"{"time":1526522699}"#); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn serialize<S>(opt: &Option<NaiveDateTime>, serializer: S) -> Result<S::Ok, S::Error> where
S: ser::Serializer,
{ match *opt {
Some(ref dt) => serializer.serialize_some(&dt.and_utc().timestamp()),
None => serializer.serialize_none(),
}
}
/// Deserialize a `NaiveDateTime` from a second timestamp or none /// /// Intended for use with `serde`s `deserialize_with` attribute. /// /// # Example: /// /// ```rust /// # use chrono::{DateTime, NaiveDateTime}; /// # use serde_derive::Deserialize; /// use chrono::naive::serde::ts_seconds_option::deserialize as from_tsopt; /// #[derive(Debug, PartialEq, Deserialize)] /// struct S { /// #[serde(deserialize_with = "from_tsopt")] /// time: Option<NaiveDateTime>, /// } /// /// let my_s: S = serde_json::from_str(r#"{ "time": 1431684000 }"#)?; /// let expected = DateTime::from_timestamp_secs(1431684000).unwrap().naive_utc(); /// assert_eq!(my_s, S { time: Some(expected) }); /// # Ok::<(), serde_json::Error>(()) /// ``` pubfn deserialize<'de, D>(d: D) -> Result<Option<NaiveDateTime>, D::Error> where
D: de::Deserializer<'de>,
{
d.deserialize_option(OptionSecondsTimestampVisitor)
}
struct OptionSecondsTimestampVisitor;
impl<'de> de::Visitor<'de> for OptionSecondsTimestampVisitor { type Value = Option<NaiveDateTime>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a unix timestamp in seconds or none")
}
/// Deserialize a timestamp in seconds since the epoch fn visit_some<D>(self, d: D) -> Result<Self::Value, D::Error> where
D: de::Deserializer<'de>,
{
d.deserialize_i64(SecondsTimestampVisitor).map(Some)
}
/// Deserialize a timestamp in seconds since the epoch fn visit_none<E>(self) -> Result<Self::Value, E> where
E: de::Error,
{
Ok(None)
}
/// Deserialize a timestamp in seconds since the epoch fn visit_unit<E>(self) -> Result<Self::Value, E> where
E: de::Error,
{
Ok(None)
}
}
}
#[cfg(test)] mod tests { usecrate::serde::ts_nanoseconds_option; usecrate::{DateTime, NaiveDate, NaiveDateTime, TimeZone, Utc};
use bincode::{deserialize, serialize}; use serde_derive::{Deserialize, Serialize};
// bad formats
assert!(from_str(r#""""#).is_err());
assert!(from_str(r#""2016-07-08""#).is_err());
assert!(from_str(r#""09:10:48.090""#).is_err());
assert!(from_str(r#""20160708T091048.090""#).is_err());
assert!(from_str(r#""2000-00-00T00:00:00""#).is_err());
assert!(from_str(r#""2000-02-30T00:00:00""#).is_err());
assert!(from_str(r#""2001-02-29T00:00:00""#).is_err());
assert!(from_str(r#""2002-02-28T24:00:00""#).is_err());
assert!(from_str(r#""2002-02-28T23:60:00""#).is_err());
assert!(from_str(r#""2002-02-28T23:59:61""#).is_err());
assert!(from_str(r#""2016-07-08T09:10:48,090""#).is_err());
assert!(from_str(r#""2016-07-08 09:10:48.090""#).is_err());
assert!(from_str(r#""2016-007-08T09:10:48.090""#).is_err());
assert!(from_str(r#""yyyy-mm-ddThh:mm:ss.fffffffff""#).is_err());
assert!(from_str(r#"20160708000000"#).is_err());
assert!(from_str(r#"{}"#).is_err()); // pre-0.3.0 rustc-serialize format is now invalid
assert!(from_str(r#"{"date":{"ymdf":20},"time":{"secs":0,"frac":0}}"#).is_err());
assert!(from_str(r#"null"#).is_err());
}
// Bincode is relevant to test separately from JSON because // it is not self-describing. #[test] fn test_serde_bincode() { let dt =
NaiveDate::from_ymd_opt(2016, 7, 8).unwrap().and_hms_milli_opt(9, 10, 48, 90).unwrap(); let encoded = serialize(&dt).unwrap(); let decoded: NaiveDateTime = deserialize(&encoded).unwrap();
assert_eq!(dt, decoded);
}
let expected =
Test { one: Some(1), two: Some(Utc.with_ymd_and_hms(1970, 1, 1, 0, 1, 1).unwrap()) }; let bytes: Vec<u8> = serialize(&expected).unwrap(); let actual = deserialize::<Test>(&(bytes)).unwrap();
assert_eq!(expected, actual);
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.34 Sekunden
(vorverarbeitet am 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.