fox/xtime/timex.go

210 lines
5.6 KiB
Go
Raw Normal View History

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