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 }