1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package utils
- import (
- "database/sql/driver"
- "fmt"
- "time"
- )
- // NullTime is a custom nullable time for representing datetime.
- type NullTime struct {
- Time time.Time
- Valid bool // Valid is true if Time is not NULL
- }
- // Scan implements the Scanner interface.
- func (nt *NullTime) Scan(value interface{}) error {
- nt.Time, nt.Valid = value.(time.Time)
- return nil
- }
- // Value implements the driver Value interface.
- func (nt NullTime) Value() (driver.Value, error) {
- if !nt.Valid {
- return nil, nil
- }
- return nt.Time, nil
- }
- // MarshalJSON implements the JSON marshal function.
- func (nt NullTime) MarshalJSON() ([]byte, error) {
- if !nt.Valid {
- return []byte("null"), nil
- }
- val := fmt.Sprintf("\"%s\"", nt.Time.Format(time.RFC3339))
- return []byte(val), nil
- }
- // UnmarshalJSON implements the JSON unmarshal function.
- func (nt NullTime) UnmarshalJSON(data []byte) error {
- dateString := string(data)
- if dateString == "null" {
- return nil
- }
- dateStringWithoutQuotes := dateString[1 : len(dateString)-1]
- parsedDateTime, err := time.Parse(time.RFC3339, dateStringWithoutQuotes)
- if err != nil {
- return err
- }
- nt.Time = parsedDateTime // nolint
- return nil
- }
|