Struct serde_with::TimestampSecondsWithFrac 
source · [−]pub struct TimestampSecondsWithFrac<FORMAT: Format = f64, STRICTNESS: Strictness = Strict>(_);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.
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 Type | Converter | Available FORMATs | 
|---|---|---|
std::time::SystemTime | TimestampSeconds | i64, f64, String | 
std::time::SystemTime | TimestampSecondsWithFrac | f64, String | 
chrono::DateTime<Utc> | TimestampSeconds | i64, f64, String | 
chrono::DateTime<Utc> | TimestampSecondsWithFrac | f64, String | 
chrono::DateTime<Local> | TimestampSeconds | i64, f64, String | 
chrono::DateTime<Local> | TimestampSecondsWithFrac | f64, 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
sourceimpl<FORMAT: Clone + Format, STRICTNESS: Clone + Strictness> Clone for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
 
impl<FORMAT: Clone + Format, STRICTNESS: Clone + Strictness> Clone for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
sourcefn clone(&self) -> TimestampSecondsWithFrac<FORMAT, STRICTNESS>
 
fn clone(&self) -> TimestampSecondsWithFrac<FORMAT, STRICTNESS>
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
 
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read more
sourceimpl<FORMAT: Debug + Format, STRICTNESS: Debug + Strictness> Debug for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
 
impl<FORMAT: Debug + Format, STRICTNESS: Debug + Strictness> Debug for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
sourceimpl<FORMAT: Default + Format, STRICTNESS: Default + Strictness> Default for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
 
impl<FORMAT: Default + Format, STRICTNESS: Default + Strictness> Default for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
sourcefn default() -> TimestampSecondsWithFrac<FORMAT, STRICTNESS>
 
fn default() -> TimestampSecondsWithFrac<FORMAT, STRICTNESS>
Returns the “default value” for a type. Read more
sourceimpl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<f64, Strict>
 
impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<f64, Strict>
sourcefn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error> where
    D: Deserializer<'de>, 
 
fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error> where
    D: Deserializer<'de>, 
Deserialize this value from the given Serde deserializer.
sourceimpl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<String, Strict>
 
impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<String, Strict>
sourcefn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error> where
    D: Deserializer<'de>, 
 
fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error> where
    D: Deserializer<'de>, 
Deserialize this value from the given Serde deserializer.
sourceimpl<'de, FORMAT> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<FORMAT, Flexible> where
    FORMAT: Format, 
 
impl<'de, FORMAT> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<FORMAT, Flexible> where
    FORMAT: Format, 
sourcefn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error> where
    D: Deserializer<'de>, 
 
fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error> where
    D: Deserializer<'de>, 
Deserialize this value from the given Serde deserializer.
sourceimpl<STRICTNESS> SerializeAs<SystemTime> for TimestampSecondsWithFrac<f64, STRICTNESS> where
    STRICTNESS: Strictness, 
 
impl<STRICTNESS> SerializeAs<SystemTime> for TimestampSecondsWithFrac<f64, STRICTNESS> where
    STRICTNESS: Strictness, 
sourcefn serialize_as<S>(
    source: &SystemTime, 
    serializer: S
) -> Result<S::Ok, S::Error> where
    S: Serializer, 
 
fn serialize_as<S>(
    source: &SystemTime, 
    serializer: S
) -> Result<S::Ok, S::Error> where
    S: Serializer, 
Serialize this value into the given Serde serializer.
sourceimpl<STRICTNESS> SerializeAs<SystemTime> for TimestampSecondsWithFrac<String, STRICTNESS> where
    STRICTNESS: Strictness, 
 
impl<STRICTNESS> SerializeAs<SystemTime> for TimestampSecondsWithFrac<String, STRICTNESS> where
    STRICTNESS: Strictness, 
sourcefn serialize_as<S>(
    source: &SystemTime, 
    serializer: S
) -> Result<S::Ok, S::Error> where
    S: Serializer, 
 
fn serialize_as<S>(
    source: &SystemTime, 
    serializer: S
) -> Result<S::Ok, S::Error> where
    S: Serializer, 
Serialize this value into the given Serde serializer.
impl<FORMAT: Copy + Format, STRICTNESS: Copy + Strictness> Copy for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
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
sourceimpl<T> BorrowMut<T> for T where
    T: ?Sized, 
 
impl<T> BorrowMut<T> for T where
    T: ?Sized, 
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
 
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more