当前位置: 首页 > 面试题库 >

日期范围按周数Golang

吕灿
2023-03-14
问题内容

通过这个简单的功能,我可以获得星期几。现在,用星期几,如何获取从星期日开始的日期范围?

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()返回您从星期一开始的星期数,因此我将回答您的问题,该问题也处理从星期一开始的星期。如果您希望它在周日开始的几周内工作,请根据需要进行更改。

我在中发布了该实用程序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()函数仅返回给定星期的第一天(星期一),因为一周的最后一天始终是第一天+ 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))

输出(在Go Playground上尝试):

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


 类似资料:
  • 问题内容: 我正在使用MySQL,并且具有下表: 我希望能够生成这样的报告,其中在过去4周内完成了各个周期: 或最近3个月内: 有什么想法可以进行选择查询以生成等效的日期范围和点击次数吗? 问题答案:

  • 感谢所有人!

  • 问题内容: 假设我有个约会2013年6月20日 如何获取上周的日期范围,即本例中的6月9日至6月15日。 另外,如果日期是2013年6月2日 范围应该是5月26日至6月1日 问题答案: 这是基于Java日历的解决方案 输出 它已本地化,在我的“语言环境”周中,从星期一开始

  • 我需要帮助查询与日期范围的长收集。请参阅下面的示例文档。我想用日期范围查询startTime字段。

  • 问题内容: 我正在尝试通过键入日期范围来过滤包含时间戳的列表 例如: JSFIDDLE html javascript 我希望能够用值填充“发件人”字段:27-05-2010 并且“ To”字段的值为:29-07-2015 并仅获取该范围内的记录。 (示例中的第一条记录)。 谢谢分配阿维 问题答案: 您可以创建一个自定义过滤器来实现此目的。 JSFIDDLE html javascript 此外,

  • 问题内容: 我有这样的文件: 是否可以按日期查询最近10天发布的文档数量?例如: 问题答案: 是的,您可以使用聚合轻松实现这一点,如下所示: