package time
import (
)
const (
dateTimeFormatInput = "2006-01-02T15:04:05.999999999Z"
dateTimeFormatInputNoZ = "2006-01-02T15:04:05.999999999"
dateTimeFormatOutput = "2006-01-02T15:04:05.999Z"
httpDateFormat = "Mon, 02 Jan 2006 15:04:05 GMT"
httpDateFormatSingleDigitDay = "Mon, _2 Jan 2006 15:04:05 GMT"
httpDateFormatSingleDigitDayTwoDigitYear = "Mon, _2 Jan 06 15:04:05 GMT"
)
var millisecondFloat = big.NewFloat(1e3)
func ( time.Time) string {
return .UTC().Format(dateTimeFormatOutput)
}
func ( string) (time.Time, error) {
return tryParse(,
dateTimeFormatInput,
dateTimeFormatInputNoZ,
time.RFC3339Nano,
time.RFC3339,
)
}
func ( time.Time) string {
return .UTC().Format(httpDateFormat)
}
func ( string) (time.Time, error) {
return tryParse(,
httpDateFormat,
httpDateFormatSingleDigitDay,
httpDateFormatSingleDigitDayTwoDigitYear,
time.RFC850,
time.ANSIC,
)
}
func ( time.Time) float64 {
:= .UnixNano() / int64(time.Millisecond)
return float64() / 1e3
}
func ( float64) time.Time {
:= big.NewFloat()
= .Mul(, millisecondFloat)
, := .Int64()
return time.Unix(0, *1e6).UTC()
}
func ( string, ...string) (time.Time, error) {
var parseErrors
for , := range {
, := time.Parse(, )
if != nil {
= append(, parseError{
Format: ,
Err: ,
})
continue
}
return , nil
}
return time.Time{}, fmt.Errorf("unable to parse time string, %w", )
}
type parseErrors []parseError
func ( parseErrors) () string {
var strings.Builder
for , := range {
fmt.Fprintf(&, "\n * %q: %v", .Format, .Err)
}
return "parse errors:" + .String()
}
type parseError struct {
Format string
Err error
}
func ( context.Context, time.Duration) error {
:= time.NewTimer()
defer .Stop()
select {
case <-.C:
break
case <-.Done():
return .Err()
}
return nil
}