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

时间:2013-09-04 21:33:47

标签: go unix-timestamp iso

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

提前多多感谢! 比尔

4 个答案:

答案 0 :(得分: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
}

以下是完整性检查的工作示例:http://play.golang.org/p/UVFNFcpaoI

代码很容易理解,没有年/月/日算术,只需简单的迭代。运行时复杂度为O(n),但假设n总是小于400 - 它实际上根本不是问题。

如果golang date.AddDate正确实现,它应该没有夏令时,闰年和其他棘手的日期问题。

P.S。有趣的事实:) 2008年第1周的第一天是2007-12-31。这是正确的,您可以查看日历。

答案 1 :(得分:1)

我为此目的实现了另一个简单的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非常奇怪(为什么是可变参数?等等)。

答案 2 :(得分:0)

无耻的自我推销,但我刚刚在Go上发布了几个星期的工作:https://github.com/grsmv/goweek

答案 3 :(得分:-1)

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