Struct serde_with::TimestampSecondsWithFrac
source · 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 FORMAT
s for the different timestamp types.
The FORMAT
specifier defaults to i64
or f64
.
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 |
chrono::NaiveDateTime | TimestampSeconds | i64 , f64 , String |
chrono::NaiveDateTime | TimestampSecondsWithFrac | f64 , String |
time::OffsetDateTime | TimestampSeconds | i64 , f64 , String |
time::OffsetDateTime | TimestampSecondsWithFrac | f64 , String |
time::PrimitiveDateTime | TimestampSeconds | i64 , f64 , String |
time::PrimitiveDateTime | 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 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.
impl<'de> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<f64, Strict>
chrono_0_4
only.source§fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error>where
D: Deserializer<'de>,
source§impl<'de, FORMAT> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
Available on crate feature chrono_0_4
only.
impl<'de, FORMAT> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
chrono_0_4
only.source§fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<String, Strict>
Available on crate feature chrono_0_4
only.
impl<'de> DeserializeAs<'de, DateTime<Local>> for TimestampSecondsWithFrac<String, Strict>
chrono_0_4
only.source§fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Local>, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<f64, Strict>
Available on crate feature chrono_0_4
only.
impl<'de> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<f64, Strict>
chrono_0_4
only.source§fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>where
D: Deserializer<'de>,
source§impl<'de, FORMAT> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
Available on crate feature chrono_0_4
only.
impl<'de, FORMAT> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
chrono_0_4
only.source§fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<String, Strict>
Available on crate feature chrono_0_4
only.
impl<'de> DeserializeAs<'de, DateTime<Utc>> for TimestampSecondsWithFrac<String, Strict>
chrono_0_4
only.source§fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, NaiveDateTime> for TimestampSecondsWithFrac<f64, Strict>
Available on crate feature chrono_0_4
only.
impl<'de> DeserializeAs<'de, NaiveDateTime> for TimestampSecondsWithFrac<f64, Strict>
chrono_0_4
only.source§fn deserialize_as<D>(deserializer: D) -> Result<NaiveDateTime, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<NaiveDateTime, D::Error>where
D: Deserializer<'de>,
source§impl<'de, FORMAT> DeserializeAs<'de, NaiveDateTime> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
Available on crate feature chrono_0_4
only.
impl<'de, FORMAT> DeserializeAs<'de, NaiveDateTime> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
chrono_0_4
only.source§fn deserialize_as<D>(deserializer: D) -> Result<NaiveDateTime, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<NaiveDateTime, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, NaiveDateTime> for TimestampSecondsWithFrac<String, Strict>
Available on crate feature chrono_0_4
only.
impl<'de> DeserializeAs<'de, NaiveDateTime> for TimestampSecondsWithFrac<String, Strict>
chrono_0_4
only.source§fn deserialize_as<D>(deserializer: D) -> Result<NaiveDateTime, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<NaiveDateTime, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, OffsetDateTime> for TimestampSecondsWithFrac<f64, Strict>
Available on crate feature time_0_3
only.
impl<'de> DeserializeAs<'de, OffsetDateTime> for TimestampSecondsWithFrac<f64, Strict>
time_0_3
only.source§fn deserialize_as<D>(deserializer: D) -> Result<OffsetDateTime, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<OffsetDateTime, D::Error>where
D: Deserializer<'de>,
source§impl<'de, FORMAT> DeserializeAs<'de, OffsetDateTime> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
Available on crate feature time_0_3
only.
impl<'de, FORMAT> DeserializeAs<'de, OffsetDateTime> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
time_0_3
only.source§fn deserialize_as<D>(deserializer: D) -> Result<OffsetDateTime, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<OffsetDateTime, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, OffsetDateTime> for TimestampSecondsWithFrac<String, Strict>
Available on crate feature time_0_3
only.
impl<'de> DeserializeAs<'de, OffsetDateTime> for TimestampSecondsWithFrac<String, Strict>
time_0_3
only.source§fn deserialize_as<D>(deserializer: D) -> Result<OffsetDateTime, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<OffsetDateTime, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, PrimitiveDateTime> for TimestampSecondsWithFrac<f64, Strict>
Available on crate feature time_0_3
only.
impl<'de> DeserializeAs<'de, PrimitiveDateTime> for TimestampSecondsWithFrac<f64, Strict>
time_0_3
only.source§fn deserialize_as<D>(deserializer: D) -> Result<PrimitiveDateTime, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<PrimitiveDateTime, D::Error>where
D: Deserializer<'de>,
source§impl<'de, FORMAT> DeserializeAs<'de, PrimitiveDateTime> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
Available on crate feature time_0_3
only.
impl<'de, FORMAT> DeserializeAs<'de, PrimitiveDateTime> for TimestampSecondsWithFrac<FORMAT, Flexible>where
FORMAT: Format,
time_0_3
only.source§fn deserialize_as<D>(deserializer: D) -> Result<PrimitiveDateTime, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<PrimitiveDateTime, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, PrimitiveDateTime> for TimestampSecondsWithFrac<String, Strict>
Available on crate feature time_0_3
only.
impl<'de> DeserializeAs<'de, PrimitiveDateTime> for TimestampSecondsWithFrac<String, Strict>
time_0_3
only.source§fn deserialize_as<D>(deserializer: D) -> Result<PrimitiveDateTime, D::Error>where
D: Deserializer<'de>,
fn deserialize_as<D>(deserializer: D) -> Result<PrimitiveDateTime, D::Error>where
D: Deserializer<'de>,
source§impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<f64, Strict>
impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<f64, Strict>
source§fn 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>,
source§impl<'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,
source§fn 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>,
source§impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<String, Strict>
impl<'de> DeserializeAs<'de, SystemTime> for TimestampSecondsWithFrac<String, Strict>
source§fn 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>,
source§impl<TZ, STRICTNESS> SerializeAs<DateTime<TZ>> for TimestampSecondsWithFrac<String, STRICTNESS>where
TZ: TimeZone,
STRICTNESS: Strictness,
Available on crate feature chrono_0_4
only.
impl<TZ, STRICTNESS> SerializeAs<DateTime<TZ>> for TimestampSecondsWithFrac<String, STRICTNESS>where
TZ: TimeZone,
STRICTNESS: Strictness,
chrono_0_4
only.source§fn serialize_as<S>(
source: &DateTime<TZ>,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(
source: &DateTime<TZ>,
serializer: S
) -> Result<S::Ok, S::Error>where
S: 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.
impl<TZ, STRICTNESS> SerializeAs<DateTime<TZ>> for TimestampSecondsWithFrac<f64, STRICTNESS>where
TZ: TimeZone,
STRICTNESS: Strictness,
chrono_0_4
only.source§fn serialize_as<S>(
source: &DateTime<TZ>,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(
source: &DateTime<TZ>,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
source§impl<STRICTNESS> SerializeAs<NaiveDateTime> for TimestampSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature chrono_0_4
only.
impl<STRICTNESS> SerializeAs<NaiveDateTime> for TimestampSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
chrono_0_4
only.source§fn serialize_as<S>(
source: &NaiveDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(
source: &NaiveDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
source§impl<STRICTNESS> SerializeAs<NaiveDateTime> for TimestampSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature chrono_0_4
only.
impl<STRICTNESS> SerializeAs<NaiveDateTime> for TimestampSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
chrono_0_4
only.source§fn serialize_as<S>(
source: &NaiveDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(
source: &NaiveDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
source§impl<STRICTNESS> SerializeAs<OffsetDateTime> for TimestampSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature time_0_3
only.
impl<STRICTNESS> SerializeAs<OffsetDateTime> for TimestampSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
time_0_3
only.source§fn serialize_as<S>(
source: &OffsetDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(
source: &OffsetDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
source§impl<STRICTNESS> SerializeAs<OffsetDateTime> for TimestampSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature time_0_3
only.
impl<STRICTNESS> SerializeAs<OffsetDateTime> for TimestampSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
time_0_3
only.source§fn serialize_as<S>(
source: &OffsetDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(
source: &OffsetDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
source§impl<STRICTNESS> SerializeAs<PrimitiveDateTime> for TimestampSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature time_0_3
only.
impl<STRICTNESS> SerializeAs<PrimitiveDateTime> for TimestampSecondsWithFrac<String, STRICTNESS>where
STRICTNESS: Strictness,
time_0_3
only.source§fn serialize_as<S>(
source: &PrimitiveDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
fn serialize_as<S>(
source: &PrimitiveDateTime,
serializer: S
) -> Result<S::Ok, S::Error>where
S: Serializer,
source§impl<STRICTNESS> SerializeAs<PrimitiveDateTime> for TimestampSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
Available on crate feature time_0_3
only.
impl<STRICTNESS> SerializeAs<PrimitiveDateTime> for TimestampSecondsWithFrac<f64, STRICTNESS>where
STRICTNESS: Strictness,
time_0_3
only.