golang: есть ли способ итерации в течение определенного месяца или недели
есть ли способ, в go
, повторить в течение определенного месяца и получить все time.Date
объекты?
например, итерация по апрелю приведет к 04012016
до 04312016
:
for _, dayInMonth := range date.April {
// do stuff with dates returned
}
(в настоящее время приведенный выше код не будет работать, очевидно).
или, если не является частью стандартной библиотеки, есть сторонняя библиотека, эквивалентная момент.js?
3 ответов
нет времени.Объект Date, определенный в стандартной библиотеке. Только время.Объект времени. Там также нет никакого способа диапазона цикла их, но цикл их вручную довольно просто:
// set the starting date (in any way you wish)
start, err := time.Parse("2006-1-2", "2016-4-1")
// handle error
// set d to starting date and keep adding 1 day to it as long as month doesn't change
for d := start; d.Month() == start.Month(); d = d.AddDate(0, 0, 1) {
// do stuff with d
}
@jessius way может работать, только если итерация находится в течение месяца. Лучший способ итерации-использовать формат эпохи времени.
например, для oneDay мы знаем, что это 86400 секунд. мы можем сделать нижеизложенного
oneDay := int64(86400) // a day in seconds.
startDate := int64(1519862400)
endDate := int64(1520640000)
for timestamp := startDate; timestamp <= endDate; timestamp += oneDay {
// do your work
}
простой и работоспособный для итерации дней.
в течение месяца этот способ не может работать, потому что каждый месяц имеет разные дни. У меня есть только похожие идеи, как @jussius, но tweak для применения к итерации месяца.
Я очень хочу сравнить даты
func LeqDates(a, b time.Time) bool {
year1, month1, day1 := a.Date()
year2, month2, day2 := b.Date()
if year1 < year2 {
return true
} else if year1 <= year2 && month1 < month2 {
return true
} else {
return year1 <= year2 && month1 <= month2 && day1 <= day2
}
}