Skip to content

Commit 2eb361c

Browse files
committed
Use space to separate date and time portions of Time literals
PostgreSQL accepts this format as input to more temporal types.
1 parent 80f8150 commit 2eb361c

2 files changed

Lines changed: 37 additions & 17 deletions

File tree

encode.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ func FormatTimestamp(t time.Time) []byte {
471471
t = t.AddDate((-t.Year())*2+1, 0, 0)
472472
bc = true
473473
}
474-
b := []byte(t.Format(time.RFC3339Nano))
474+
b := []byte(strings.Replace(t.Format(time.RFC3339Nano), "T", " ", 1))
475475

476476
_, offset := t.Zone()
477477
offset = offset % 60

encode_test.go

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -141,22 +141,22 @@ var formatTimeTests = []struct {
141141
time time.Time
142142
expected string
143143
}{
144-
{time.Time{}, "0001-01-01T00:00:00Z"},
145-
{time.Date(2001, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 0)), "2001-02-03T04:05:06.123456789Z"},
146-
{time.Date(2001, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 2*60*60)), "2001-02-03T04:05:06.123456789+02:00"},
147-
{time.Date(2001, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", -6*60*60)), "2001-02-03T04:05:06.123456789-06:00"},
148-
{time.Date(2001, time.February, 3, 4, 5, 6, 0, time.FixedZone("", -(7*60*60+30*60+9))), "2001-02-03T04:05:06-07:30:09"},
149-
150-
{time.Date(1, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 0)), "0001-02-03T04:05:06.123456789Z"},
151-
{time.Date(1, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 2*60*60)), "0001-02-03T04:05:06.123456789+02:00"},
152-
{time.Date(1, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", -6*60*60)), "0001-02-03T04:05:06.123456789-06:00"},
153-
154-
{time.Date(0, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 0)), "0001-02-03T04:05:06.123456789Z BC"},
155-
{time.Date(0, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 2*60*60)), "0001-02-03T04:05:06.123456789+02:00 BC"},
156-
{time.Date(0, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", -6*60*60)), "0001-02-03T04:05:06.123456789-06:00 BC"},
157-
158-
{time.Date(1, time.February, 3, 4, 5, 6, 0, time.FixedZone("", -(7*60*60+30*60+9))), "0001-02-03T04:05:06-07:30:09"},
159-
{time.Date(0, time.February, 3, 4, 5, 6, 0, time.FixedZone("", -(7*60*60+30*60+9))), "0001-02-03T04:05:06-07:30:09 BC"},
144+
{time.Time{}, "0001-01-01 00:00:00Z"},
145+
{time.Date(2001, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 0)), "2001-02-03 04:05:06.123456789Z"},
146+
{time.Date(2001, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 2*60*60)), "2001-02-03 04:05:06.123456789+02:00"},
147+
{time.Date(2001, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", -6*60*60)), "2001-02-03 04:05:06.123456789-06:00"},
148+
{time.Date(2001, time.February, 3, 4, 5, 6, 0, time.FixedZone("", -(7*60*60+30*60+9))), "2001-02-03 04:05:06-07:30:09"},
149+
150+
{time.Date(1, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 0)), "0001-02-03 04:05:06.123456789Z"},
151+
{time.Date(1, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 2*60*60)), "0001-02-03 04:05:06.123456789+02:00"},
152+
{time.Date(1, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", -6*60*60)), "0001-02-03 04:05:06.123456789-06:00"},
153+
154+
{time.Date(0, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 0)), "0001-02-03 04:05:06.123456789Z BC"},
155+
{time.Date(0, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", 2*60*60)), "0001-02-03 04:05:06.123456789+02:00 BC"},
156+
{time.Date(0, time.February, 3, 4, 5, 6, 123456789, time.FixedZone("", -6*60*60)), "0001-02-03 04:05:06.123456789-06:00 BC"},
157+
158+
{time.Date(1, time.February, 3, 4, 5, 6, 0, time.FixedZone("", -(7*60*60+30*60+9))), "0001-02-03 04:05:06-07:30:09"},
159+
{time.Date(0, time.February, 3, 4, 5, 6, 0, time.FixedZone("", -(7*60*60+30*60+9))), "0001-02-03 04:05:06-07:30:09 BC"},
160160
}
161161

162162
func TestFormatTs(t *testing.T) {
@@ -168,6 +168,26 @@ func TestFormatTs(t *testing.T) {
168168
}
169169
}
170170

171+
func TestFormatTsBackend(t *testing.T) {
172+
db := openTestConn(t)
173+
defer db.Close()
174+
175+
var str string
176+
err := db.QueryRow("SELECT '2001-02-03T04:05:06.007-08:09:10'::time").Scan(&str)
177+
if err == nil {
178+
t.Fatalf("PostgreSQL is accepting an ISO timestamp input for time")
179+
}
180+
181+
for i, tt := range formatTimeTests {
182+
for _, typ := range []string{"date", "time", "timetz", "timestamp", "timestamptz"} {
183+
err = db.QueryRow("SELECT $1::"+typ+"::text", tt.time).Scan(&str)
184+
if err != nil {
185+
t.Errorf("%d: incorrect time format for %v on the backend: %v", i, typ, err)
186+
}
187+
}
188+
}
189+
}
190+
171191
func TestTimestampWithTimeZone(t *testing.T) {
172192
db := openTestConn(t)
173193
defer db.Close()

0 commit comments

Comments
 (0)