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
    }
}