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.

74 lines
1.8 KiB

package formatime
import (
"fmt"
"time"
)
// CustomTime is a nullable time.Time. It supports SQL, JSON serialization AND custom format.
// It will marshal to null if null.
type CustomTime struct {
protocol
Format string
}
// new custom format of time, s is timestamp
// examples:
// ANSIC = "Mon Jan _2 15:04:05 2006"
// UnixDate = "Mon Jan _2 15:04:05 MST 2006"
// RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
// RFC822 = "02 Jan 06 15:04 MST"
// RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
// RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
// RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
// RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
// RFC3339 = "2006-01-02T15:04:05Z07:00"
// RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
// Kitchen = "3:04PM"
// // Handy time stamps.
// Stamp = "Jan _2 15:04:05"
// StampMilli = "Jan _2 15:04:05.000"
// StampMicro = "Jan _2 15:04:05.000000"
// StampNano = "Jan _2 15:04:05.000000000"
func NewCustomTime(s int64, format string) CustomTime {
return CustomTime{
protocol: protocol{
Time: time.Unix(s, 0),
Valid: true,
},
Format: format,
}
}
// new custom format of time from time.Time
func NewCustomTimeFrom(t time.Time, format string) CustomTime {
return CustomTime{
protocol: protocol{
Time: t,
Valid: true,
},
Format: format,
}
}
// new custom format of time right now
func NewCustomTimeNow(format string) CustomTime {
return CustomTime{
protocol: protocol{
Time: time.Now(),
Valid: true,
},
Format: format,
}
}
// MarshalJSON implements json.Marshaler.
// It will encode null if this time is null.
func (t CustomTime) MarshalJSON() ([]byte, error) {
if !t.Valid {
return []byte("null"), nil
}
var stamp = fmt.Sprintf("\"%s\"", t.Time.Format(t.Format))
return []byte(stamp), nil
}