Files
hiscaler-gox/timex/time.go

124 lines
3.0 KiB
Go
Raw Normal View History

2025-04-08 19:16:39 +02:00
package timex
import (
"math"
"time"
)
// IsAmericaSummerTime 是否为美国夏令时间
// 夏令时开始于每年3月的第二个周日凌晨人们需要将时间调早 (顺时针) 1个小时
// 夏令时结束于每年11月的第一个周日凌晨人们需要将时间调晚 (逆时针) 1个小时。
func IsAmericaSummerTime(t time.Time) (yes bool) {
if t.IsZero() {
return
}
month := t.Month()
switch month {
case 4, 5, 6, 7, 8, 9, 10:
yes = true
case 3, 11:
day := t.Day()
t1 := t.AddDate(0, 0, -day+1)
weekday := int(t1.Weekday())
if (month == 3 && day >= t1.AddDate(0, 0, 14-weekday).Day()) ||
(month == 11 && day < t1.AddDate(0, 0, 7-weekday).Day()) {
yes = true
}
}
return
}
// ChineseTimeLocation Return chinese time location
func ChineseTimeLocation() *time.Location {
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
loc = time.FixedZone("CST", 8*3600)
}
return loc
}
func Between(t, begin, end time.Time) bool {
return (t.After(begin) && t.Before(end)) || t.Equal(begin) || t.Equal(end)
}
func DayStart(t time.Time) time.Time {
return time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, time.Local)
}
func DayEnd(t time.Time) time.Time {
return time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 999999999, time.Local)
}
func MonthStart(t time.Time) time.Time {
return time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, time.Local)
}
func MonthEnd(t time.Time) time.Time {
return DayEnd(MonthStart(t).AddDate(0, 1, -1))
}
// IsAM Check is AM
func IsAM(t time.Time) bool {
return t.Hour() <= 11
}
// IsPM Check is PM
func IsPM(t time.Time) bool {
return t.Hour() >= 12
}
func WeekStart(yearWeek int) time.Time {
year := yearWeek / 100
week := yearWeek % year
// Start from the middle of the year:
t := time.Date(year, 7, 1, 0, 0, 0, 0, time.UTC)
// Roll back to Monday:
if wd := t.Weekday(); wd == time.Sunday {
t = t.AddDate(0, 0, -6)
} else {
t = t.AddDate(0, 0, -int(wd)+1)
}
// Difference in weeks:
_, w := t.ISOWeek()
t = t.AddDate(0, 0, (week-w)*7)
return t
}
func WeekEnd(yearWeek int) time.Time {
t := WeekStart(yearWeek).AddDate(0, 0, 6)
return time.Date(t.Year(), t.Month(), t.Day(), 23, 59, 59, 0, time.UTC)
}
func YearWeeksByWeek(startYearWeek, endYearWeek int) []int {
weeks := make([]int, 0)
weekStart := WeekStart(startYearWeek)
weekEnd := WeekStart(endYearWeek)
for {
if weekStart.After(weekEnd) {
break
}
y, w := weekStart.ISOWeek()
weeks = append(weeks, y*100+w)
weekStart = weekStart.AddDate(0, 0, 7)
}
return weeks
}
func YearWeeksByTime(startDate, endDate time.Time) []int {
y1, w1 := startDate.ISOWeek()
y2, w2 := endDate.ISOWeek()
return YearWeeksByWeek(y1*100+w1, y2*100+w2)
}
// XISOWeek 非 ISO 周,从周日开始算起作为一周的第一天
func XISOWeek(t time.Time) (year, week int) {
t1 := time.Date(t.Year(), t.Month(), t.Day()+4-int(t.Weekday()), 0, 0, 0, 0, time.UTC)
startTime := time.Date(t1.Year(), 1, 1, 0, 0, 0, 0, time.UTC)
week = int(math.Ceil((float64((t1.Unix()-startTime.Unix())/86400) + 1) / 7))
return startTime.Year(), week
}