From ecbc0aa7672be45e06357df9e58fb9e898ab6da3 Mon Sep 17 00:00:00 2001 From: Nick Hynes Date: Sat, 3 Apr 2021 11:56:11 +0300 Subject: [PATCH] Leniently parse rfc3339 timezones (#928) --- src/types/chrono.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/types/chrono.rs b/src/types/chrono.rs index fde8546..38276da 100644 --- a/src/types/chrono.rs +++ b/src/types/chrono.rs @@ -101,9 +101,9 @@ impl FromSql for DateTime { let s = value.as_str()?; let fmt = if s.len() >= 11 && s.as_bytes()[10] == b'T' { - "%FT%T%.f%:z" + "%FT%T%.f%#z" } else { - "%F %T%.f%:z" + "%F %T%.f%#z" }; if let Ok(dt) = DateTime::parse_from_str(s, fmt) { @@ -127,7 +127,10 @@ impl FromSql for DateTime { #[cfg(test)] mod test { - use crate::{Connection, Result}; + use crate::{ + types::{FromSql, ValueRef}, + Connection, Result, + }; use chrono::{DateTime, Duration, Local, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Utc}; fn checked_memory_handle() -> Result { @@ -261,4 +264,10 @@ mod test { assert!(result.is_ok()); Ok(()) } + + #[test] + fn test_lenient_parse_timezone() { + assert!(DateTime::::column_result(ValueRef::Text(b"1970-01-01T00:00:00Z")).is_ok()); + assert!(DateTime::::column_result(ValueRef::Text(b"1970-01-01T00:00:00+00")).is_ok()); + } }