@@ -17,6 +17,11 @@ use crate::sql_types::{Date, Time, Timestamp, Timestamptz};
17
17
// Postgres timestamps start from January 1st 2000.
18
18
const PG_EPOCH : PrimitiveDateTime = datetime ! ( 2000 -1 -1 0 : 00 : 00 ) ;
19
19
20
+ fn to_primitive_datetime ( dt : OffsetDateTime ) -> PrimitiveDateTime {
21
+ let dt = dt. to_offset ( UtcOffset :: UTC ) ;
22
+ PrimitiveDateTime :: new ( dt. date ( ) , dt. time ( ) )
23
+ }
24
+
20
25
#[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
21
26
impl FromSql < Timestamp , Pg > for PrimitiveDateTime {
22
27
fn from_sql ( bytes : PgValue < ' _ > ) -> deserialize:: Result < Self > {
@@ -44,6 +49,23 @@ impl ToSql<Timestamp, Pg> for PrimitiveDateTime {
44
49
}
45
50
}
46
51
52
+ // Delegate offset datetimes in terms of UTC primitive datetimes; this stores everything in the DB as UTC
53
+ #[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
54
+ impl ToSql < Timestamp , Pg > for OffsetDateTime {
55
+ fn to_sql < ' b > ( & ' b self , out : & mut Output < ' b , ' _ , Pg > ) -> serialize:: Result {
56
+ let prim = to_primitive_datetime ( * self ) ;
57
+ <PrimitiveDateTime as ToSql < Timestamp , Pg > >:: to_sql ( & prim, & mut out. reborrow ( ) )
58
+ }
59
+ }
60
+
61
+ #[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
62
+ impl FromSql < Timestamp , Pg > for OffsetDateTime {
63
+ fn from_sql ( bytes : PgValue < ' _ > ) -> deserialize:: Result < Self > {
64
+ let prim = <PrimitiveDateTime as FromSql < Timestamp , Pg > >:: from_sql ( bytes) ?;
65
+ Ok ( prim. assume_utc ( ) )
66
+ }
67
+ }
68
+
47
69
#[ cfg( all( feature = "time" , feature = "postgres_backend" ) ) ]
48
70
impl FromSql < Timestamptz , Pg > for PrimitiveDateTime {
49
71
fn from_sql ( bytes : PgValue < ' _ > ) -> deserialize:: Result < Self > {
0 commit comments