pub struct TimestampSecondsWithFrac<FORMAT: Format = f64, STRICTNESS: Strictness = Strict>(/* private fields */);
Expand description

De/Serialize timestamps as seconds since the UNIX epoch

De/serialize timestamps as seconds since the UNIX epoch. Subsecond precision is only supported for TimestampSecondsWithFrac, but not for TimestampSeconds. You can configure the serialization format between integers, floats, and stringified numbers with the FORMAT specifier and configure the deserialization with the STRICTNESS specifier. Serialization of integers will round the timestamp to the nearest value.

The STRICTNESS specifier can either be formats::Strict or formats::Flexible and defaults to formats::Strict. formats::Strict means that deserialization only supports the type given in FORMAT, e.g., if FORMAT is i64 deserialization from a f64 will error. formats::Flexible means that deserialization will perform a best effort to extract the correct timestamp and allows deserialization from any type. For example, deserializing TimestampSeconds<f64, Flexible> will discard any subsecond precision during deserialization from f64 and will parse a String as an integer number.

This type also supports chrono::DateTime and chrono::NaiveDateTime with the chrono-feature flag. This type also supports time::OffsetDateTime and time::PrimitiveDateTime with the time_0_3-feature flag.

This table lists the available FORMATs for the different timestamp types. The FORMAT specifier defaults to i64 or f64.

Timestamp TypeConverterAvailable FORMATs
std::time::SystemTimeTimestampSecondsi64, f64, String
std::time::SystemTimeTimestampSecondsWithFracf64, String
chrono::DateTime<Utc>TimestampSecondsi64, f64, String
chrono::DateTime<Utc>TimestampSecondsWithFracf64, String
chrono::DateTime<Local>TimestampSecondsi64, f64, String
chrono::DateTime<Local>TimestampSecondsWithFracf64, String
chrono::NaiveDateTimeTimestampSecondsi64, f64, String
chrono::NaiveDateTimeTimestampSecondsWithFracf64, String
time::OffsetDateTimeTimestampSecondsi64, f64, String
time::OffsetDateTimeTimestampSecondsWithFracf64, String
time::PrimitiveDateTimeTimestampSecondsi64, f64, String
time::PrimitiveDateTimeTimestampSecondsWithFracf64, String

Examples

use std::time::{Duration, SystemTime};

#[serde_as]
#[derive(Deserialize, Serialize)]
struct Timestamps {
    #[serde_as(as = "TimestampSecondsWithFrac<f64>")]
    st_f64: SystemTime,
    #[serde_as(as = "TimestampSecondsWithFrac<String>")]
    st_string: SystemTime,
};

// Serialization
// See how the values get rounded, since subsecond precision is not allowed.

let ts = Timestamps {
    st_f64: SystemTime::UNIX_EPOCH.checked_add(Duration::new(12345, 500_000_000)).unwrap(),
    st_string: SystemTime::UNIX_EPOCH.checked_add(Duration::new(12345, 999_999_000)).unwrap(),
};
// Observe the different data types
let expected = json!({
    "st_f64": 12345.5,
    "st_string": "12345.999999",
});
assert_eq!(expected, serde_json::to_value(&ts).unwrap());

// Deserialization works too
// Subsecond precision in numbers will be rounded away

let json = json!({
    "st_f64": 12345.5,
    "st_string": "12345.987654",
});
let expected = Timestamps {
    st_f64: SystemTime::UNIX_EPOCH.checked_add(Duration::new(12345, 500_000_000)).unwrap(),
    st_string: SystemTime::UNIX_EPOCH.checked_add(Duration::new(12345, 987_654_000)).unwrap(),
};
assert_eq!(expected, serde_json::from_value(json).unwrap());

chrono::DateTime<Utc> and chrono::DateTime<Local> are also supported when using the chrono_0_4 feature. Like SystemTime, it is a signed timestamp, thus can be de/serialized as an i64.

use chrono::{DateTime, Local, TimeZone, Utc};

#[serde_as]
#[derive(Deserialize, Serialize)]
struct Timestamps {
    #[serde_as(as = "TimestampSecondsWithFrac<f64>")]
    dt_f64: DateTime<Utc>,
    #[serde_as(as = "TimestampSecondsWithFrac<String>")]
    dt_string: DateTime<Local>,
};

// Serialization

let ts = Timestamps {
    dt_f64: Utc.timestamp(-12345, 500_000_000),
    dt_string: Local.timestamp(12345, 999_999_000),
};
// Observe the different data types
let expected = json!({
    "dt_f64": -12344.5,
    "dt_string": "12345.999999",
});
assert_eq!(expected, serde_json::to_value(&ts).unwrap());

// Deserialization works too

let json = json!({
    "dt_f64": -12344.5,
    "dt_string": "12345.987",
});
let expected = Timestamps {
    dt_f64: Utc.timestamp(-12345, 500_000_000),
    dt_string: Local.timestamp(12345, 987_000_000),
};
assert_eq!(expected, serde_json::from_value(json).unwrap());

Trait Implementations§

source§

impl<'de> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<f64, Strict>

Available on crate feature chrono_0_4 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de, FORMAT> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<FORMAT, Flexible>
where FORMAT: Format,

Available on crate feature chrono_0_4 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<String, Strict>

Available on crate feature chrono_0_4 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<f64, Strict>

Available on crate feature chrono_0_4 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de, FORMAT> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<FORMAT, Flexible>
where FORMAT: Format,

Available on crate feature chrono_0_4 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<String, Strict>

Available on crate feature chrono_0_4 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, NaiveDateTime> for TimestampSecondsWithFrac<f64, Strict>

Available on crate feature chrono_0_4 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<NaiveDateTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de, FORMAT> DeserializeAs<'de, NaiveDateTime> for TimestampSecondsWithFrac<FORMAT, Flexible>
where FORMAT: Format,

Available on crate feature chrono_0_4 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<NaiveDateTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, NaiveDateTime> for TimestampSecondsWithFrac<String, Strict>

Available on crate feature chrono_0_4 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<NaiveDateTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, OffsetDateTime> for TimestampSecondsWithFrac<f64, Strict>

Available on crate feature time_0_3 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<OffsetDateTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de, FORMAT> DeserializeAs<'de, OffsetDateTime> for TimestampSecondsWithFrac<FORMAT, Flexible>
where FORMAT: Format,

Available on crate feature time_0_3 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<OffsetDateTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, OffsetDateTime> for TimestampSecondsWithFrac<String, Strict>

Available on crate feature time_0_3 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<OffsetDateTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, PrimitiveDateTime> for TimestampSecondsWithFrac<f64, Strict>

Available on crate feature time_0_3 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<PrimitiveDateTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de, FORMAT> DeserializeAs<'de, PrimitiveDateTime> for TimestampSecondsWithFrac<FORMAT, Flexible>
where FORMAT: Format,

Available on crate feature time_0_3 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<PrimitiveDateTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, PrimitiveDateTime> for TimestampSecondsWithFrac<String, Strict>

Available on crate feature time_0_3 only.
source§

fn deserialize_as<D>(deserializer: D) -> Result<PrimitiveDateTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<f64, Strict>

source§

fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de, FORMAT> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<FORMAT, Flexible>
where FORMAT: Format,

source§

fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<String, Strict>

source§

fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
source§

impl<TZ, STRICTNESS> SerializeAs<DateTime<TZ>> for TimestampSecondsWithFrac<String, STRICTNESS>
where TZ: TimeZone, STRICTNESS: Strictness,

Available on crate feature chrono_0_4 only.
source§

fn serialize_as<S>( source: &DateTime<TZ>, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.
source§

impl<TZ, STRICTNESS> SerializeAs<DateTime<TZ>> for TimestampSecondsWithFrac<f64, STRICTNESS>
where TZ: TimeZone, STRICTNESS: Strictness,

Available on crate feature chrono_0_4 only.
source§

fn serialize_as<S>( source: &DateTime<TZ>, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.
source§

impl<STRICTNESS> SerializeAs<NaiveDateTime> for TimestampSecondsWithFrac<String, STRICTNESS>
where STRICTNESS: Strictness,

Available on crate feature chrono_0_4 only.
source§

fn serialize_as<S>( source: &NaiveDateTime, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.
source§

impl<STRICTNESS> SerializeAs<NaiveDateTime> for TimestampSecondsWithFrac<f64, STRICTNESS>
where STRICTNESS: Strictness,

Available on crate feature chrono_0_4 only.
source§

fn serialize_as<S>( source: &NaiveDateTime, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.
source§

impl<STRICTNESS> SerializeAs<OffsetDateTime> for TimestampSecondsWithFrac<String, STRICTNESS>
where STRICTNESS: Strictness,

Available on crate feature time_0_3 only.
source§

fn serialize_as<S>( source: &OffsetDateTime, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.
source§

impl<STRICTNESS> SerializeAs<OffsetDateTime> for TimestampSecondsWithFrac<f64, STRICTNESS>
where STRICTNESS: Strictness,

Available on crate feature time_0_3 only.
source§

fn serialize_as<S>( source: &OffsetDateTime, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.
source§

impl<STRICTNESS> SerializeAs<PrimitiveDateTime> for TimestampSecondsWithFrac<String, STRICTNESS>
where STRICTNESS: Strictness,

Available on crate feature time_0_3 only.
source§

fn serialize_as<S>( source: &PrimitiveDateTime, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.
source§

impl<STRICTNESS> SerializeAs<PrimitiveDateTime> for TimestampSecondsWithFrac<f64, STRICTNESS>
where STRICTNESS: Strictness,

Available on crate feature time_0_3 only.
source§

fn serialize_as<S>( source: &PrimitiveDateTime, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.
source§

impl<STRICTNESS> SerializeAs<SystemTime> for TimestampSecondsWithFrac<String, STRICTNESS>
where STRICTNESS: Strictness,

source§

fn serialize_as<S>( source: &SystemTime, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.
source§

impl<STRICTNESS> SerializeAs<SystemTime> for TimestampSecondsWithFrac<f64, STRICTNESS>
where STRICTNESS: Strictness,

source§

fn serialize_as<S>( source: &SystemTime, serializer: S ) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.

Auto Trait Implementations§

§

impl<FORMAT, STRICTNESS> RefUnwindSafe for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
where FORMAT: RefUnwindSafe, STRICTNESS: RefUnwindSafe,

§

impl<FORMAT, STRICTNESS> Send for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
where FORMAT: Send, STRICTNESS: Send,

§

impl<FORMAT, STRICTNESS> Sync for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
where FORMAT: Sync, STRICTNESS: Sync,

§

impl<FORMAT, STRICTNESS> Unpin for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
where FORMAT: Unpin, STRICTNESS: Unpin,

§

impl<FORMAT, STRICTNESS> UnwindSafe for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
where FORMAT: UnwindSafe, STRICTNESS: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.