[−][src]Struct serde_with::TimestampSecondsWithFrac
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 FORMAT s |
---|---|---|
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
impl<FORMAT: Clone + Format, STRICTNESS: Clone + Strictness> Clone for TimestampSecondsWithFrac<FORMAT, STRICTNESS>
[src]
fn clone(&self) -> TimestampSecondsWithFrac<FORMAT, STRICTNESS>
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[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]
fn default() -> TimestampSecondsWithFrac<FORMAT, STRICTNESS>
[src]
impl<'de> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<f64, Strict>
[src]
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error> where
D: Deserializer<'de>,
[src]
D: Deserializer<'de>,
impl<'de> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<String, Strict>
[src]
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error> where
D: Deserializer<'de>,
[src]
D: Deserializer<'de>,
impl<'de, FORMAT> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<FORMAT, Flexible> where
FORMAT: Format,
[src]
FORMAT: Format,
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error> where
D: Deserializer<'de>,
[src]
D: Deserializer<'de>,
impl<'de> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<f64, Strict>
[src]
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error> where
D: Deserializer<'de>,
[src]
D: Deserializer<'de>,
impl<'de> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<String, Strict>
[src]
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error> where
D: Deserializer<'de>,
[src]
D: Deserializer<'de>,
impl<'de, FORMAT> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<FORMAT, Flexible> where
FORMAT: Format,
[src]
FORMAT: Format,
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error> where
D: Deserializer<'de>,
[src]
D: Deserializer<'de>,
impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<f64, Strict>
[src]
fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error> where
D: Deserializer<'de>,
[src]
D: Deserializer<'de>,
impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<String, Strict>
[src]
fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error> where
D: Deserializer<'de>,
[src]
D: Deserializer<'de>,
impl<'de, FORMAT> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<FORMAT, Flexible> where
FORMAT: Format,
[src]
FORMAT: Format,
fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error> where
D: Deserializer<'de>,
[src]
D: Deserializer<'de>,
impl<TZ, STRICTNESS> SerializeAs<DateTime<TZ>> for TimestampSecondsWithFrac<f64, STRICTNESS> where
TZ: TimeZone,
STRICTNESS: Strictness,
[src]
TZ: TimeZone,
STRICTNESS: Strictness,
fn serialize_as<S>(
source: &DateTime<TZ>,
serializer: S
) -> Result<S::Ok, S::Error> where
S: Serializer,
[src]
source: &DateTime<TZ>,
serializer: S
) -> Result<S::Ok, S::Error> where
S: Serializer,
impl<TZ, STRICTNESS> SerializeAs<DateTime<TZ>> for TimestampSecondsWithFrac<String, STRICTNESS> where
TZ: TimeZone,
STRICTNESS: Strictness,
[src]
TZ: TimeZone,
STRICTNESS: Strictness,
fn serialize_as<S>(
source: &DateTime<TZ>,
serializer: S
) -> Result<S::Ok, S::Error> where
S: Serializer,
[src]
source: &DateTime<TZ>,
serializer: S
) -> Result<S::Ok, S::Error> where
S: Serializer,
impl<STRICTNESS> SerializeAs<SystemTime> for TimestampSecondsWithFrac<f64, STRICTNESS> where
STRICTNESS: Strictness,
[src]
STRICTNESS: Strictness,
fn serialize_as<S>(
source: &SystemTime,
serializer: S
) -> Result<S::Ok, S::Error> where
S: Serializer,
[src]
source: &SystemTime,
serializer: S
) -> Result<S::Ok, S::Error> where
S: Serializer,
impl<STRICTNESS> SerializeAs<SystemTime> for TimestampSecondsWithFrac<String, STRICTNESS> where
STRICTNESS: Strictness,
[src]
STRICTNESS: Strictness,
fn serialize_as<S>(
source: &SystemTime,
serializer: S
) -> Result<S::Ok, S::Error> where
S: Serializer,
[src]
source: &SystemTime,
serializer: S
) -> Result<S::Ok, S::Error> where
S: Serializer,
Auto Trait Implementations
impl<FORMAT, STRICTNESS> RefUnwindSafe for TimestampSecondsWithFrac<FORMAT, STRICTNESS> where
FORMAT: RefUnwindSafe,
STRICTNESS: RefUnwindSafe,
FORMAT: RefUnwindSafe,
STRICTNESS: RefUnwindSafe,
impl<FORMAT, STRICTNESS> Send for TimestampSecondsWithFrac<FORMAT, STRICTNESS> where
FORMAT: Send,
STRICTNESS: Send,
FORMAT: Send,
STRICTNESS: Send,
impl<FORMAT, STRICTNESS> Sync for TimestampSecondsWithFrac<FORMAT, STRICTNESS> where
FORMAT: Sync,
STRICTNESS: Sync,
FORMAT: Sync,
STRICTNESS: Sync,
impl<FORMAT, STRICTNESS> Unpin for TimestampSecondsWithFrac<FORMAT, STRICTNESS> where
FORMAT: Unpin,
STRICTNESS: Unpin,
FORMAT: Unpin,
STRICTNESS: Unpin,
impl<FORMAT, STRICTNESS> UnwindSafe for TimestampSecondsWithFrac<FORMAT, STRICTNESS> where
FORMAT: UnwindSafe,
STRICTNESS: UnwindSafe,
FORMAT: UnwindSafe,
STRICTNESS: UnwindSafe,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,