Files
go-utils/timeutil/trans.go
2025-07-07 10:33:58 +08:00

363 lines
7.8 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(milli *int64) *string {
if milli == nil {
return nil
}
tm := time.UnixMilli(*milli)
str := tm.In(GetDefaultTimeLocation()).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(milli *int64) *time.Time {
if milli == nil {
return nil
}
unixMilli := time.UnixMilli(*milli)
return &unixMilli
}
// TimeToUnixMilliInt64Ptr 时间 -> 毫秒时间戳
func TimeToUnixMilliInt64Ptr(tm *time.Time) *int64 {
if tm == nil {
return nil
}
unixTime := tm.UnixMilli()
return &unixTime
}
// UnixSecondToTimePtr 秒时间戳 -> 时间
func UnixSecondToTimePtr(second *int64) *time.Time {
if second == nil {
return nil
}
unixMilli := time.Unix(*second, 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
if theTime, err = time.ParseInLocation(TimeLayout, *str, GetDefaultTimeLocation()); err == nil {
return &theTime
}
if theTime, err = time.ParseInLocation(DateLayout, *str, GetDefaultTimeLocation()); err == nil {
return &theTime
}
if theTime, err = time.ParseInLocation(ClockLayout, *str, GetDefaultTimeLocation()); err == nil {
return &theTime
}
if theTime, err = time.ParseInLocation(ISO9075MicroTZ, *str, GetDefaultTimeLocation()); err == nil {
return &theTime
}
return nil
}
// TimeToTimeString 时间 -> 时间字符串
func TimeToTimeString(tm *time.Time) *string {
if tm == nil {
return nil
}
return trans.String(tm.In(GetDefaultTimeLocation()).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.In(GetDefaultTimeLocation()).Format(DateLayout))
}
func StringToTime(str *string, layout 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(layout, *str, GetDefaultTimeLocation())
if err == nil {
return &theTime
}
return nil
}
func TimeToString(tm *time.Time, layout string) *string {
if tm == nil {
return nil
}
return trans.String(tm.Format(layout))
}
// TimestamppbToTime timestamppb.Timestamp -> time.Time
func TimestamppbToTime(timestamp *timestamppb.Timestamp) *time.Time {
if timestamp != nil {
return trans.Ptr(timestamp.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 DurationpbToSecond(duration *durationpb.Duration) *float64 {
if duration == nil {
return nil
}
seconds := duration.AsDuration().Seconds()
secondsInt64 := seconds
return &secondsInt64
}
func StringToDurationpb(in *string) *durationpb.Duration {
if in == nil {
return nil
}
f, _ := time.ParseDuration(*in)
return durationpb.New(f)
}
func DurationpbToString(in *durationpb.Duration) *string {
if in == nil {
return nil
}
return trans.Ptr(in.AsDuration().String())
}
// TimestampToSeconds 将 timestamppb.Timestamp 转换为秒
func TimestampToSeconds(ts *timestamppb.Timestamp) int64 {
if ts == nil {
return 0
}
return ts.AsTime().Unix()
}
// SecondsToTimestamp 将秒转换为 timestamppb.Timestamp
func SecondsToTimestamp(seconds *int64) *timestamppb.Timestamp {
if seconds == nil {
return nil
}
return timestamppb.New(time.Unix(*seconds, 0))
}
func TimestampToMilliseconds(ts *timestamppb.Timestamp) int64 {
if ts == nil {
return 0
}
return ts.AsTime().UnixMilli()
}
func MillisecondsToTimestamp(milliseconds *int64) *timestamppb.Timestamp {
if milliseconds == nil {
return nil
}
return timestamppb.New(time.UnixMilli(*milliseconds))
}
func TimestampToMicroseconds(ts *timestamppb.Timestamp) int64 {
if ts == nil {
return 0
}
return ts.AsTime().UnixMicro()
}
func MicrosecondsToTimestamp(microseconds *int64) *timestamppb.Timestamp {
if microseconds == nil {
return nil
}
return timestamppb.New(time.UnixMicro(*microseconds))
}
// TimestampToNanoseconds 将 timestamppb.Timestamp 转换为纳秒
func TimestampToNanoseconds(ts *timestamppb.Timestamp) int64 {
if ts == nil {
return 0
}
return ts.AsTime().UnixNano()
}
// NanosecondsToTimestamp 将纳秒转换为 timestamppb.Timestamp
func NanosecondsToTimestamp(nanoseconds *int64) *timestamppb.Timestamp {
if nanoseconds == nil {
return nil
}
return timestamppb.New(time.Unix(0, *nanoseconds))
}