Skip to content

Commit

Permalink
Do not use Offset's Debug impl when serializing DateTime
Browse files Browse the repository at this point in the history
  • Loading branch information
pitdicker committed Aug 5, 2023
1 parent fa86d27 commit 9fdd2c3
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 13 deletions.
4 changes: 3 additions & 1 deletion src/datetime/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1418,7 +1418,9 @@ where
&FixedOffset::east_opt(3650).unwrap().with_ymd_and_hms(2014, 7, 24, 12, 34, 6).unwrap()
)
.ok(),
Some(r#""2014-07-24T12:34:06+01:00:50""#.into())
// Seconds are not allowed by RFC 3339, offset should be rounded to the nearest minute.
// In this case `+01:00:50` becomes `+01:01`
Some(r#""2014-07-24T12:34:06+01:01""#.into())
);
}

Expand Down
4 changes: 2 additions & 2 deletions src/datetime/rustc_serialize.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#![cfg_attr(docsrs, doc(cfg(feature = "rustc-serialize")))]

use super::DateTime;
use super::{DateTime, SecondsFormat};
#[cfg(feature = "clock")]
use crate::offset::Local;
use crate::offset::{FixedOffset, LocalResult, TimeZone, Utc};
Expand All @@ -10,7 +10,7 @@ use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};

impl<Tz: TimeZone> Encodable for DateTime<Tz> {
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
format!("{:?}", self).encode(s)
self.to_rfc3339_opts(SecondsFormat::AutoSi, true).encode(s)
}
}

Expand Down
22 changes: 12 additions & 10 deletions src/datetime/serde.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
use core::fmt;
use serde::{de, ser};

use super::DateTime;
use super::{DateTime, SecondsFormat};
use crate::format::write_rfc3339;
use crate::naive::datetime::serde::serde_from;
#[cfg(feature = "clock")]
use crate::offset::Local;
use crate::offset::{FixedOffset, TimeZone, Utc};
use crate::offset::{FixedOffset, Offset, TimeZone, Utc};

#[doc(hidden)]
#[derive(Debug)]
Expand All @@ -25,7 +26,7 @@ pub struct MicroSecondsTimestampVisitor;
#[derive(Debug)]
pub struct MilliSecondsTimestampVisitor;

/// Serialize into a rfc3339 time string
/// Serialize into an ISO 8601 formatted string.
///
/// See [the `serde` module](./serde/index.html) for alternate
/// serializations.
Expand All @@ -34,18 +35,19 @@ impl<Tz: TimeZone> ser::Serialize for DateTime<Tz> {
where
S: ser::Serializer,
{
struct FormatWrapped<'a, D: 'a> {
inner: &'a D,
struct FormatIso8601<'a, Tz: TimeZone> {
inner: &'a DateTime<Tz>,
}

impl<'a, D: fmt::Debug> fmt::Display for FormatWrapped<'a, D> {
impl<'a, Tz: TimeZone> fmt::Display for FormatIso8601<'a, Tz> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.inner.fmt(f)
let naive = self.inner.naive_local();
let offset = self.inner.offset.fix();
write_rfc3339(f, naive, offset, SecondsFormat::AutoSi, true)
}
}

// Debug formatting is correct RFC3339, and it allows Zulu.
serializer.collect_str(&FormatWrapped { inner: &self })
serializer.collect_str(&FormatIso8601 { inner: self })
}
}

Expand Down Expand Up @@ -1151,11 +1153,11 @@ pub mod ts_seconds_option {

#[cfg(test)]
mod tests {
use core::fmt;
#[cfg(feature = "clock")]
use crate::datetime::test_decodable_json;
use crate::datetime::test_encodable_json;
use crate::{DateTime, FixedOffset, TimeZone, Utc};
use core::fmt;

#[test]
fn test_serde_serialize() {
Expand Down

0 comments on commit 9fdd2c3

Please sign in to comment.