81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
package time
|
|
|
|
import (
|
|
"context"
|
|
"math/big"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
// dateTimeFormat is a IMF-fixdate formatted time https://tools.ietf.org/html/rfc7231.html#section-7.1.1.1
|
|
dateTimeFormat = "2006-01-02T15:04:05.99Z"
|
|
|
|
// httpDateFormat is a date time defined by RFC3339 section 5.6 with no UTC offset.
|
|
httpDateFormat = "Mon, 02 Jan 2006 15:04:05 GMT"
|
|
)
|
|
|
|
var millisecondFloat = big.NewFloat(1e3)
|
|
|
|
// FormatDateTime format value as a date-time (RFC3339 section 5.6)
|
|
//
|
|
// Example: 1985-04-12T23:20:50.52Z
|
|
func FormatDateTime(value time.Time) string {
|
|
return value.Format(dateTimeFormat)
|
|
}
|
|
|
|
// ParseDateTime parse a string as a date-time
|
|
//
|
|
// Example: 1985-04-12T23:20:50.52Z
|
|
func ParseDateTime(value string) (time.Time, error) {
|
|
return time.Parse(dateTimeFormat, value)
|
|
}
|
|
|
|
// FormatHTTPDate format value as a http-date (RFC 7231#section-7.1.1.1 IMF-fixdate)
|
|
//
|
|
// Example: Tue, 29 Apr 2014 18:30:38 GMT
|
|
func FormatHTTPDate(value time.Time) string {
|
|
return value.Format(httpDateFormat)
|
|
}
|
|
|
|
// ParseHTTPDate parse a string as a http-date
|
|
//
|
|
// Example: Tue, 29 Apr 2014 18:30:38 GMT
|
|
func ParseHTTPDate(value string) (time.Time, error) {
|
|
return time.Parse(httpDateFormat, value)
|
|
}
|
|
|
|
// FormatEpochSeconds returns value as a Unix time in seconds with with decimal precision
|
|
//
|
|
// Example: 1515531081.123
|
|
func FormatEpochSeconds(value time.Time) float64 {
|
|
ms := value.UnixNano() / int64(time.Millisecond)
|
|
return float64(ms) / 1e3
|
|
}
|
|
|
|
// ParseEpochSeconds returns value as a Unix time in seconds with with decimal precision
|
|
//
|
|
// Example: 1515531081.123
|
|
func ParseEpochSeconds(value float64) time.Time {
|
|
f := big.NewFloat(value)
|
|
f = f.Mul(f, millisecondFloat)
|
|
i, _ := f.Int64()
|
|
return time.Unix(0, i*1e6).UTC()
|
|
}
|
|
|
|
// SleepWithContext will wait for the timer duration to expire, or the context
|
|
// is canceled. Which ever happens first. If the context is canceled the
|
|
// Context's error will be returned.
|
|
func SleepWithContext(ctx context.Context, dur time.Duration) error {
|
|
t := time.NewTimer(dur)
|
|
defer t.Stop()
|
|
|
|
select {
|
|
case <-t.C:
|
|
break
|
|
case <-ctx.Done():
|
|
return ctx.Err()
|
|
}
|
|
|
|
return nil
|
|
}
|