FixedOffset for SQLite + Local test.

This commit is contained in:
Felipe Lessa 2020-06-27 21:59:49 +01:00
parent 30faf73208
commit c827c72808
No known key found for this signature in database
GPG Key ID: 210DC649890C2FEA
3 changed files with 29 additions and 11 deletions

View File

@ -61,9 +61,12 @@ impl<Tz: TimeZone> Type<Sqlite> for DateTime<Tz> {
}
}
impl<Tz: TimeZone> Encode<'_, Sqlite> for DateTime<Tz> {
impl<Tz: TimeZone> Encode<'_, Sqlite> for DateTime<Tz>
where
<Tz as TimeZone>::Offset: std::fmt::Display,
{
fn encode_by_ref(&self, buf: &mut Vec<SqliteArgumentValue<'_>>) -> IsNull {
let text = self.with_timezone(&Utc).to_rfc3339();
let text = self.to_rfc3339();
Encode::<Sqlite>::encode(text, buf)
}
}
@ -80,6 +83,13 @@ impl<'a> Decode<'a, Sqlite> for DateTime<Utc> {
}
}
impl<'a> Decode<'a, Sqlite> for DateTime<FixedOffset> {
fn decode(value: SqliteValueRef<'a>) -> Result<Self, BoxDynError> {
let text = value.text()?;
Ok(DateTime::parse_from_rfc3339(text)?)
}
}
impl<'a> Decode<'a, Sqlite> for DateTime<Local> {
fn decode(value: SqliteValueRef<'a>) -> Result<Self, BoxDynError> {
let as_utc: DateTime<Utc> = Decode::<Sqlite>::decode(value)?;

View File

@ -24,7 +24,9 @@ pub use uuid::Uuid;
#[cfg(feature = "chrono")]
#[cfg_attr(docsrs, doc(cfg(feature = "chrono")))]
pub mod chrono {
pub use chrono::{DateTime, NaiveDate, NaiveDateTime, NaiveTime, Utc};
pub use chrono::{
DateTime, FixedOffset, Local, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Utc,
};
}
#[cfg(feature = "time")]

View File

@ -35,17 +35,23 @@ test_type!(bytes<Vec<u8>>(Sqlite,
#[cfg(feature = "chrono")]
mod chrono {
use super::*;
use sqlx::types::chrono::{DateTime, NaiveDate, NaiveDateTime, Utc};
use sqlx::types::chrono::{
DateTime, FixedOffset, Local, NaiveDate, NaiveDateTime, TimeZone, Utc,
};
test_type!(chrono_date_time<NaiveDateTime>(Sqlite,
test_type!(chrono_naive_date_time<NaiveDateTime>(Sqlite,
"'2019-01-02 05:10:20'" == NaiveDate::from_ymd(2019, 1, 2).and_hms(5, 10, 20)
));
test_type!(chrono_date_time_tz<DateTime::<Utc>>(Sqlite,
"'1996-12-20T00:39:57+00:00'"
== DateTime::<Utc>::from_utc(
NaiveDate::from_ymd(1996, 12, 20).and_hms(0, 39, 57),
Utc,
)
test_type!(chrono_date_time_utc<DateTime::<Utc>>(Sqlite,
"'1996-12-20T00:39:57+00:00'" == Utc.ymd(1996, 12, 20).and_hms(0, 39, 57)
));
test_type!(chrono_date_time_fixed_offset<DateTime::<FixedOffset>>(Sqlite,
"'2016-11-08T03:50:23-05:00'" == FixedOffset::west(5 * 3600).ymd(2016, 11, 08).and_hms(3, 50, 23)
));
test_type!(chrono_date_time_local<DateTime::<Local>>(Sqlite,
"'2016-11-08T03:50:23+00:00'" == Local.ymd(2016, 11, 08).and_hms(3, 50, 23)
));
}