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.8282468+08:00 Start time.Time `json:"start" gorm:"-"` //结束时间 2026-03-05T16:18:07.8282468+08: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(lastMonth+1), 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()) // Sunday=0, Monday=1, ..., Saturday=6 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 }