go一个关于时间范围的公共处理
package dateutils import ( time gitee.com/gowebframe3/webframe.git/goconfig/base/basedto github.com/gogf/gf/v2/os/gtime ) type DateRange struct { basedto.BaseEntity json:- //开始时间 2026-03-05T16:18:07.828246808:00 Start time.Time json:start gorm:- //结束时间 2026-03-05T16:18:07.828246808:00 End time.Time json:end gorm:- } func NewDateRange() *DateRange { return DateRange{} } func (self *DateRange) Today() *DateRange { self.Start time.Now() self.End time.Now() return self } func (self *DateRange) ToShanghai(day time.Time) time.Time { loc, _ : time.LoadLocation(Asia/Shanghai) return day.In(loc) } func (self *DateRange) TimeFormatCustom(day time.Time) string { return day.Format(CustomTimeFormat) } func (self *DateRange) TimeFormatIso8601(day time.Time) string { return day.Format(time.RFC3339) } // RFC3339Nano func (self *DateRange) TimeFormatIso8601Naro(day time.Time) string { return day.Format(time.RFC3339Nano) } func (self *DateRange) MonthFirstDay(day time.Time) time.Time { firstDay : time.Date(day.Year(), day.Month(), 1, 0, 0, 0, 0, day.Location()) return firstDay } func (self *DateRange) MonthLastDay(day time.Time) time.Time { var firstDay MonthFirstDay(day) lastDay : firstDay.AddDate(0, 1, 0).Add(-time.Nanosecond) return lastDay } func (self *DateRange) DateStr2Date(days string) time.Time { var day gtime.NewFromStrFormat(days, time.DateOnly) return day.Time } func (self *DateRange) DateStr2GDate(days string) *gtime.Time { var day gtime.NewFromStrFormat(days, time.DateOnly) return day } func (self *DateRange) Date2DateOnly(day time.Time) time.Time { return time.Date(day.Year(), day.Month(), day.Day(), 0, 0, 0, 0, day.Location()) } func (self *DateRange) Date2DateEnd(day time.Time) time.Time { var end Date2DateOnly(day) endDay : end.AddDate(0, 0, 1).Add(-time.Nanosecond) return endDay } // 2026-03-16 00:00:00 0800 CST 2026-03-16 23:59:59.999999999 0800 CST func (self *DateRange) TimeBetween2DateOnly(start, end time.Time) (time.Time, time.Time) { start Date2DateOnly(start) end Date2DateEnd(end) return start, end } func (self *DateRange) TimeMonthFirstLastDay(day time.Time) (time.Time, time.Time) { firstDay : MonthFirstDay(day) lastDay : MonthLastDay(day) return firstDay, lastDay } func (self *DateRange) Datetime2DateOnly(day time.Time) (time.Time, error) { var days day.Format(time.DateOnly) return time.ParseInLocation(time.DateOnly, days, time.Local) } func (self *DateRange) Datetime2DateOnlyStr(day time.Time) string { return day.Format(time.DateOnly) } func (self *DateRange) Quarter(day time.Time) int32 { // 计算当前月份属于哪个季度1-4 quarter : (int(day.Month())-1)/3 1 return int32(quarter) } // 计算季度开始日期 func (self *DateRange) QuarterFirstDay(day time.Time) time.Time { // 计算当前月份属于哪个季度1-4 quarter : (int(day.Month())-1)/3 1 // 计算季度的第一个月份 firstMonth : (quarter-1)*3 1 // 返回季度的第一天 return time.Date(day.Year(), time.Month(firstMonth), 1, 0, 0, 0, 0, day.Location()) } // 计算季度结束日期 func (self *DateRange) QuarterLastDay(day time.Time) time.Time { // 获取季度的第一个月份 firstMonth : ((int(day.Month())-1)/3)*3 1 // 计算季度的最后一个月份 lastMonth : firstMonth 2 // 计算下一季度的第一天然后减去一纳秒得到本季度的最后一天 return time.Date(day.Year(), time.Month(lastMonth1), 1, 0, 0, 0, 0, day.Location()).Add(-time.Nanosecond) } // 计算季度开始和结束日期 func (self *DateRange) TimeQuarterFirstLastDay(day time.Time) (time.Time, time.Time) { firstDay : QuarterFirstDay(day) lastDay : QuarterLastDay(day) return firstDay, lastDay } // 计算年度开始日期 func (self *DateRange) YearFirstDay(day time.Time) time.Time { return time.Date(day.Year(), 1, 1, 0, 0, 0, 0, day.Location()) } // 计算年度结束日期 func (self *DateRange) YearLastDay(day time.Time) time.Time { return time.Date(day.Year(), 12, 31, 23, 59, 59, 999999999, day.Location()) } // 计算年度开始和结束日期 func (self *DateRange) TimeYearFirstLastDay(day time.Time) (time.Time, time.Time) { firstDay : YearFirstDay(day) lastDay : YearLastDay(day) return firstDay, lastDay } func (self *DateRange) StartIncrDay() { self.Start self.Start.Add(time.Hour * 24) } // 计算周开始日期周一 func (self *DateRange) WeekFirstDay(day time.Time) time.Time { weekday : int(day.Weekday()) // Sunday0, Monday1, ..., Saturday6 var daysToMonday int if weekday 0 { // 如果是周日需要减去6天到周一 daysToMonday -6 } else { daysToMonday 1 - weekday } return time.Date(day.Year(), day.Month(), day.Day(), 0, 0, 0, 0, day.Location()).AddDate(0, 0, daysToMonday) } // 计算周结束日期周日 func (self *DateRange) WeekLastDay(day time.Time) time.Time { firstDay : self.WeekFirstDay(day) // 周日是周一加6天 return firstDay.AddDate(0, 0, 6).Add(24*time.Hour - time.Nanosecond) } // 计算周开始和结束日期 func (self *DateRange) DayFirstLastDay(day time.Time) *DateRange { self.Start day self.End day return self } func (self *DateRange) MonthFirstLastDay(day time.Time) *DateRange { self.Start self.MonthFirstDay(day) self.End self.MonthLastDay(day) return self } func (self *DateRange) YearFirstLastDay(day time.Time) *DateRange { self.Start self.YearFirstDay(day) self.End self.YearLastDay(day) return self } func (self *DateRange) WeekFirstLastDay(day time.Time) *DateRange { self.Start self.WeekFirstDay(day) self.End self.WeekLastDay(day) return self }