当前位置: 首页 > news >正文

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.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 }
http://www.cnnetsun.cn/news/2140719.html

相关文章:

  • DS4Windows终极指南:让你的PlayStation手柄在PC上重获新生
  • 别再只调PID了!用Python+ROS2给多架无人机规划协同任务与航迹(附避障代码)
  • 2026年兰溪阿里巴巴服务团队:正规军如何助力企业腾飞
  • Qwen3.5-9B-GGUF开源可部署:基于Qwen3.5-9B-GGUF的RAG系统搭建
  • AMBA总线FIFO时序模型与SoC性能优化
  • 深度技术解析:BepInEx框架在Unity游戏中的架构稳定性挑战与多运行时环境解决方案
  • Ubuntu 22.04 下 VASP 5.4.4 保姆级编译指南:从依赖库到并行测试
  • 从TypeError到高效调试:用PyCharm/VSCode断点+type()快速定位PyTorch张量类型错误
  • 合肥亲测:2026年4月合肥汽车大灯升级推荐榜
  • MATLAB极坐标绘图实战:用polar函数画一个‘绽放’的数学曲线(附完整代码)
  • FPGA架构演进与SSI技术解析
  • 【Java EE】锁策略、锁升级、锁消除和锁粗化
  • 手把手教学:雯雯的后宫-造相Z-Image-瑜伽女孩镜像部署常见问题解决
  • 一套真正有效的亚马逊SOP,应该解决哪些团队协作问题?
  • 千问3.5-9B赋能SpringBoot后端开发:智能API文档生成与逻辑校验
  • 网络安全渗透测试入门|无线安全渗透与防御完整教程
  • 美编饭碗不保?ChatGPT Images 2.0 的 12 个生产级玩法与提示词模板【附领取方式】
  • 05华夏之光永存・开源:黄大年茶思屋榜文解法「23期 5题」 【分布式收发机设计专项完整解法】
  • 使用 JavaScript 构建 Real-Anime-Z 前端交互界面:实时预览与参数调整
  • 关于C/C++轻量级HTTP协议解析项目需要注意的几个关键实现
  • Pixel Aurora Engine 对比YOLOv5:AI在生成与识别领域的协同应用
  • 告别编译失败!保姆级教程:用CMake+VS2019/2022搞定Poco库(含32/64位配置)
  • Sliding Window(滑动窗口)
  • Z-Image-ComfyUI应用实战:电商海报、社交配图生成,提升创作效率
  • 算法总结:二维网格 (Grid) DFS 遍历通用模板与实战解析
  • 企业想用AI做数据分析,但数据不能出内网,怎么办
  • M2FP从部署到应用:完整流程解析,快速实现多人图像语义分割
  • 品牌升级后卖不动,先别怪设计公司
  • 虚拟线程CPU爆表却吞吐不升?深度解析Java 25 Project Loom调度器v2.3内核变更,定位3类隐蔽资源饥饿场景
  • 分享一套锋哥原创的微信小程序校园宿舍管理系统(SpringBoot4后端+Vue3管理端)