我不明白为什么
仅计算自一年/月的第一天以来已经有多少“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 正确实现,它应该不会有夏令时、闰年和其他棘手的日期问题。
附:有趣的事实:) 2008 年第 1 周的第一天是 2007-12-31。没错,你可以在日历中查看。