Go - 来自 ISO 年周的一周中第一天的 Unix 时间戳

获取 2010 年第五周星期一 00:00:00 时间戳的好方法是什么?本质上,我正在时间包中寻找 ISOweek 的反函数。我似乎无法找到实现这一目标的方法。 Parse() 不读取周,并且简单地计算自年/月的第一天以来已经有多少“7 天”并不能真正得到我需要的东西。

非常感谢!
账单

最佳答案

我不明白为什么

simply counting how many "7 days" there have been since the first day of the year/month doesn't really get me what I need



这是我的尝试:
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。这是正确的,您可以查看日历。