Go-ISO年度周的第一个星期的Unix时间戳

Cen*_*tin 3 iso go unix-timestamp

例如,获得2010年第五周星期一00:00:00时间戳的好方法是什么?本质上,我在时间包中寻找ISOweek的逆函数。我似乎找不到实现该目标的方法。Parse()不会读一周,仅计算自一年/月的第一天以来已经有多少个“ 7天”并不能真正满足我的需求。

在此先多谢!法案

Klu*_*uyg 6

我不明白为什么

简单地算出自一年/月的第一天以来已经有多少个“ 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
}
Run Code Online (Sandbox Code Playgroud)

这是进行健全性检查的有效示例:http : //play.golang.org/p/UVFNFcpaoI

该代码易于理解,没有年/月/日的算术运算,只是简单的迭代。运行时复杂度为O(n),但鉴于n始终小于400,则实际上根本不是问题。

如果正确实施golang date.AddDate,则不会出现夏令时,years年和其他棘手的日期问题。

PS有趣的事实:) 2008年第1周的第一天是2007-12-31。这是正确的,您可以签入日历。


sna*_*nap 5

为此,我实现了另一个简单的 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
Run Code Online (Sandbox Code Playgroud)

我不喜欢接受的答案中的方法,因为它前后迭代,这很荒谬。

我也不喜欢另一个答案中的 goweek 包,因为它看起来过于复杂,而且 API 非常奇怪(为什么是可变参数?等等)。

  • 我已经成功地测试过这个。风格和效率的最佳选择。伟大的贡献 (2认同)