@@ -54,7 +54,7 @@ func (tstz *Timestamptz) Scan(src any) error {
54
54
55
55
switch src := src .(type ) {
56
56
case string :
57
- return scanPlanTextTimestamptzToTimestamptzScanner {}.Scan ([]byte (src ), tstz )
57
+ return ( & scanPlanTextTimestamptzToTimestamptzScanner {}) .Scan ([]byte (src ), tstz )
58
58
case time.Time :
59
59
* tstz = Timestamptz {Time : src , Valid : true }
60
60
return nil
@@ -124,17 +124,21 @@ func (tstz *Timestamptz) UnmarshalJSON(b []byte) error {
124
124
return nil
125
125
}
126
126
127
- type TimestamptzCodec struct {}
127
+ type TimestamptzCodec struct {
128
+ // ScanLocation is the location to return scanned timestamptz values in. This does not change the instant in time that
129
+ // the timestamptz represents.
130
+ ScanLocation * time.Location
131
+ }
128
132
129
- func (TimestamptzCodec ) FormatSupported (format int16 ) bool {
133
+ func (* TimestamptzCodec ) FormatSupported (format int16 ) bool {
130
134
return format == TextFormatCode || format == BinaryFormatCode
131
135
}
132
136
133
- func (TimestamptzCodec ) PreferredFormat () int16 {
137
+ func (* TimestamptzCodec ) PreferredFormat () int16 {
134
138
return BinaryFormatCode
135
139
}
136
140
137
- func (TimestamptzCodec ) PlanEncode (m * Map , oid uint32 , format int16 , value any ) EncodePlan {
141
+ func (* TimestamptzCodec ) PlanEncode (m * Map , oid uint32 , format int16 , value any ) EncodePlan {
138
142
if _ , ok := value .(TimestamptzValuer ); ! ok {
139
143
return nil
140
144
}
@@ -220,27 +224,27 @@ func (encodePlanTimestamptzCodecText) Encode(value any, buf []byte) (newBuf []by
220
224
return buf , nil
221
225
}
222
226
223
- func (TimestamptzCodec ) PlanScan (m * Map , oid uint32 , format int16 , target any ) ScanPlan {
227
+ func (c * TimestamptzCodec ) PlanScan (m * Map , oid uint32 , format int16 , target any ) ScanPlan {
224
228
225
229
switch format {
226
230
case BinaryFormatCode :
227
231
switch target .(type ) {
228
232
case TimestamptzScanner :
229
- return scanPlanBinaryTimestamptzToTimestamptzScanner {}
233
+ return & scanPlanBinaryTimestamptzToTimestamptzScanner {location : c . ScanLocation }
230
234
}
231
235
case TextFormatCode :
232
236
switch target .(type ) {
233
237
case TimestamptzScanner :
234
- return scanPlanTextTimestamptzToTimestamptzScanner {}
238
+ return & scanPlanTextTimestamptzToTimestamptzScanner {location : c . ScanLocation }
235
239
}
236
240
}
237
241
238
242
return nil
239
243
}
240
244
241
- type scanPlanBinaryTimestamptzToTimestamptzScanner struct {}
245
+ type scanPlanBinaryTimestamptzToTimestamptzScanner struct { location * time. Location }
242
246
243
- func (scanPlanBinaryTimestamptzToTimestamptzScanner ) Scan (src []byte , dst any ) error {
247
+ func (plan * scanPlanBinaryTimestamptzToTimestamptzScanner ) Scan (src []byte , dst any ) error {
244
248
scanner := (dst ).(TimestamptzScanner )
245
249
246
250
if src == nil {
@@ -264,15 +268,18 @@ func (scanPlanBinaryTimestamptzToTimestamptzScanner) Scan(src []byte, dst any) e
264
268
microsecFromUnixEpochToY2K / 1000000 + microsecSinceY2K / 1000000 ,
265
269
(microsecFromUnixEpochToY2K % 1000000 * 1000 )+ (microsecSinceY2K % 1000000 * 1000 ),
266
270
)
271
+ if plan .location != nil {
272
+ tim = tim .In (plan .location )
273
+ }
267
274
tstz = Timestamptz {Time : tim , Valid : true }
268
275
}
269
276
270
277
return scanner .ScanTimestamptz (tstz )
271
278
}
272
279
273
- type scanPlanTextTimestamptzToTimestamptzScanner struct {}
280
+ type scanPlanTextTimestamptzToTimestamptzScanner struct { location * time. Location }
274
281
275
- func (scanPlanTextTimestamptzToTimestamptzScanner ) Scan (src []byte , dst any ) error {
282
+ func (plan * scanPlanTextTimestamptzToTimestamptzScanner ) Scan (src []byte , dst any ) error {
276
283
scanner := (dst ).(TimestamptzScanner )
277
284
278
285
if src == nil {
@@ -312,13 +319,17 @@ func (scanPlanTextTimestamptzToTimestamptzScanner) Scan(src []byte, dst any) err
312
319
tim = time .Date (year , tim .Month (), tim .Day (), tim .Hour (), tim .Minute (), tim .Second (), tim .Nanosecond (), tim .Location ())
313
320
}
314
321
322
+ if plan .location != nil {
323
+ tim = tim .In (plan .location )
324
+ }
325
+
315
326
tstz = Timestamptz {Time : tim , Valid : true }
316
327
}
317
328
318
329
return scanner .ScanTimestamptz (tstz )
319
330
}
320
331
321
- func (c TimestamptzCodec ) DecodeDatabaseSQLValue (m * Map , oid uint32 , format int16 , src []byte ) (driver.Value , error ) {
332
+ func (c * TimestamptzCodec ) DecodeDatabaseSQLValue (m * Map , oid uint32 , format int16 , src []byte ) (driver.Value , error ) {
322
333
if src == nil {
323
334
return nil , nil
324
335
}
@@ -336,7 +347,7 @@ func (c TimestamptzCodec) DecodeDatabaseSQLValue(m *Map, oid uint32, format int1
336
347
return tstz .Time , nil
337
348
}
338
349
339
- func (c TimestamptzCodec ) DecodeValue (m * Map , oid uint32 , format int16 , src []byte ) (any , error ) {
350
+ func (c * TimestamptzCodec ) DecodeValue (m * Map , oid uint32 , format int16 , src []byte ) (any , error ) {
340
351
if src == nil {
341
352
return nil , nil
342
353
}
0 commit comments