通过这个简单的功能,我可以获得星期几。现在,用星期几,如何获取从星期日开始的日期范围?
import ( "fmt" "time" ) func main() { Week(time.Now().UTC()) } func Week(now time.Time) string { _, thisWeek := now.ISOWeek() return "S" + strconv.Itoa(thisWeek) }
欢迎任何帮助。谢谢。
前言: Time.ISOWeek()返回您从星期一开始的星期数,因此我将回答您的问题,该问题也处理从星期一开始的星期。如果您希望它在周日开始的几周内工作,请根据需要进行更改。
Time.ISOWeek()
我在中发布了该实用程序github.com/icza/gox,请参见timex.WeekStart()。
github.com/icza/gox
timex.WeekStart()
标准库没有提供可以返回给定星期(年+周数)的日期范围的函数。因此,我们必须自己构建。
这并不难。我们可以从年中开始,与一周中的第一天(星期一)对齐,获取该时间值中的星期,然后修正:将与星期差乘以7的天数相加。
它看起来像这样:
func WeekStart(year, week int) time.Time { // Start from the middle of the year: t := time.Date(year, 7, 1, 0, 0, 0, 0, time.UTC) // Roll back to Monday: if wd := t.Weekday(); wd == time.Sunday { t = t.AddDate(0, 0, -6) } else { t = t.AddDate(0, 0, -int(wd)+1) } // Difference in weeks: _, w := t.ISOWeek() t = t.AddDate(0, 0, (week-w)*7) return t }
测试它:
fmt.Println(WeekStart(2018, 1)) fmt.Println(WeekStart(2018, 2)) fmt.Println(WeekStart(2019, 1)) fmt.Println(WeekStart(2019, 2))
输出(在Go Playground上尝试):
2018-01-01 00:00:00 +0000 UTC 2018-01-08 00:00:00 +0000 UTC 2018-12-31 00:00:00 +0000 UTC 2019-01-07 00:00:00 +0000 UTC
此WeekStart()实现的一个不错的特性是,它可以很好地处理 超出范围的 几周。也就是说,如果您通过0了一周,它将被解释为上一年的最后一周。如果您通过-1了本周,则它将指定上一年的第二个到最后一个星期。同样,如果您通过一年中的最大周数加1,则将其解释为明年的第一周,依此类推。
WeekStart()
0
-1
上面的WeekStart()函数仅返回给定星期的第一天(星期一),因为一周的最后一天始终是第一天+ 6天。
如果我们还需要最后一天:
func WeekRange(year, week int) (start, end time.Time) { start = WeekStart(year, week) end = start.AddDate(0, 0, 6) return }
fmt.Println(WeekRange(2018, 1)) fmt.Println(WeekRange(2018, 2)) fmt.Println(WeekRange(2019, 1)) fmt.Println(WeekRange(2019, 2))
2018-01-01 00:00:00 +0000 UTC 2018-01-07 00:00:00 +0000 UTC 2018-01-08 00:00:00 +0000 UTC 2018-01-14 00:00:00 +0000 UTC 2018-12-31 00:00:00 +0000 UTC 2019-01-06 00:00:00 +0000 UTC 2019-01-07 00:00:00 +0000 UTC 2019-01-13 00:00:00 +0000 UTC