当前位置:首页 > 科技  > 软件

Go 日期时间包装器:15 条更便捷的时间处理

来源: 责编: 时间:2024-01-19 17:29:14 393观看
导读在Go编程中,处理日期和时间是一项常见任务,涉及到精确性和灵活性。尽管Go的标准库提供了时间包(time)用于处理时间相关操作,但在某些情况下,我们需要额外的实用函数来简化这些任务。本文将介绍一系列实用函数,它们充当time包

在Go编程中,处理日期和时间是一项常见任务,涉及到精确性和灵活性。尽管Go的标准库提供了时间包(time)用于处理时间相关操作,但在某些情况下,我们需要额外的实用函数来简化这些任务。本文将介绍一系列实用函数,它们充当time包的包装器,提供了更便捷的操作方式。QHv28资讯网——每日最新资讯28at.com

1.获取月初和月底

获取月初

func StartOfMonth(date time.Time) time.Time { return time.Date(date.Year(), date.Month(), 1, 0, 0, 0, 0, date.Location())}// output:2024-01-01 00:00:00 +0800 CST

上述函数接受一个日期,返回该日期所在月份的第一天。例如,StartOfMonth(time.Now())将返回当前月份的第一天的时间戳。QHv28资讯网——每日最新资讯28at.com

获取月底

func EndOfMonth(date time.Time) time.Time { firstDayOfNextMonth := StartOfMonth(date).AddDate(0, 1, 0) return firstDayOfNextMonth.Add(-time.Second)}// output:2024-01-31 23:59:59 +0800 CST

上述函数接受一个日期,返回该日期所在月份的最后一天的最后一秒。通过结合StartOfMonth函数,我们确保了准确的计算。QHv28资讯网——每日最新资讯28at.com

2.获取每周的开始日和结束日

获取每周的开始日

func StartOfDayOfWeek(date time.Time) time.Time { daysSinceSunday := int(date.Weekday()) return date.AddDate(0, 0, -daysSinceSunday+1)}// output:2024-01-15 00:19:42.869678 +0800 CST

上述函数接受一个日期,返回该日期所在周的第一天。QHv28资讯网——每日最新资讯28at.com

获取每周的结束日

func EndOfDayOfWeek(date time.Time) time.Time { daysUntilSaturday := 7 - int(date.Weekday()) return date.AddDate(0, 0, daysUntilSaturday)}// output:2024-01-21 00:22:06.955558 +0800 CST

上述函数接受一个日期,返回该日期所在周的最后一天。QHv28资讯网——每日最新资讯28at.com

3.获取给定月份每周的开始日和结束日

func StartAndEndOfWeeksOfMonth(year, month int) []struct{ Start, End time.Time } { startOfMonth := time.Date(year, time.Month(month), 1, 0, 0, 0, 0, time.UTC) weeks := make([]struct{ Start, End time.Time }, 0) for current := startOfMonth; current.Month() == time.Month(month); current = current.AddDate(0, 0, 7) {  startOfWeek := StartOfDayOfWeek(current)  endOfWeek := EndOfDayOfWeek(current)  if endOfWeek.Month() != time.Month(month) {   endOfWeek = EndOfMonth(current)  }  weeks = append(weeks, struct{ Start, End time.Time }{startOfWeek, endOfWeek}) } return weeks}// output:[ {2024-01-01 00:00:00 +0000 UTC 2024-01-07 00:00:00 +0000 UTC}  {2024-01-08 00:00:00 +0000 UTC 2024-01-14 00:00:00 +0000 UTC}  {2024-01-15 00:00:00 +0000 UTC 2024-01-21 00:00:00 +0000 UTC}  {2024-01-22 00:00:00 +0000 UTC 2024-01-28 00:00:00 +0000 UTC}  {2024-01-29 00:00:00 +0000 UTC 2024-01-31 23:59:59 +0000 UTC}]

上述函数接受年份和月份,返回一个包含给定月份中每周的开始日和结束日的切片。通过调用前述的获取每周开始日和结束日的函数,我们得到了全面的每周视图。QHv28资讯网——每日最新资讯28at.com

4.获取从日期开始的一个月的周数

func WeekNumberInMonth(date time.Time) int { startOfMonth := StartOfMonth(date) _, week := date.ISOWeek() _, startWeek := startOfMonth.ISOWeek() return week - startWeek + 1}// output:3

上述函数接受一个日期,返回该日期所在月份的相对周数。通过利用ISO周数的概念,我们实现了简便的计算。QHv28资讯网——每日最新资讯28at.com

5.获取新年伊始和年底

获取新年伊始

func StartOfYear(date time.Time) time.Time { return time.Date(date.Year(), time.January, 1, 0, 0, 0, 0, date.Location())}// output:2024-01-01 00:00:00 +0800 CST

上述函数接受一个日期,返回该日期所在年份的第一天。QHv28资讯网——每日最新资讯28at.com

获取年底

func EndOfYear(date time.Time) time.Time { startOfNextYear := StartOfYear(date).AddDate(1, 0, 0) return startOfNextYear.Add(-time.Second)}// output:2024-12-31 23:59:59 +0800 CST

上述函数接受一个日期,返回该日期所在年份的最后一天的最后一秒。QHv28资讯网——每日最新资讯28at.com

6.获取季度初数据和季度末

获取季度初数据

func StartOfQuarter(date time.Time) time.Time { // you can directly use 0, 1, 2, 3 quarter quarter := (int(date.Month()) - 1) / 3 startMonth := time.Month(quarter*3 + 1) return time.Date(date.Year(), startMonth, 1, 0, 0, 0, 0, date.Location())}// output:2024-01-01 00:00:00 +0800 CST

上述函数接受一个日期,返回该日期所在季度的第一天。QHv28资讯网——每日最新资讯28at.com

获取季度末

func EndOfQuarter(date time.Time) time.Time { startOfNextQuarter := StartOfQuarter(date).AddDate(0, 3, 0) return startOfNextQuarter.Add(-time.Second)}// output:2024-03-31 23:59:59 +0800 CST

上述函数接受一个日期,返回该日期所在季度的最后一天的最后一秒。QHv28资讯网——每日最新资讯28at.com

7.获取当前周范围

func CurrentWeekRange(timeZone string) (startOfWeek, endOfWeek time.Time) { loc, _ := time.LoadLocation(timeZone) now := time.Now().In(loc) startOfWeek = StartOfDayOfWeek(now) endOfWeek = EndOfDayOfWeek(now) return startOfWeek, endOfWeek}// output:2024-01-15 00:37:18.812985 +0800 CST 2024-01-21 00:37:18.812985 +0800 CST

上述函数接受一个时区字符串,返回该时区中当前周的开始时间和结束时间。通过调用前述的获取每周开始日和结束日的函数,我们获得了当前周的范围。QHv28资讯网——每日最新资讯28at.com

8.计算两个日期之间的持续时间

func DurationBetween(start, end time.Time) time.Duration { return end.Sub(start)}// output:10.000000101s

上述函数接受两个日期,返回它们之间的持续时间。这个函数在测量两个事件之间经过的时间时非常有用。QHv28资讯网——每日最新资讯28at.com

9.获取给定月份的星期几的日期

func GetDatesForDayOfWeek(year, month int, day time.Weekday) []time.Time { var dates []time.Time firstDayOfMonth := time.Date(year, time.Month(month), 1, 0, 0, 0, 0, time.UTC) diff := int(day) - int(firstDayOfMonth.Weekday()) if diff < 0 {  diff += 7 } firstDay := firstDayOfMonth.AddDate(0, 0, diff) for current := firstDay; current.Month() == time.Month(month); current = current.AddDate(0, 0, 7) {  dates = append(dates, current) } return dates}// output:[2024-01-05 00:00:00 +0000 UTC 2024-01-12 00:00:00 +0000 UTC 2024-01-19 00:00:00 +0000 UTC 2024-01-26 00:00:00 +0000 UTC]

上述函数接受年份、月份和目标星期几,返回给定月份中指定日期的所有出现情况。这为获取一个月中特定日期的出现提供了通用的解决方案。QHv28资讯网——每日最新资讯28at.com

10.将工作日添加到日期

func AddBusinessDays(startDate time.Time, daysToAdd int) time.Time { currentDate := startDate for i := 0; i < daysToAdd; {  currentDate = currentDate.AddDate(0, 0, 1)  if currentDate.Weekday() != time.Saturday && currentDate.Weekday() != time.Sunday {   i++  } } return currentDate}// output:2024-03-01 00:46:38.131747 +0800 CST

上述函数接受一个起始日期和要添加的工作日数,返回加上指定工作日后的日期。这对于处理只涉及工作日的应用程序非常有用。QHv28资讯网——每日最新资讯28at.com

11.将持续时间格式化为人类可读的字符串

func FormatDuration(duration time.Duration) string { days := int(duration.Hours() / 24) hours := int(duration.Hours()) % 24 minutes := int(duration.Minutes()) % 60 seconds := int(duration.Seconds()) % 60 return fmt.Sprintf("%d天 %02d小时 %02d分 %02d秒", days, hours, minutes, seconds)}// output:3天 04小时 15分 30秒

上述函数接受一个持续时间,返回一个格式化的字符串,以便更友好地显示。这对于向用户呈现持续时间时非常实用。QHv28资讯网——每日最新资讯28at.com

通过使用这些高级实用函数,我们扩展了日期时间包装器的功能,为开发人员提供了一套全面的工具来处理各种与时间相关的操作。这些函数可以轻松集成到您的代码库中,简化了复杂的日期和时间操作,无论是构建计划应用程序、生成报告,还是处理各种时间敏感的任务。QHv28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-65369-0.htmlGo 日期时间包装器:15 条更便捷的时间处理

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: React高手都善于使用useImprativeHandle

下一篇: 抖音发布 2023 年不实信息治理盘点:“识别摆拍模型”准确率达 85%

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
Top