# #date #go
Вопрос:
Я пытаюсь отформатировать дату в формате «гггг-мм-дд», используя в качестве входных данных число дня в году (от 0 до 365).
Как вход : 035 и 2021 Выход : 2021-02-04
Я действительно не знаю, может ли библиотека времени Go помочь сделать это просто.
У кого-нибудь есть идея, как это сделать ?
Комментарии:
Ответ №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 января.
Ответ №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)
}