247 lines
5.4 KiB
Go
247 lines
5.4 KiB
Go
package timeutil
|
|
|
|
import (
|
|
"time"
|
|
|
|
"google.golang.org/protobuf/types/known/durationpb"
|
|
"google.golang.org/protobuf/types/known/timestamppb"
|
|
|
|
"github.com/tx7do/go-utils/trans"
|
|
)
|
|
|
|
var defaultTimeLocation *time.Location
|
|
|
|
func RefreshDefaultTimeLocation(name string) *time.Location {
|
|
if defaultTimeLocation == nil {
|
|
defaultTimeLocation, _ = time.LoadLocation(name)
|
|
}
|
|
return defaultTimeLocation
|
|
}
|
|
|
|
func GetDefaultTimeLocation() *time.Location {
|
|
if defaultTimeLocation == nil {
|
|
RefreshDefaultTimeLocation(DefaultTimeLocationName)
|
|
}
|
|
return defaultTimeLocation
|
|
}
|
|
|
|
// UnixMilliToStringPtr 毫秒时间戳 -> 字符串
|
|
func UnixMilliToStringPtr(tm *int64) *string {
|
|
if tm == nil {
|
|
return nil
|
|
}
|
|
str := time.UnixMilli(*tm).Format(TimeLayout)
|
|
return &str
|
|
}
|
|
|
|
// StringToUnixMilliInt64Ptr 字符串 -> 毫秒时间戳
|
|
func StringToUnixMilliInt64Ptr(tm *string) *int64 {
|
|
if tm == nil {
|
|
return nil
|
|
}
|
|
|
|
theTime := StringTimeToTime(tm)
|
|
if theTime == nil {
|
|
return nil
|
|
}
|
|
unixTime := theTime.UnixMilli()
|
|
return &unixTime
|
|
}
|
|
|
|
// UnixMilliToTimePtr 毫秒时间戳 -> 时间
|
|
func UnixMilliToTimePtr(tm *int64) *time.Time {
|
|
if tm == nil {
|
|
return nil
|
|
}
|
|
|
|
unixMilli := time.UnixMilli(*tm)
|
|
return &unixMilli
|
|
}
|
|
|
|
// TimeToUnixMilliInt64Ptr 时间 -> 毫秒时间戳
|
|
func TimeToUnixMilliInt64Ptr(tm *time.Time) *int64 {
|
|
if tm == nil {
|
|
return nil
|
|
}
|
|
|
|
unixTime := tm.UnixMilli()
|
|
return &unixTime
|
|
}
|
|
|
|
// UnixSecondToTimePtr 秒时间戳 -> 时间
|
|
func UnixSecondToTimePtr(tm *int64) *time.Time {
|
|
if tm == nil {
|
|
return nil
|
|
}
|
|
|
|
unixMilli := time.Unix(*tm, 0)
|
|
return &unixMilli
|
|
}
|
|
|
|
// TimeToUnixSecondInt64Ptr 时间 -> 秒时间戳
|
|
func TimeToUnixSecondInt64Ptr(tm *time.Time) *int64 {
|
|
if tm == nil {
|
|
return nil
|
|
}
|
|
|
|
unixTime := tm.Unix()
|
|
return &unixTime
|
|
}
|
|
|
|
// StringTimeToTime 时间字符串 -> 时间
|
|
func StringTimeToTime(str *string) *time.Time {
|
|
if str == nil {
|
|
return nil
|
|
}
|
|
if len(*str) == 0 {
|
|
return nil
|
|
}
|
|
|
|
var err error
|
|
var theTime time.Time
|
|
|
|
theTime, err = time.ParseInLocation(TimeLayout, *str, GetDefaultTimeLocation())
|
|
if err == nil {
|
|
return &theTime
|
|
}
|
|
|
|
theTime, err = time.ParseInLocation(DateLayout, *str, GetDefaultTimeLocation())
|
|
if err == nil {
|
|
return &theTime
|
|
}
|
|
|
|
theTime, err = time.ParseInLocation(ClockLayout, *str, GetDefaultTimeLocation())
|
|
if err == nil {
|
|
return &theTime
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// TimeToTimeString 时间 -> 时间字符串
|
|
func TimeToTimeString(tm *time.Time) *string {
|
|
if tm == nil {
|
|
return nil
|
|
}
|
|
return trans.String(tm.Format(TimeLayout))
|
|
}
|
|
|
|
// StringDateToTime 字符串 -> 时间
|
|
func StringDateToTime(str *string) *time.Time {
|
|
if str == nil {
|
|
return nil
|
|
}
|
|
if len(*str) == 0 {
|
|
return nil
|
|
}
|
|
|
|
var err error
|
|
var theTime time.Time
|
|
|
|
theTime, err = time.ParseInLocation(TimeLayout, *str, GetDefaultTimeLocation())
|
|
if err == nil {
|
|
return &theTime
|
|
}
|
|
|
|
theTime, err = time.ParseInLocation(DateLayout, *str, GetDefaultTimeLocation())
|
|
if err == nil {
|
|
return &theTime
|
|
}
|
|
|
|
theTime, err = time.ParseInLocation(ClockLayout, *str, GetDefaultTimeLocation())
|
|
if err == nil {
|
|
return &theTime
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// TimeToDateString 时间 -> 日期字符串
|
|
func TimeToDateString(tm *time.Time) *string {
|
|
if tm == nil {
|
|
return nil
|
|
}
|
|
return trans.String(tm.Format(DateLayout))
|
|
}
|
|
|
|
// TimestamppbToTime timestamppb.Timestamp -> time.Time
|
|
func TimestamppbToTime(tm *timestamppb.Timestamp) *time.Time {
|
|
if tm != nil {
|
|
return trans.Ptr(tm.AsTime())
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// TimeToTimestamppb time.Time -> timestamppb.Timestamp
|
|
func TimeToTimestamppb(tm *time.Time) *timestamppb.Timestamp {
|
|
if tm != nil {
|
|
return timestamppb.New(*tm)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func FloatToDurationpb(duration *float64, timePrecision time.Duration) *durationpb.Duration {
|
|
if duration == nil {
|
|
return nil
|
|
}
|
|
return durationpb.New(time.Duration(*duration * float64(timePrecision)))
|
|
}
|
|
|
|
func Float64ToDurationpb(d float64) *durationpb.Duration {
|
|
duration := time.Duration(d * float64(time.Second))
|
|
return durationpb.New(duration)
|
|
}
|
|
|
|
func SecondToDurationpb(seconds *float64) *durationpb.Duration {
|
|
return FloatToDurationpb(seconds, time.Second)
|
|
}
|
|
|
|
func DurationpbToFloat(duration *durationpb.Duration, timePrecision time.Duration) *float64 {
|
|
if duration == nil {
|
|
return nil
|
|
}
|
|
seconds := duration.AsDuration().Seconds()
|
|
secondsWithPrecision := seconds / timePrecision.Seconds()
|
|
return &secondsWithPrecision
|
|
}
|
|
|
|
func NumberToDurationpb[T int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64](duration *T, timePrecision time.Duration) *durationpb.Duration {
|
|
if duration == nil {
|
|
return nil
|
|
}
|
|
return durationpb.New(time.Duration(*duration) * timePrecision)
|
|
}
|
|
|
|
func DurationpbToNumber[T int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64](duration *durationpb.Duration, timePrecision time.Duration) *T {
|
|
if duration == nil {
|
|
return nil
|
|
}
|
|
seconds := duration.AsDuration().Seconds()
|
|
secondsWithPrecision := T(seconds / timePrecision.Seconds())
|
|
return &secondsWithPrecision
|
|
}
|
|
|
|
func DurationToDurationpb(duration *time.Duration) *durationpb.Duration {
|
|
if duration == nil {
|
|
return nil
|
|
}
|
|
return durationpb.New(*duration)
|
|
}
|
|
|
|
func DurationpbToDuration(duration *durationpb.Duration) *time.Duration {
|
|
if duration == nil {
|
|
return nil
|
|
}
|
|
d := duration.AsDuration()
|
|
return &d
|
|
}
|
|
|
|
func DurationpbSecond(duration *durationpb.Duration) *float64 {
|
|
if duration == nil {
|
|
return nil
|
|
}
|
|
seconds := duration.AsDuration().Seconds()
|
|
secondsInt64 := seconds
|
|
return &secondsInt64
|
|
}
|