From c08a739158c7eda24cb86dcc9c7a4c57d720112e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Thu, 21 Sep 2023 16:29:23 +0200 Subject: [PATCH] v0.0.268 added WeekStart() and WeekEnd() --- goextVersion.go | 4 ++-- timeext/calendarweek.go | 28 ++++++++++++++++++++++++++++ timeext/calendarweek_test.go | 25 +++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 timeext/calendarweek.go create mode 100644 timeext/calendarweek_test.go 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") + +}