210 lines
5.6 KiB
Go
210 lines
5.6 KiB
Go
package xtime
|
||
|
||
import (
|
||
"fmt"
|
||
"time"
|
||
|
||
"github.com/golang-module/carbon/v2"
|
||
)
|
||
|
||
// 基于Carbon而不是Time
|
||
// 默认将 SaoPauloTimezoneOffset 作为时区偏移
|
||
// 默认将 WeekStartsAt 作为每周起始
|
||
// 注意新加的函数都要基于Now()
|
||
|
||
// 设置时区
|
||
// reverse:给Now()设置时传false,解析系统时区输出的字符串/时间戳时传true
|
||
func setLocation(c *carbon.Carbon, offsets ...int) *carbon.Carbon {
|
||
var loc *time.Location
|
||
if len(offsets) > 0 {
|
||
loc = time.FixedZone("CUS", offsets[len(offsets)-1])
|
||
} else {
|
||
loc = time.FixedZone("CST", sysTimezoneOffset)
|
||
}
|
||
|
||
return c.SetLocation(loc)
|
||
}
|
||
|
||
func set(c *carbon.Carbon, offsets ...int) *carbon.Carbon {
|
||
// 设置周起始
|
||
c = c.SetWeekStartsAt(WeekStartsAt)
|
||
// 设置时区
|
||
c = setLocation(c, offsets...)
|
||
return c
|
||
}
|
||
|
||
func Now(offsets ...int) (c *carbon.Carbon) {
|
||
c = carbon.Now().AddSeconds(nowOffset)
|
||
c = set(c, offsets...)
|
||
return
|
||
}
|
||
|
||
func ConvertToCarbon[T time.Time | *carbon.Carbon | int64](t T, offsets ...int) *carbon.Carbon {
|
||
var c *carbon.Carbon
|
||
switch v := any(t).(type) {
|
||
case time.Time:
|
||
c = set(carbon.CreateFromStdTime(v), offsets...)
|
||
case *carbon.Carbon:
|
||
c = set(v, offsets...)
|
||
case int64:
|
||
c = set(carbon.CreateFromTimestamp(v), offsets...)
|
||
}
|
||
return c
|
||
}
|
||
|
||
// IsTodayTimestamp 判断该时间戳是否为今天
|
||
func IsTodayTimestamp[T int | int64](timestamp T, offsets ...int) bool {
|
||
return IsToday(int64(timestamp), offsets...)
|
||
}
|
||
|
||
// IsToday 判断时间是否为今天
|
||
func IsToday[T time.Time | *carbon.Carbon | int64](t T, offsets ...int) bool {
|
||
c := ConvertToCarbon(t, offsets...)
|
||
|
||
return c.ToDateString() == Now().ToDateString()
|
||
}
|
||
|
||
// IsBeforeNow 判断时间t是否在现在之前
|
||
// example:
|
||
//
|
||
// now := time.Now()
|
||
// before := time.Now().Add(-time.Hour)
|
||
// IsBeforeNow(after) // true
|
||
func IsBeforeNow[T time.Time | *carbon.Carbon | int64](t T, offsets ...int) bool {
|
||
return !IsAfterNow(t, offsets...)
|
||
}
|
||
|
||
// IsAfterNow 判断时间t是否在现在之后
|
||
// example:
|
||
//
|
||
// now := time.Now()
|
||
// after := time.Now().Add(time.Hour)
|
||
// IsAfterNow(after) // true
|
||
func IsAfterNow[T time.Time | *carbon.Carbon | int64](t T, offsets ...int) bool {
|
||
switch v := any(t).(type) {
|
||
case time.Time:
|
||
return IsAfter(v, time.Now(), offsets...)
|
||
case *carbon.Carbon:
|
||
return IsAfter(v, Now(), offsets...)
|
||
case int64:
|
||
return IsAfter(v, Now().Timestamp())
|
||
default:
|
||
return false
|
||
}
|
||
}
|
||
|
||
// IsBefore 判断时间t1是否在t2之前
|
||
// example:
|
||
// t1 := time.Now().Add(-time.Hour)
|
||
// t2 := time.Now()
|
||
// IsBefore(t1,t2) // true
|
||
func IsBefore[T time.Time | *carbon.Carbon | int64](t1, t2 T, offsets ...int) bool {
|
||
return !IsAfter(t1, t2, offsets...)
|
||
}
|
||
|
||
// IsAfter 判断时间t1是否在t2之后
|
||
// example:
|
||
// t1 := time.Now().Add(time.Hour)
|
||
// t2 := time.Now()
|
||
// IsAfter(t1,t2) // true
|
||
func IsAfter[T time.Time | *carbon.Carbon | int64](t1, t2 T, offsets ...int) bool {
|
||
c1, c2 := ConvertToCarbon(t1, offsets...), ConvertToCarbon(t2, offsets...)
|
||
return c1.Gt(c2)
|
||
}
|
||
|
||
// TimestampToTime 将时间戳转为 carbon.Carbon 类型
|
||
func TimestampToTime[T int | int64](timestamp T, offsets ...int) *carbon.Carbon {
|
||
return set(carbon.CreateFromTimestamp(int64(timestamp)), offsets...)
|
||
}
|
||
|
||
// IsInDuration 判断某个时间在某个时间段内
|
||
func IsInDuration[T time.Time | *carbon.Carbon | int64](t, start, end T, offsets ...int) bool {
|
||
return IsAfter(t, start, offsets...) && IsBefore(t, end, offsets...)
|
||
}
|
||
|
||
// FormatDuration 将起止时间,格式化为 format - format
|
||
func FormatDuration[T time.Time | *carbon.Carbon | int64](start, end T, layout string, offsets ...int) string {
|
||
startC, endC := ConvertToCarbon(start, offsets...), ConvertToCarbon(end, offsets...)
|
||
return fmt.Sprintf("%s - %s", startC.StdTime().Format(layout), endC.StdTime().Format(layout))
|
||
}
|
||
|
||
func Yesterday(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).SubDay().StartOfDay()
|
||
}
|
||
|
||
func Today(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).StartOfDay()
|
||
}
|
||
|
||
func Tomorrow(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddDay().StartOfDay()
|
||
}
|
||
|
||
func NextNDay(n int, offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddDays(n).StartOfDay()
|
||
}
|
||
|
||
func LastWeek(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).SubWeek().StartOfWeek()
|
||
}
|
||
|
||
func ThisWeek(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).StartOfWeek()
|
||
}
|
||
|
||
func NextWeek(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddWeek().StartOfWeek()
|
||
}
|
||
|
||
func NextNWeek(n int, offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddWeeks(n).StartOfWeek()
|
||
}
|
||
|
||
func LastMonth(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).SubMonth().StartOfMonth()
|
||
}
|
||
|
||
func ThisMonth(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).StartOfMonth()
|
||
}
|
||
|
||
func NextMonth(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddMonth().StartOfMonth()
|
||
}
|
||
|
||
func NextNMonth(n int, offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddMonths(n).StartOfMonth()
|
||
}
|
||
|
||
func LastQuarter(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).SubQuarter().StartOfQuarter()
|
||
}
|
||
|
||
func ThisQuarter(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).StartOfQuarter()
|
||
}
|
||
|
||
func NextQuarter(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddQuarter().StartOfQuarter()
|
||
}
|
||
|
||
func NextNQuarter(n int, offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddQuarters(n).StartOfQuarter()
|
||
}
|
||
|
||
func LastYear(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).SubYear().StartOfYear()
|
||
}
|
||
|
||
func ThisYear(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).StartOfYear()
|
||
}
|
||
|
||
func NextYear(offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddYear().StartOfYear()
|
||
}
|
||
|
||
func NextNYear(n int, offsets ...int) *carbon.Carbon {
|
||
return Now(offsets...).AddYears(n).StartOfYear()
|
||
}
|