grokify/mogo

View on GitHub
time/timeutil/week.go

Summary

Maintainability
A
0 mins
Test Coverage
package timeutil

import (
    "time"

    "github.com/grokify/mogo/math/mathutil"
)

// FirstDayOfISOWeek returns a time.Time object for the first day of
// a given ISO week.
// https://xferion.com/golang-reverse-isoweek-get-the-date-of-the-first-day-of-iso-week/
func FirstDayOfISOWeek(year int, week int, timezone *time.Location) time.Time {
    date := time.Date(year, 0, 0, 0, 0, 0, 0, timezone)
    isoYear, isoWeek := date.ISOWeek()

    // iterate back to Monday
    for date.Weekday() != time.Monday {
        date = date.AddDate(0, 0, -1)
        isoYear, isoWeek = date.ISOWeek()
    }

    // iterate forward to the first day of the first week
    for isoYear < year {
        date = date.AddDate(0, 0, 7)
        isoYear, isoWeek = date.ISOWeek()
    }

    // iterate forward to the first day of the given week
    for isoWeek < week {
        date = date.AddDate(0, 0, 7)
        //isoYear, isoWeek = date.ISOWeek()
    }

    return date
}

func (tm TimeMore) WeekdayNext(d time.Weekday) time.Time {
    today := tm.time.Weekday()
    if d == today {
        return tm.time.Add(NewDuration(7, 0, 0, 0, 0))
    } else if d > today {
        return tm.time.Add(NewDurationFloat(float64(int(d)-int(today)), 0, 0, 0, 0))
    }
    return tm.time.Add(NewDurationFloat(float64(int(today)-int(d)+7), 0, 0, 0, 0))
}

// WeekdayNormalized ensures a `time.Weekday` value is within `[0,6]`. It supports
// converting postiive and negative integers.
func WeekdayNormalized(d time.Weekday) time.Weekday {
    return time.Weekday(mathutil.ModPyInt(int(d), 7))
}