github.com/jackc/pgx/v5@v5.5.5/pgtype/zeronull/timestamptz.go (about) 1 package zeronull 2 3 import ( 4 "database/sql/driver" 5 "fmt" 6 "time" 7 8 "github.com/jackc/pgx/v5/pgtype" 9 ) 10 11 type Timestamptz time.Time 12 13 func (Timestamptz) SkipUnderlyingTypePlan() {} 14 15 func (ts *Timestamptz) ScanTimestamptz(v pgtype.Timestamptz) error { 16 if !v.Valid { 17 *ts = Timestamptz{} 18 return nil 19 } 20 21 switch v.InfinityModifier { 22 case pgtype.Finite: 23 *ts = Timestamptz(v.Time) 24 return nil 25 case pgtype.Infinity: 26 return fmt.Errorf("cannot scan Infinity into *time.Time") 27 case pgtype.NegativeInfinity: 28 return fmt.Errorf("cannot scan -Infinity into *time.Time") 29 default: 30 return fmt.Errorf("invalid InfinityModifier: %v", v.InfinityModifier) 31 } 32 } 33 34 func (ts Timestamptz) TimestamptzValue() (pgtype.Timestamptz, error) { 35 if time.Time(ts).IsZero() { 36 return pgtype.Timestamptz{}, nil 37 } 38 39 return pgtype.Timestamptz{Time: time.Time(ts), Valid: true}, nil 40 } 41 42 // Scan implements the database/sql Scanner interface. 43 func (ts *Timestamptz) Scan(src any) error { 44 if src == nil { 45 *ts = Timestamptz{} 46 return nil 47 } 48 49 var nullable pgtype.Timestamptz 50 err := nullable.Scan(src) 51 if err != nil { 52 return err 53 } 54 55 *ts = Timestamptz(nullable.Time) 56 57 return nil 58 } 59 60 // Value implements the database/sql/driver Valuer interface. 61 func (ts Timestamptz) Value() (driver.Value, error) { 62 if time.Time(ts).IsZero() { 63 return nil, nil 64 } 65 66 return time.Time(ts), nil 67 }