feat: time utils.

This commit is contained in:
tx7do
2023-10-25 14:52:15 +08:00
parent 7a94e485e7
commit ee5eb98b9c
4 changed files with 178 additions and 14 deletions

9
time/consts.go Normal file
View File

@@ -0,0 +1,9 @@
package util
const (
DateLayout = "2006-01-02"
ClockLayout = "15:04:05"
TimeLayout = DateLayout + " " + ClockLayout
DefaultTimeLocationName = "Asia/Shanghai"
)

61
time/diff.go Normal file
View File

@@ -0,0 +1,61 @@
package util
import (
"math"
"time"
)
// DayDifferenceHours 两天之间相差了多少小时
func DayDifferenceHours(startDate, endDate string) float64 {
startTime, _ := time.Parse(DateLayout, startDate)
endTime, _ := time.Parse(DateLayout, endDate)
duration := endTime.Sub(startTime)
return duration.Hours()
}
// StringDifferenceDays 两天之间相差了多少天
func StringDifferenceDays(startDate, endDate string) int {
hours := DayDifferenceHours(startDate, endDate)
if hours == 0 {
return 0
}
return int(math.Ceil(hours / 24))
}
func DayTimeDifferenceHours(startDate, endDate time.Time) float64 {
startTime := time.Date(startDate.Year(), startDate.Month(), startDate.Day(), 0, 0, 0, 0, time.Local)
endTime := time.Date(endDate.Year(), endDate.Month(), endDate.Day(), 0, 0, 0, 0, time.Local)
duration := endTime.Sub(startTime)
return duration.Hours()
}
// TimeDifferenceDays 两天之间相差了多少天
func TimeDifferenceDays(startDate, endDate time.Time) int {
hours := DayTimeDifferenceHours(startDate, endDate)
if hours == 0 {
return 0
}
return int(math.Ceil(hours / 24))
}
func DaySecondsDifferenceHours(startSecond, endSecond int64) float64 {
startTime := time.Unix(startSecond, 0)
endTime := time.Unix(endSecond, 0)
duration := endTime.Sub(startTime)
return duration.Hours()
}
// SecondsDifferenceDays 两天之间相差了多少天
func SecondsDifferenceDays(startSecond, endSecond int64) int {
hours := DaySecondsDifferenceHours(startSecond, endSecond)
if hours == 0 {
return 0
}
return int(math.Ceil(hours / 24))
}

57
time/diff_test.go Normal file
View File

@@ -0,0 +1,57 @@
package util
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func parseDate(str string) time.Time {
t, _ := time.Parse(DateLayout, str)
return t
}
func toSecond(str string) int64 {
t, _ := time.Parse(DateLayout, str)
return t.Unix()
}
func TestDifferenceDays(t *testing.T) {
assert.Equal(t, StringDifferenceDays("2017-09-01", "2017-09-01"), 0)
assert.Equal(t, StringDifferenceDays("2017-09-01", "2017-09-02"), 1)
assert.Equal(t, StringDifferenceDays("2017-09-01", "2017-09-03"), 2)
assert.Equal(t, StringDifferenceDays("2017-09-01", "2017-09-04"), 3)
assert.Equal(t, StringDifferenceDays("2017-09-01", "2018-03-11"), 191)
assert.True(t, (StringDifferenceDays("2017-09-01", "2017-09-01")) == 0)
assert.True(t, (StringDifferenceDays("2017-09-01", "2017-09-02"))%1 == 0)
assert.True(t, (StringDifferenceDays("2017-09-01", "2017-09-03"))%2 == 0)
}
func TestTimeDifferenceDays(t *testing.T) {
assert.Equal(t, TimeDifferenceDays(parseDate("2017-09-01"), parseDate("2017-09-01")), 0)
assert.Equal(t, TimeDifferenceDays(parseDate("2017-09-01"), parseDate("2017-09-02")), 1)
assert.Equal(t, TimeDifferenceDays(parseDate("2017-09-01"), parseDate("2017-09-03")), 2)
assert.Equal(t, TimeDifferenceDays(parseDate("2017-09-01"), parseDate("2017-09-04")), 3)
assert.Equal(t, TimeDifferenceDays(parseDate("2017-09-01"), parseDate("2018-03-11")), 191)
assert.True(t, (TimeDifferenceDays(parseDate("2017-09-01"), parseDate("2017-09-01"))) == 0)
assert.True(t, (TimeDifferenceDays(parseDate("2017-09-01"), parseDate("2017-09-02")))%1 == 0)
assert.True(t, (TimeDifferenceDays(parseDate("2017-09-01"), parseDate("2017-09-03")))%2 == 0)
}
func TestSecondsDifferenceDays(t *testing.T) {
assert.Equal(t, SecondsDifferenceDays(toSecond("2017-09-01"), toSecond("2017-09-01")), 0)
assert.Equal(t, SecondsDifferenceDays(toSecond("2017-09-01"), toSecond("2017-09-02")), 1)
assert.Equal(t, SecondsDifferenceDays(toSecond("2017-09-01"), toSecond("2017-09-03")), 2)
assert.Equal(t, SecondsDifferenceDays(toSecond("2017-09-01"), toSecond("2017-09-04")), 3)
assert.Equal(t, SecondsDifferenceDays(toSecond("2017-09-01"), toSecond("2018-03-11")), 191)
assert.True(t, (SecondsDifferenceDays(toSecond("2017-09-01"), toSecond("2017-09-01"))) == 0)
assert.True(t, (SecondsDifferenceDays(toSecond("2017-09-01"), toSecond("2017-09-02")))%1 == 0)
assert.True(t, (SecondsDifferenceDays(toSecond("2017-09-01"), toSecond("2017-09-03")))%2 == 0)
}

View File

@@ -6,10 +6,11 @@ import (
"github.com/tx7do/kratos-utils/trans"
)
const (
TimeLayout = "2006-01-02 15:04:05"
DateLayout = "2006-01-02"
)
var DefaultTimeLocation *time.Location
func RefreshDefaultTimeLocation(name string) {
DefaultTimeLocation, _ = time.LoadLocation(name)
}
// UnixMilliToStringPtr 毫秒时间戳 -> 字符串
func UnixMilliToStringPtr(tm *int64) *string {
@@ -38,12 +39,30 @@ func StringTimeToTime(str *string) *time.Time {
if len(*str) == 0 {
return nil
}
loc, _ := time.LoadLocation("Asia/Shanghai")
theTime, err := time.ParseInLocation(TimeLayout, *str, loc)
if err != nil {
return nil
if DefaultTimeLocation == nil {
RefreshDefaultTimeLocation(DefaultTimeLocationName)
}
return &theTime
var err error
var theTime time.Time
theTime, err = time.ParseInLocation(TimeLayout, *str, DefaultTimeLocation)
if err == nil {
return &theTime
}
theTime, err = time.ParseInLocation(DateLayout, *str, DefaultTimeLocation)
if err == nil {
return &theTime
}
theTime, err = time.ParseInLocation(ClockLayout, *str, DefaultTimeLocation)
if err == nil {
return &theTime
}
return nil
}
// TimeToTimeString 时间 -> 时间字符串
@@ -62,12 +81,30 @@ func StringDateToTime(str *string) *time.Time {
if len(*str) == 0 {
return nil
}
loc, _ := time.LoadLocation("Asia/Shanghai")
theTime, err := time.ParseInLocation(DateLayout, *str, loc)
if err != nil {
return nil
if DefaultTimeLocation == nil {
RefreshDefaultTimeLocation(DefaultTimeLocationName)
}
return &theTime
var err error
var theTime time.Time
theTime, err = time.ParseInLocation(TimeLayout, *str, DefaultTimeLocation)
if err == nil {
return &theTime
}
theTime, err = time.ParseInLocation(DateLayout, *str, DefaultTimeLocation)
if err == nil {
return &theTime
}
theTime, err = time.ParseInLocation(ClockLayout, *str, DefaultTimeLocation)
if err == nil {
return &theTime
}
return nil
}
// TimeToDateString 时间 -> 日期字符串