Skip to content

Commit d60cfad

Browse files
pierre-wehbejrasanen
authored andcommitted
fix: Use rfc3339 to decode date from text (launchbadge#3411)
1 parent 40c3979 commit d60cfad

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

sqlx-postgres/src/types/chrono/datetime.rs

+25-6
Original file line numberDiff line numberDiff line change
@@ -86,22 +86,41 @@ impl<Tz: TimeZone> Encode<'_, Postgres> for DateTime<Tz> {
8686

8787
impl<'r> Decode<'r, Postgres> for DateTime<Local> {
8888
fn decode(value: PgValueRef<'r>) -> Result<Self, BoxDynError> {
89-
let naive = <NaiveDateTime as Decode<Postgres>>::decode(value)?;
90-
Ok(Local.from_utc_datetime(&naive))
89+
let fixed = <DateTime<FixedOffset> as Decode<Postgres>>::decode(value)?;
90+
Ok(Local.from_utc_datetime(&fixed.naive_utc()))
9191
}
9292
}
9393

9494
impl<'r> Decode<'r, Postgres> for DateTime<Utc> {
9595
fn decode(value: PgValueRef<'r>) -> Result<Self, BoxDynError> {
96-
let naive = <NaiveDateTime as Decode<Postgres>>::decode(value)?;
97-
Ok(Utc.from_utc_datetime(&naive))
96+
let fixed = <DateTime<FixedOffset> as Decode<Postgres>>::decode(value)?;
97+
Ok(Utc.from_utc_datetime(&fixed.naive_utc()))
9898
}
9999
}
100100

101101
impl<'r> Decode<'r, Postgres> for DateTime<FixedOffset> {
102102
fn decode(value: PgValueRef<'r>) -> Result<Self, BoxDynError> {
103-
let naive = <NaiveDateTime as Decode<Postgres>>::decode(value)?;
104-
Ok(Utc.fix().from_utc_datetime(&naive))
103+
Ok(match value.format() {
104+
PgValueFormat::Binary => {
105+
let naive = <NaiveDateTime as Decode<Postgres>>::decode(value)?;
106+
Utc.fix().from_utc_datetime(&naive)
107+
}
108+
109+
PgValueFormat::Text => {
110+
let s = value.as_str()?;
111+
DateTime::parse_from_str(
112+
s,
113+
if s.contains('+') || s.contains('-') {
114+
// Contains a time-zone specifier
115+
// This is given for timestamptz for some reason
116+
// Postgres already guarantees this to always be UTC
117+
"%Y-%m-%d %H:%M:%S%.f%#z"
118+
} else {
119+
"%Y-%m-%d %H:%M:%S%.f"
120+
},
121+
)?
122+
}
123+
})
105124
}
106125
}
107126

0 commit comments

Comments
 (0)