diff --git a/goextVersion.go b/goextVersion.go index ba66875..62d29fc 100644 --- a/goextVersion.go +++ b/goextVersion.go @@ -1,5 +1,5 @@ package goext -const GoextVersion = "0.0.267" +const GoextVersion = "0.0.268" -const GoextVersionTimestamp = "2023-09-21T14:15:02+0200" +const GoextVersionTimestamp = "2023-09-21T16:29:23+0200" diff --git a/timeext/calendarweek.go b/timeext/calendarweek.go new file mode 100644 index 0000000..1de8974 --- /dev/null +++ b/timeext/calendarweek.go @@ -0,0 +1,28 @@ +package timeext + +import "time" + +func WeekStart(year, week int) time.Time { + + // https://stackoverflow.com/a/52303730/1761622 + + // Start from the middle of the year: + t := time.Date(year, 7, 1, 0, 0, 0, 0, time.UTC) + + // Roll back to Monday: + if wd := t.Weekday(); wd == time.Sunday { + t = t.AddDate(0, 0, -6) + } else { + t = t.AddDate(0, 0, -int(wd)+1) + } + + // Difference in weeks: + _, w := t.ISOWeek() + t = t.AddDate(0, 0, (week-w)*7) + + return t +} + +func WeekEnd(year, week int) time.Time { + return WeekStart(year, week).AddDate(0, 0, 7).Add(time.Duration(-1)) +} diff --git a/timeext/calendarweek_test.go b/timeext/calendarweek_test.go new file mode 100644 index 0000000..9fbab0a --- /dev/null +++ b/timeext/calendarweek_test.go @@ -0,0 +1,25 @@ +package timeext + +import ( + "gogs.mikescher.com/BlackForestBytes/goext/tst" + "testing" + "time" +) + +func TestWeekStart(t *testing.T) { + + tst.AssertEqual(t, WeekStart(2018, 1).Format(time.RFC3339Nano), "2018-01-01T00:00:00Z") + tst.AssertEqual(t, WeekStart(2018, 2).Format(time.RFC3339Nano), "2018-01-08T00:00:00Z") + tst.AssertEqual(t, WeekStart(2019, 1).Format(time.RFC3339Nano), "2018-12-31T00:00:00Z") + tst.AssertEqual(t, WeekStart(2019, 2).Format(time.RFC3339Nano), "2019-01-07T00:00:00Z") + +} + +func TestWeekEnd(t *testing.T) { + + tst.AssertEqual(t, WeekEnd(2018, 1).Format(time.RFC3339Nano), "2018-01-07T23:59:59.999999999Z") + tst.AssertEqual(t, WeekEnd(2018, 2).Format(time.RFC3339Nano), "2018-01-14T23:59:59.999999999Z") + tst.AssertEqual(t, WeekEnd(2019, 1).Format(time.RFC3339Nano), "2019-01-06T23:59:59.999999999Z") + tst.AssertEqual(t, WeekEnd(2019, 2).Format(time.RFC3339Nano), "2019-01-13T23:59:59.999999999Z") + +}