From 01687f304d07822cee51957a6fb332a00a40399a Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 31 Mar 2026 23:32:43 +0200 Subject: [PATCH] Display: preserve fractional seconds when present When nanoseconds are non-zero, include them in Display output as `.NNNNNNNNN` between seconds and the offset. This avoids silently dropping sub-second precision from the formatted representation. --- src/extended.rs | 27 ++++++++++++++++++++++----- src/lib.rs | 9 ++++++++- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/extended.rs b/src/extended.rs index fd00777..146d2ae 100644 --- a/src/extended.rs +++ b/src/extended.rs @@ -297,11 +297,28 @@ impl fmt::Display for ExtendedDateTime { let abs = self.offset_seconds.unsigned_abs(); let oh = abs / 3600; let om = (abs % 3600) / 60; - write!( - f, - "{:04}-{:02}-{:02} {:02}:{:02}:{:02}{}{:02}:{:02}", - self.year, self.month, self.day, self.hour, self.minute, self.second, sign, oh, om, - ) + if self.nanosecond != 0 { + write!( + f, + "{:04}-{:02}-{:02} {:02}:{:02}:{:02}.{:09}{}{:02}:{:02}", + self.year, + self.month, + self.day, + self.hour, + self.minute, + self.second, + self.nanosecond, + sign, + oh, + om, + ) + } else { + write!( + f, + "{:04}-{:02}-{:02} {:02}:{:02}:{:02}{}{:02}:{:02}", + self.year, self.month, self.day, self.hour, self.minute, self.second, sign, oh, om, + ) + } } } diff --git a/src/lib.rs b/src/lib.rs index b4b3d80..3597ffd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -63,7 +63,14 @@ impl ParsedDateTime { impl fmt::Display for ParsedDateTime { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - ParsedDateTime::InRange(z) => write!(f, "{}", z.strftime("%Y-%m-%d %H:%M:%S%:z")), + ParsedDateTime::InRange(z) => { + let ns = z.datetime().time().subsec_nanosecond(); + if ns != 0 { + write!(f, "{}", z.strftime("%Y-%m-%d %H:%M:%S%.9f%:z")) + } else { + write!(f, "{}", z.strftime("%Y-%m-%d %H:%M:%S%:z")) + } + } ParsedDateTime::Extended(dt) => write!(f, "{dt}"), } }