package util import ( "time" ) const ( // AllDaysMask is a bitmask of all the days of the week. AllDaysMask = 1<friday. func (d date) IsWeekDay(day time.Weekday) bool { return !d.IsWeekendDay(day) } // IsWeekendDay returns if the day is a monday->friday. func (d date) IsWeekendDay(day time.Weekday) bool { return day == time.Saturday || day == time.Sunday } // Before returns if a timestamp is strictly before another date (ignoring hours, minutes etc.) func (d date) Before(before, reference time.Time) bool { tzAdjustedBefore := before.In(reference.Location()) if tzAdjustedBefore.Year() < reference.Year() { return true } if tzAdjustedBefore.Month() < reference.Month() { return true } return tzAdjustedBefore.Year() == reference.Year() && tzAdjustedBefore.Month() == reference.Month() && tzAdjustedBefore.Day() < reference.Day() } const ( _secondsPerHour = 60 * 60 _secondsPerDay = 60 * 60 * 24 ) // NextDay returns the timestamp advanced a day. func (d date) NextDay(ts time.Time) time.Time { return ts.AddDate(0, 0, 1) } // NextHour returns the next timestamp on the hour. func (d date) NextHour(ts time.Time) time.Time { //advance a full hour ... advanced := ts.Add(time.Hour) minutes := time.Duration(advanced.Minute()) * time.Minute final := advanced.Add(-minutes) return time.Date(final.Year(), final.Month(), final.Day(), final.Hour(), 0, 0, 0, final.Location()) } // NextDayOfWeek returns the next instance of a given weekday after a given timestamp. func (d date) NextDayOfWeek(after time.Time, dayOfWeek time.Weekday) time.Time { afterWeekday := after.Weekday() if afterWeekday == dayOfWeek { return after.AddDate(0, 0, 7) } // 1 vs 5 ~ add 4 days if afterWeekday < dayOfWeek { dayDelta := int(dayOfWeek - afterWeekday) return after.AddDate(0, 0, dayDelta) } // 5 vs 1, add 7-(5-1) ~ 3 days dayDelta := 7 - int(afterWeekday-dayOfWeek) return after.AddDate(0, 0, dayDelta) }