Диапазон дат по номеру недели Голанг - PullRequest
0 голосов
/ 12 сентября 2018

С помощью этой простой функции я могу получить номер недели. Теперь, с номером недели, как я могу получить диапазон дат, начатый в воскресенье?

import (
    "fmt"
    "time"
)
func main() {
    Week(time.Now().UTC())
}

func Week(now time.Time) string {
    _, thisWeek := now.ISOWeek()
    return "S" + strconv.Itoa(thisWeek)
}

Любая помощь приветствуется. Спасибо.

1 Ответ

0 голосов
/ 13 сентября 2018

Предисловие: Time.ISOWeek() возвращает номер недели, который начинается в понедельник, поэтому я отвечу на ваш вопрос, который также относится к неделям, начинающимся с понедельника.Измените его в соответствии с вашими потребностями, если вы хотите, чтобы он работал с неделями, начинающимися в воскресенье.

В стандартной библиотеке нет функции, которая возвращала бы вам диапазон дат данной недели (год + номер недели).Поэтому мы должны построить его сами.

И это не так сложно.Мы можем начать с середины года, выровнять по первому дню недели (понедельнику), получить значение этого времени для недели и скорректировать: добавить столько дней, сколько разностей недель, умноженных на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...