From 3be1adc66f27d0ee006afbe13d16f22afc16af16 Mon Sep 17 00:00:00 2001 From: Anton Bobrik Date: Tue, 26 Sep 2023 00:04:28 +0400 Subject: [PATCH] fix: Postgres DB with non-UTC timezone incorrectly parse in timestamptz fields (#252) --- dialect/postgresql.go | 2 +- dialect/postgresql_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 dialect/postgresql_test.go diff --git a/dialect/postgresql.go b/dialect/postgresql.go index fa52155c..33252674 100644 --- a/dialect/postgresql.go +++ b/dialect/postgresql.go @@ -25,7 +25,7 @@ func (d postgreSQL) EncodeBool(b bool) string { } func (d postgreSQL) EncodeTime(t time.Time) string { - return MySQL.EncodeTime(t) + return `'` + t.Format(time.RFC3339Nano) + `'` } func (d postgreSQL) EncodeBytes(b []byte) string { diff --git a/dialect/postgresql_test.go b/dialect/postgresql_test.go new file mode 100644 index 00000000..b0534a6c --- /dev/null +++ b/dialect/postgresql_test.go @@ -0,0 +1,33 @@ +package dialect + +import ( + "github.com/stretchr/testify/require" + "testing" + "time" +) + +func TestEncodeTime(t *testing.T) { + for _, test := range []struct { + in time.Time + want string + }{ + { + in: time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC), + want: `'2009-11-10T23:00:00Z'`, + }, + { + in: time.Date(2009, time.November, 10, 15, 0, 0, 0, time.FixedZone("UTC-8", -8*60*60)), + want: `'2009-11-10T15:00:00-08:00'`, + }, + { + in: time.Date(2009, time.November, 11, 07, 0, 0, 0, time.FixedZone("UTC+8", 8*60*60)), + want: `'2009-11-11T07:00:00+08:00'`, + }, + { + in: time.Date(2009, time.November, 10, 23, 45, 59, 123456789, time.UTC), + want: `'2009-11-10T23:45:59.123456789Z'`, + }, + } { + require.Equal(t, test.want, PostgreSQL.EncodeTime(test.in)) + } +}