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

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

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

在Go编程中,处理日期和时间是一项常见任务,涉及到精确性和灵活性。尽管Go的标准库提供了时间包(time)用于处理时间相关操作,但在某些情况下,我们需要额外的实用函数来简化这些任务。本文将介绍一系列实用函数,它们充当time包的包装器,提供了更便捷的操作方式。Ibg28资讯网——每日最新资讯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())将返回当前月份的第一天的时间戳。Ibg28资讯网——每日最新资讯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函数,我们确保了准确的计算。Ibg28资讯网——每日最新资讯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

上述函数接受一个日期,返回该日期所在周的第一天。Ibg28资讯网——每日最新资讯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

上述函数接受一个日期,返回该日期所在周的最后一天。Ibg28资讯网——每日最新资讯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}]

上述函数接受年份和月份,返回一个包含给定月份中每周的开始日和结束日的切片。通过调用前述的获取每周开始日和结束日的函数,我们得到了全面的每周视图。Ibg28资讯网——每日最新资讯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周数的概念,我们实现了简便的计算。Ibg28资讯网——每日最新资讯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

上述函数接受一个日期,返回该日期所在年份的第一天。Ibg28资讯网——每日最新资讯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

上述函数接受一个日期,返回该日期所在年份的最后一天的最后一秒。Ibg28资讯网——每日最新资讯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

上述函数接受一个日期,返回该日期所在季度的第一天。Ibg28资讯网——每日最新资讯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

上述函数接受一个日期,返回该日期所在季度的最后一天的最后一秒。Ibg28资讯网——每日最新资讯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

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

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

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

上述函数接受两个日期,返回它们之间的持续时间。这个函数在测量两个事件之间经过的时间时非常有用。Ibg28资讯网——每日最新资讯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]

上述函数接受年份、月份和目标星期几,返回给定月份中指定日期的所有出现情况。这为获取一个月中特定日期的出现提供了通用的解决方案。Ibg28资讯网——每日最新资讯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

上述函数接受一个起始日期和要添加的工作日数,返回加上指定工作日后的日期。这对于处理只涉及工作日的应用程序非常有用。Ibg28资讯网——每日最新资讯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秒

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

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

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

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

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

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

标签:
  • 热门焦点
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • iQOO 11S新品发布会

    iQOO将在7月4日19:00举行新品发布会,推出杭州亚运会电竞赛事官方用机iQOO 11S。
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • Meta盲目扩张致超万人被裁,重金押注元宇宙而前景未明

    图片来源:图虫创意日前,Meta创始人兼CEO 马克&middot;扎克伯发布公开信,宣布Meta计划裁员超11000人,占其员工总数13%。他公开承认了自己的预判失误:&ldquo;不仅
Top