From 2d545c83b05c0bbcbab32ed1a98643dc73d38417 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Fri, 12 May 2023 01:19:50 +0100 Subject: [PATCH] Fix week number. (#33) --- appenders.go | 22 +++++++++------------- strftime_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/appenders.go b/appenders.go index 2941a24..e09a3e5 100644 --- a/appenders.go +++ b/appenders.go @@ -36,13 +36,13 @@ var ( secondsNumberZeroPad = StdlibFormat("05") hms = StdlibFormat("15:04:05") tab = Verbatim("\t") - weekNumberSundayOrigin = weeknumberOffset(0) // week number of the year, Sunday first + weekNumberSundayOrigin = weeknumberOffset(true) // week number of the year, Sunday first weekdayMondayOrigin = weekday(1) // monday as the first day, and 01 as the first value weekNumberMondayOriginOneOrigin = AppendFunc(appendWeekNumber) eby = StdlibFormat("_2-Jan-2006") // monday as the first day, and 00 as the first value - weekNumberMondayOrigin = weeknumberOffset(1) // week number of the year, Monday first + weekNumberMondayOrigin = weeknumberOffset(false) // week number of the year, Monday first weekdaySundayOrigin = weekday(0) natReprTime = StdlibFormat("15:04:05") // national representation of the time XXX is this correct? natReprDate = StdlibFormat("01/02/06") // national representation of the date XXX is this correct? @@ -243,20 +243,16 @@ func (v weekday) Append(b []byte, t time.Time) []byte { return append(b, byte(n+48)) } -type weeknumberOffset int +type weeknumberOffset bool func (v weeknumberOffset) Append(b []byte, t time.Time) []byte { - yd := t.YearDay() - offset := int(t.Weekday()) - int(v) - if offset < 0 { - offset += 7 + offset := int(t.Weekday()) + if v { + offset = 6 - offset + } else if offset != 0 { + offset = 7 - offset } - - if yd < offset { - return append(b, '0', '0') - } - - n := ((yd - offset) / 7) + 1 + n := (t.YearDay() + offset) / 7 if n < 10 { b = append(b, '0') } diff --git a/strftime_test.go b/strftime_test.go index 17c693e..abf320c 100644 --- a/strftime_test.go +++ b/strftime_test.go @@ -377,3 +377,27 @@ func TestFormat12AM(t *testing.T) { return } } + +func TestFormat_WeekNumber(t *testing.T) { + for y := 2000; y < 2020; y++ { + sunday := "00" + monday := "00" + for d := 1; d < 8; d++ { + base := time.Date(y, time.January, d, 0, 0, 0, 0, time.UTC) + + switch base.Weekday() { + case time.Sunday: + sunday = "01" + case time.Monday: + monday = "01" + } + + if got, _ := strftime.Format("%U", base); got != sunday { + t.Errorf("Format(%q, %d) = %q, want %q", "%U", base.Unix(), got, sunday) + } + if got, _ := strftime.Format("%W", base); got != monday { + t.Errorf("Format(%q, %d) = %q, want %q", "%W", base.Unix(), got, monday) + } + } + } +}