[][src]Struct serde_with::TimestampSecondsWithFrac

pub struct TimestampSecondsWithFrac<FORMAT: Format = f64, STRICTNESS: Strictness = Strict>(_);

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.

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 with the chrono-feature flag.

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

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 datatypes
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 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 datatypes
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

impl<FORMAT: Clone + Format, STRICTNESS: Clone + Strictness> Clone for TimestampSecondsWithFrac<FORMAT, STRICTNESS>[src]

impl<FORMAT: Copy + Format, STRICTNESS: Copy + Strictness> Copy for TimestampSecondsWithFrac<FORMAT, STRICTNESS>[src]

impl<FORMAT: Debug + Format, STRICTNESS: Debug + Strictness> Debug for TimestampSecondsWithFrac<FORMAT, STRICTNESS>[src]

impl<FORMAT: Default + Format, STRICTNESS: Default + Strictness> Default for TimestampSecondsWithFrac<FORMAT, STRICTNESS>[src]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.