Files
hiscaler-gox/timex/time.go
scheibling b4eb50ab55
Some checks failed
Go / build (push) Failing after 7s
Created
2025-04-08 19:16:39 +02:00

124 lines
3.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}