You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.1 KiB
53 lines
1.1 KiB
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 |
|
}
|
|
|