什么是获取时间戳的好方法,例如,2010 年第五周的星期一 00:00:00?本质上,我正在时间包中寻找 ISOweek 的反函数。我似乎无法找到实现这一目标的方法。Parse() 不读取周数,简单地计算自一年/月的第一天以来有多少“7 天”并不能真正让我得到我需要的东西。
提前非常感谢!账单
什么是获取时间戳的好方法,例如,2010 年第五周的星期一 00:00:00?本质上,我正在时间包中寻找 ISOweek 的反函数。我似乎无法找到实现这一目标的方法。Parse() 不读取周数,简单地计算自一年/月的第一天以来有多少“7 天”并不能真正让我得到我需要的东西。
提前非常感谢!账单
我不明白为什么
简单地计算自一年/月的第一天以来有多少“7天”并不能真正让我得到我需要的东西
这是我的尝试:
func firstDayOfISOWeek(year int, week int, timezone *time.Location) time.Time {
date := time.Date(year, 0, 0, 0, 0, 0, 0, timezone)
isoYear, isoWeek := date.ISOWeek()
for date.Weekday() != time.Monday { // iterate back to Monday
date = date.AddDate(0, 0, -1)
isoYear, isoWeek = date.ISOWeek()
}
for isoYear < year { // iterate forward to the first day of the first week
date = date.AddDate(0, 0, 1)
isoYear, isoWeek = date.ISOWeek()
}
for isoWeek < week { // iterate forward to the first day of the given week
date = date.AddDate(0, 0, 1)
isoYear, isoWeek = date.ISOWeek()
}
return date
}
下面是健全性检查的工作示例:http ://play.golang.org/p/UVFNFcpaoI
代码通俗易懂,没有年/月/日算术,只是简单的迭代。运行时复杂度为 O(n),但考虑到 n 总是小于 400 - 这实际上根本不是问题。
如果 golang date.AddDate 正确实现,它不应该有夏令时、闰年和其他棘手的日期问题。
PS 有趣的事实 :) 2008 年第 1 周的第一天是 2007 年 12 月 31 日。这是正确的,您可以查看日历。
为此,我实现了另一个简单的 Go 包:
https://github.com/snabb/isoweek
示例用法:
st := isoweek.StartTime(1985, 1, time.UTC)
fmt.Println(st)
// Output:
// 1984-12-31 00:00:00 +0000 UTC
我不喜欢接受的答案中的方法,因为它会前后迭代,这很荒谬。
我也不喜欢另一个答案中的 goweek 包,因为它看起来过于复杂并且 API 很奇怪(为什么是可变参数?等等)。
func GetStartDayOfWeek(tm time.Time) time.Time { //get monday 00:00:00
weekday := time.Duration(tm.Weekday())
if weekday == 0 {
weekday = 7
}
year, month, day := t.Date()
currentZeroDay:= time.Date(year, month, day, 0, 0, 0, 0, time.Local)
return currentZeroDay.Add(-1 * (weekday - 1) * 24 * time.Hour)
}
无耻的自我推销,但我刚刚发布了在 Go 中使用几周的 lib:https ://github.com/grsmv/goweek