Как получить дату в формате «гггг-мм-дд» от числа дня года и года в Голанге?

# #date #go

Вопрос:

Я пытаюсь отформатировать дату в формате «гггг-мм-дд», используя в качестве входных данных число дня в году (от 0 до 365).

Как вход : 035 и 2021 Выход : 2021-02-04

Я действительно не знаю, может ли библиотека времени Go помочь сделать это просто.

У кого-нибудь есть идея, как это сделать ?

Комментарии:

1. play.golang.org/p/VT_tCBavtur

Ответ №1:

Если вы имеете в виду номер дня, то обычно он варьируется от 1 до 365 (или 366 для високосного года). Потому что только тогда 35-й день 2021 года соответствует 2021-02-04.

Просто используйте time.Date , он day правильно преобразует параметр вне диапазона:

Значения месяца, дня, часа, минуты, секунды и nsec могут находиться за пределами их обычных диапазонов и будут нормализованы во время преобразования. Например, 32 октября преобразуется в 1 ноября.

Пример:

 package main

import (
    "fmt"
    "time"
)

func main() {
    year, day := 2021, 35
    dt := time.Date(year, 1, day, 0, 0, 0, 0, time.Local)
    fmt.Println(dt.Format("2006-01-02"))
}
 

Живая демонстрация

С принтами:

 2021-02-04
 

Если вы на самом деле имеете в виду день с номером от 0 до 364 (или 365 для високосного года), то измените day day 1 примерно так:

     dt := time.Date(year, 1, day 1, 0, 0, 0, 0, time.Local)
 

Комментарии:

1. Он действительно 0-365 так говорит, учитывая и високосные годы.

2. @СтивенПенни моя интерпретация расхождения заключалась в том, что 0 было опечаткой (также потому, что номера дней обычно начинаются с 1). Но очень мило с вашей стороны улучшить свой ответ с помощью моей информации.

3. Спасибо за фрагмент, он делает то, что я хотел 🙂

Ответ №2:

Это делает это:

 package main

import (
   "fmt"
   "time"
)

func dayOfYear(year, days int) time.Time {
   return time.Date(year, 1, 1 days, 0, 0, 0, 0, time.UTC)
}

func main() {
   t := dayOfYear(2021, 35)
   fmt.Println(t)
}
 

Хотя ваша математика отключена, так как 35 дней будет 5 февраля, так как начинается год
1 января, а не 0 января.

https://golang.org/pkg/time#Date

Ответ №3:

Это может быть то, что вы ищете, обязательно замените зону зоной, в которой вам нужна строка времени для отображения.

 package main

import (
    "fmt"
    "time"
)

func main() {
    var layout = "2006-01-02"
    zone := time.UTC
    year := 2021
    day  := 35
    
    time := time.Date(year,1,day,0,0,0,0,zone)
    converted := time.Format(layout)
    fmt.Println(converted)
}