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

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

获取月初和月底

获取月初

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())将返回当前月份的第一天的时间戳。

获取月底

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函数,我们确保了准确的计算。

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

获取每周的开始日

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

上述函数接受一个日期,返回该日期所在周的第一天。

获取每周的结束日

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

上述函数接受一个日期,返回该日期所在周的最后一天。

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

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}
]

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

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

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

上述函数接受一个日期,返回该日期所在月份的相对周数。通过利用ISO周数的概念,我们实现了简便的计算。

获取新年伊始和年底

获取新年伊始

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

上述函数接受一个日期,返回该日期所在年份的第一天。

获取年底

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

上述函数接受一个日期,返回该日期所在年份的最后一天的最后一秒。

获取季度初数据和季度末

获取季度初数据

func StartOfQuarter(date time.Time) time.Time {// you can directly use 0, 1, 2, 3 quarterquarter := (int(date.Month()) - 1) / 3startMonth := 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

上述函数接受一个日期,返回该日期所在季度的第一天。

获取季度末

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

上述函数接受一个日期,返回该日期所在季度的最后一天的最后一秒。

获取当前周范围

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

上述函数接受一个时区字符串,返回该时区中当前周的开始时间和结束时间。通过调用前述的获取每周开始日和结束日的函数,我们获得了当前周的范围。

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

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

上述函数接受两个日期,返回它们之间的持续时间。这个函数在测量两个事件之间经过的时间时非常有用。

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

func GetDatesForDayOfWeek(year, month int, day time.Weekday) []time.Time {var dates []time.TimefirstDayOfMonth := 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]

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

将工作日添加到日期

func AddBusinessDays(startDate time.Time, daysToAdd int) time.Time {currentDate := startDatefor 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

上述函数接受一个起始日期和要添加的工作日数,返回加上指定工作日后的日期。这对于处理只涉及工作日的应用程序非常有用。

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

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

上述函数接受一个持续时间,返回一个格式化的字符串,以便更友好地显示。这对于向用户呈现持续时间时非常实用。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RIPGeo参文31—36(关于对比学习):鼓励对同一数据点进行各种增强(视图),以学习更健壮的表示

RIPGeo中有: —干扰参数。在内部最大化中,我们提出了步骤,以增加损失的方向更新。我们的方法不是用简单的一步方案最大化内部部分,而是在每次迭代结束时将扰动投影到球面空间上(第2-7行),这允许模型产生更微妙但有价值的扰动[31]。 [31] A. Kurakin, I. J. Goodfellow…

代码随想录算法随想录day22 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 二叉搜索树的最近公共祖先思路解题方法复杂度Code 二叉搜索树中的插入操作思路解题方法复杂度Code 删除二叉搜索树中的节点思路解题方法复杂度Code 总结 二叉搜索树的最近公共祖先 链接: 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共…

【智能硬件、大模型、LLM 智能音箱】MBO:基于树莓派、ChatGPT 的桌面机器人

MAKER:David Packman/译:趣无尽(转载请注明出处) 这是国外 Maker David Packman 制作的基于树莓派机器人 MBO,该机器人的外观设计灵感来自动漫 Adventure Time 中的机器人 MBO。它具有强大的交互功能,可实现脱机唤醒词检测、调用 ChatGPT 3.5 进行聊天、机器视觉对图像进…

京东云主机+京美建站SaaS版

京美建站SaaS版 京美建站搭建企业网站、小程序、3000精美模板 链接:https://daili.jd.com/s?linkNo57UBX34BZMWGNFYTOCPVUE7SN36CCIPKLTFLPCUCPYBKSYYBIPS2BJ57GP7RACLDHU66X526ZOULMIXL2VN7DT7IHU 京东云主机&#xff0c;安全稳定&#xff0c;性能强劲&#xff0c;新客下单…

(网络安全)一款强大的逆向分析工具,开源!

工具介绍 Ghidra 是由美国国家安全局&#xff08;NSA&#xff09;研究部门开发的软件逆向工程&#xff08;SRE&#xff09;套件&#xff0c;用于支持网络安全任务。包括一套功能齐全的高端软件分析工具&#xff0c;使用户能够在各种平台(Windows、Mac OS和Linux)分析编译后的代…

如何成为一名CCAA审核员?报名复习考试注册实习指南

一、管理体系审核员的注册领域 管理体系审核员包括质量管理体系&#xff08;QMS&#xff09;、环境管理体系&#xff08;EMS&#xff09;、职业健康安全管理体系&#xff08;OHSMS&#xff09;、食品安全管理体系&#xff08;FSMS&#xff09;、危害分析与关键控制点&#xff0…

一文带你了解神经网络是如何学习预测的

文章目录 1、GPT与神经网络的关系 2、什么是神经网络 3、神经网络是如何计算的 数据是如何输入到神经网络中的 神经网络是如何进行预测的 神经网络是如何进行学习的 4、小结 1、GPT与神经网络的关系 GPT想必大家已经耳熟能详&#xff0c;当我们与它进行对话时&#xff0c;通常…

Spring 被打暴了! vs Javalin vs Solon

测试仅供参考。不同的环境、场景&#xff0c;效果会不同。 测试记录&#xff1a; 项目SpringBoot2SpringBoot3JavalinSolon运行时java 17java 17java 17java 17测试前状态/内存101.1Mb112.9Mb66.1Mb45.6Mb测试后状态/内存996.3Mb326.9Mb457.3Mb369.2Mb测试后状态/并发2万2.6万…

桌面待办,电脑桌面怎么设置待办事项

在忙碌的工作生活中&#xff0c;我们经常会有许多事情需要处理&#xff0c;为了提高工作效率和管理时间&#xff0c;很多人都有一套自己的桌面待办事项管理方法。那么&#xff0c;如何利用电脑桌面待办事项来提高工作效率&#xff0c;电脑桌面怎么设置待办事项呢&#xff1f; …

【Unity】persistentDataPath、streamingAssetsPath和dataPath

介绍 我们在用Unity进行开发时&#xff0c;资源路径是我们最常用到的&#xff0c;下面我就来简单介绍一下几种常用的路径。 1.dataPath dataPath是包含游戏数据文件夹的路径&#xff0c;是app程序包安装路径 Windows: xxx /Assets &#xff08;如下图&#xff09; Mac: xxx…

C语言初学12:强制类型转换

一、强制数据类型转换举例 1.1 double赋值给int #include<stdio.h> int main() {double sum 18, count 5;int mean;mean sum / count;printf("Value of mean : %d\n", mean);} 执行结果&#xff1a; double赋值给int&#xff0c;小数部分会删除&#xff…

Linux 学习笔记(16)

十六、 计划任务 在很多时候为了自动化管理系统&#xff0c;我们都会用到计划任务&#xff0c;比如关机&#xff0c;管理&#xff0c;备份之类的操作&#xff0c;我 们都可以使用计划任务来完成&#xff0c;这样可以是管理员的工作量大大降低&#xff0c;而且可靠度更好。 l…

vue3模块化引用组件和引用ts,调用ts中的接口

以简单的登录功能为例子 1.在util中创建loginValidators.ts import { ref, reactive } from vueinterface User{email: string;password: string; }export const loginUserreactive<User>({email: ,password: })interface Rules{email: {required: boolean;message: …

P8752 [蓝桥杯 2021 省 B2] 特殊年份 Python

[蓝桥杯 2021 省 B2] 特殊年份 题目描述 今年是 2021 年&#xff0c;2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1 1 1&#xff0c;我们称满足这样条件的年份为特殊年份。 输入 5 5 5 个年份&#xff0c;请计算这里面有多少个特殊年份。 输入格式 输入 …

可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性

随着数字技术的飞速发展&#xff0c;建筑行业也在不断迈向数字化转型的道路。在这个过程中&#xff0c;BIM&#xff08;Building Information Modeling&#xff0c;建筑信息模型&#xff09;技术已经成为建筑设计、施工和管理领域中的一项重要工具。 而在BIM的应用中&#xff…

金融知识分享系列之:MACD指标精讲

金融知识分享系列之&#xff1a;MACD指标精讲 一、MACD指标二、指标原理三、MACD指标参考用法四、MACD计算步骤五、MACD分析要素六、根据快线DIF位置判断趋势七、金叉死叉作为多空信号八、快线位置交叉信号九、指标背离判断行情反转十、差离值的正负十一、差离值的变化十二、指…

蓝桥杯2023年-平均(小根堆)

题目描述 有一个长度为 n 的数组&#xff08;n 是 10 的倍数&#xff09;&#xff0c;每个数 ai 都是区间 [0, 9] 中的整数。小明发现数组里每种数出现的次数不太平均&#xff0c;而更改第 i 个数的代价为bi&#xff0c;他想更改若干个数的值使得这 10 种数出现的次数相等&…

执行任务赚积分C卷(JavaPythonC++Node.jsC语言)

现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。 每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。 可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。 输入描述 第一…

Nacos源码流程图

1.Nacos1.x版本服务注册与发现源码 流程图地址&#xff1a;https://www.processon.com/view/link/634695eb260d7157a7bc6adb 2.Nacos2.x版本服务注册与发现源码 流程图地址&#xff1a;https://www.processon.com/view/link/634695fb260d7157a7bc6ae0 3.Nacos2.x版本GRPC…

【海贼王的数据航海】排序——直接选择排序|堆排序

目录 1 -> 选择排序 1.1 -> 基本思想 1.2 -> 直接选择排序 1.2.1 -> 代码实现 1.3 -> 堆排序 1.3.1 -> 代码实现 1 -> 选择排序 1.1 -> 基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素&#xff0c;存放在序列的起始位置&…