From 150f2d1a90c015841898c7d060636e6c9e04b000 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:00 +1100 Subject: [PATCH 01/30] Prepare DST support: view_test.go: DST testing --- view_test.go | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/view_test.go b/view_test.go index 44c83fc..1ab5b9c 100644 --- a/view_test.go +++ b/view_test.go @@ -17,14 +17,113 @@ package main import ( + "fmt" "os" - "strconv" "strings" "testing" + "time" "golang.org/x/tools/txtar" ) +var ( + dstTestZones []*Zone = nil +) + +func LoadDstTestZones(t *testing.T) []*Zone { + if dstTestZones == nil { + config, err := LoadDefaultConfig([]string{ + "UTC", // Z + "Europe/Paris", // Z+1 (CET), Z+2 (CEST) + "Israel", // Z+2 (IST), Z+3 (IDT) + "Asia/Calcutta", // Z+5:30 (IST) + "Australia/Eucla", // Z+8:45 (no abbreviation) + "Australia/Sydney", // Z+10 (AEST), Z+11 (AEDT) + "Pacific/Kiritimati", // Z+14 (no abbreviation) + "Pacific/Honolulu", // Z-10 (HST) + "US/Central", // Z-6 (CST), Z-5 (CDT) + "Cuba", // Z-5 (CST), Z-4 (CDT) + "America/Argentina/ComodRivadavia", // Z-3 (no abbreviation) + }) + if err != nil { + t.Fatal(err) + } + dstTestZones = config.Zones[1:] + } + return dstTestZones +} + +func RunDstDaysTest( + t *testing.T, + title string, + testDataFile string, + transition time.Time, +) { + testData, err := txtar.ParseFile(testDataFile) + if err != nil { + t.Fatal(err) + } + + tests := []struct { + name string + time time.Time + }{ + {title, transition}, + {"Hour before", transition.Add(-time.Hour)}, + {"Hour after", transition.Add(time.Hour)}, + {"3 days before", transition.Add(-72 * time.Hour)}, + {"2 days before", transition.Add(-48 * time.Hour)}, + {"1 day before", transition.Add(-24 * time.Hour)}, + {"Day after", transition.Add(24 * time.Hour)}, + } + + var observations []string + var outputData = []txtar.File{} + for _, test := range tests { + state := model{ + zones: LoadDstTestZones(t), + clock: *NewClockTime(test.time), + isMilitary: true, + showDates: true, + } + observed := stripAnsiControlSequences(state.View()) + observations = append(observations, observed) + outputData = append( + outputData, + txtar.File{ + Name: fmt.Sprintf("%v (%v = %v)", test.name, test.time.Format(time.RFC3339), test.time.Unix()), + Data: []byte(observed), + }, + ) + } + + archive := txtar.Archive{ + Comment: testData.Comment, + Files: outputData, + } + os.WriteFile(testDataFile, txtar.Format(&archive), 0666) + + for i, test := range tests { + expected := stripAnsiControlSequencesAndNewline(testData.Files[i].Data) + observed := stripAnsiControlSequencesAndNewline(outputData[i].Data) + if expected != observed { + t.Errorf("Daylight Saving: Mismatched %s: Check git diff %s", test.name, testDataFile) + } + } +} + +func TestDstEndDays(t *testing.T) { + testDataFile := "testdata/view/test-dst-end-days.txt" + europeEndDst := time.Date(2024, time.October, 27, 1, 0, 0, 0, time.UTC) + RunDstDaysTest(t, "Europe DST end", testDataFile, europeEndDst) +} + +func TestDstStartDays(t *testing.T) { + testDataFile := "testdata/view/test-dst-start-days.txt" + europeStartDst := time.Date(2024, time.March, 31, 1, 0, 0, 0, time.UTC) + RunDstDaysTest(t, "Europe DST start", testDataFile, europeStartDst) +} + func TestRightAlignment(t *testing.T) { testDataFile := "testdata/view/test-right-alignment.txt" testData, err := txtar.ParseFile(testDataFile) @@ -45,7 +144,7 @@ func TestRightAlignment(t *testing.T) { originalColumns := os.Getenv("COLUMNS") var observations []string for _, test := range tests { - os.Setenv("COLUMNS", strconv.Itoa(test.columns)) + os.Setenv("COLUMNS", fmt.Sprintf("%v", test.columns)) observed := stripAnsiControlSequences(utcMinuteAfterMidnightModel.View()) observations = append(observations, observed) } From 95986abceed000b0be35a3b28aebc64b916619af Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:02 +1100 Subject: [PATCH 02/30] Prepare DST support: testdata/view/test-dst-*-days.txt: left-aligned (original as at v0.7.0) --- testdata/view/test-dst-end-days.txt | 278 ++++++++++++++++++++++++++ testdata/view/test-dst-start-days.txt | 278 ++++++++++++++++++++++++++ 2 files changed, 556 insertions(+) create mode 100644 testdata/view/test-dst-end-days.txt create mode 100644 testdata/view/test-dst-start-days.txt diff --git a/testdata/view/test-dst-end-days.txt b/testdata/view/test-dst-end-days.txt new file mode 100644 index 0000000..dd38d35 --- /dev/null +++ b/testdata/view/test-dst-end-days.txt @@ -0,0 +1,278 @@ +When daylight saving ends, clocks go backward 1 hour, so the date has 25 hours not 24 hours. +Using UTC as the local timezone (simple hours from 0-23 with no daylight saving changes), +render before/after the end of October daylight saving in Europe (Sunday) and Israel (Friday). +This checks the following requirements: +- Alignment of hours between different timezones. +- Duplicated hours when DST ends (e.g. morning hour 2 should be doubled in that zone, only). +- Abbreviated timezone names are updated before/after DST transitions: + - Central European Summer Time (CEST) versus CET (Central European Time) + - Israel Daylight Time (IDT) versus IST (Israel Standard Time) +- Timezones with same abbreviations but different offsets are handled correctly: + - IST: Israel Standard Time versus Indian Standard Time + - CDT: Central Daylight Time versus Cuba Daylight Time +- Timezones with positive and negative offsets. +- Timezones with different dates (before/after the International Date Line) +- Timezones with fractional offsets. +- Timezones with short and long names. +- Date transitions. +- Column location of showDates should shift by one hour between days before/after DST. + +-- Europe DST end (2024-10-27T01:00:00Z = 1729990800) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Sun 27 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 27 + πŸ•‘ (CET) Europe/Paris 02:00, Sun 27 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 28 + πŸ•’ (IST) Israel 03:00, Sun 27 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 28 + πŸ•• (IST) Asia/Calcutta 06:30, Sun 27 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 28 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sun 27 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 28 + πŸ•› (AEDT) Australia/Sydney 12:00, Sun 27 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 28 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun 27 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 28 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sat 26 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 27 + πŸ•— (CDT) US/Central 20:00, Sat 26 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 27 + πŸ•˜ (CDT) Cuba 21:00, Sat 26 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 27 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat 26 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 27 +-- Hour before (2024-10-27T00:00:00Z = 1729987200) -- + + What time is it? + + πŸ•› (UTC) UTC 00:00, Sun 27 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 27 + πŸ•‘ (CEST) Europe/Paris 02:00, Sun 27 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 28 + πŸ•‘ (IST) Israel 02:00, Sun 27 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 28 + πŸ•” (IST) Asia/Calcutta 05:30, Sun 27 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 28 + πŸ•— (+0845) Australia/Eucla 08:45, Sun 27 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 28 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 27 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 28 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 27 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 28 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 26 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 27 + πŸ•– (CDT) US/Central 19:00, Sat 26 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 27 + πŸ•— (CDT) Cuba 20:00, Sat 26 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 27 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 26 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 27 +-- Hour after (2024-10-27T02:00:00Z = 1729994400) -- + + What time is it? + + πŸ•‘ (UTC) UTC 02:00, Sun 27 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 27 + πŸ•’ (CET) Europe/Paris 03:00, Sun 27 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 28 + πŸ•“ (IST) Israel 04:00, Sun 27 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 28 + πŸ•– (IST) Asia/Calcutta 07:30, Sun 27 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 28 + πŸ•™ (+0845) Australia/Eucla 10:45, Sun 27 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 28 + πŸ• (AEDT) Australia/Sydney 13:00, Sun 27 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 28 + πŸ•“ (+14) Pacific/Kiritimati 16:00, Sun 27 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 28 + πŸ•“ (HST) Pacific/Honolulu 16:00, Sat 26 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 27 + πŸ•˜ (CDT) US/Central 21:00, Sat 26 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 27 + πŸ•™ (CDT) Cuba 22:00, Sat 26 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 27 + πŸ•™ (-03) America/Argentina/ComodRivadavia 23:00, Sat 26 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 27 +-- 3 days before (2024-10-24T01:00:00Z = 1729731600) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Thu 24 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Thu 24 + πŸ•’ (CEST) Europe/Paris 03:00, Thu 24 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Fri 25 + πŸ•“ (IDT) Israel 04:00, Thu 24 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Fri 25 + πŸ•• (IST) Asia/Calcutta 06:30, Thu 24 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Fri 25 + πŸ•˜ (+0845) Australia/Eucla 09:45, Thu 24 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Fri 25 + πŸ•› (AEDT) Australia/Sydney 12:00, Thu 24 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Fri 25 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Thu 24 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Fri 25 + πŸ•’ (HST) Pacific/Honolulu 15:00, Wed 23 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Thu 24 + πŸ•— (CDT) US/Central 20:00, Wed 23 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Thu 24 + πŸ•˜ (CDT) Cuba 21:00, Wed 23 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Thu 24 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Wed 23 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Thu 24 +-- 2 days before (2024-10-25T01:00:00Z = 1729818000) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Fri 25 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Fri 25 + πŸ•’ (CEST) Europe/Paris 03:00, Fri 25 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Sat 26 + πŸ•“ (IDT) Israel 04:00, Fri 25 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Sat 26 + πŸ•• (IST) Asia/Calcutta 06:30, Fri 25 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Sat 26 + πŸ•˜ (+0845) Australia/Eucla 09:45, Fri 25 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Sat 26 + πŸ•› (AEDT) Australia/Sydney 12:00, Fri 25 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Sat 26 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Fri 25 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sat 26 + πŸ•’ (HST) Pacific/Honolulu 15:00, Thu 24 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Fri 25 + πŸ•— (CDT) US/Central 20:00, Thu 24 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Fri 25 + πŸ•˜ (CDT) Cuba 21:00, Thu 24 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Fri 25 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Thu 24 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Fri 25 +-- 1 day before (2024-10-26T01:00:00Z = 1729904400) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Sat 26 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sat 26 + πŸ•’ (CEST) Europe/Paris 03:00, Sat 26 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Sun 27 + πŸ•“ (IDT) Israel 04:00, Sat 26 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Sun 27 + πŸ•• (IST) Asia/Calcutta 06:30, Sat 26 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Sun 27 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sat 26 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Sun 27 + πŸ•› (AEDT) Australia/Sydney 12:00, Sat 26 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Sun 27 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sat 26 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 27 + πŸ•’ (HST) Pacific/Honolulu 15:00, Fri 25 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sat 26 + πŸ•— (CDT) US/Central 20:00, Fri 25 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sat 26 + πŸ•˜ (CDT) Cuba 21:00, Fri 25 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sat 26 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Fri 25 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sat 26 +-- Day after (2024-10-28T01:00:00Z = 1730077200) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Mon 28 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Mon 28 + πŸ•‘ (CET) Europe/Paris 02:00, Mon 28 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Tue 29 + πŸ•’ (IST) Israel 03:00, Mon 28 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Tue 29 + πŸ•• (IST) Asia/Calcutta 06:30, Mon 28 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Tue 29 + πŸ•˜ (+0845) Australia/Eucla 09:45, Mon 28 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Tue 29 + πŸ•› (AEDT) Australia/Sydney 12:00, Mon 28 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Tue 29 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Mon 28 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Tue 29 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sun 27 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 28 + πŸ•— (CDT) US/Central 20:00, Sun 27 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Mon 28 + πŸ•˜ (CDT) Cuba 21:00, Sun 27 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Mon 28 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sun 27 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Mon 28 diff --git a/testdata/view/test-dst-start-days.txt b/testdata/view/test-dst-start-days.txt new file mode 100644 index 0000000..dab0df3 --- /dev/null +++ b/testdata/view/test-dst-start-days.txt @@ -0,0 +1,278 @@ +When daylight saving starts, clocks go forward 1 hour, so the date has 23 hours not 24 hours. +Using UTC as the local timezone (simple hours from 0-23 with no daylight saving changes), +render before/after the start of March daylight saving in Europe (Sunday) and Israel (Friday). +This checks the following requirements: +- Alignment of hours between different timezones. +- Missing hours when DST starts (e.g. morning hour 2 should be missing in that zone, only). +- Abbreviated timezone names are updated before/after DST transitions: + - Central European Summer Time (CEST) versus CET (Central European Time) + - Israel Daylight Time (IDT) versus IST (Israel Standard Time) +- Timezones with same abbreviations but different offsets are handled correctly: + - IST: Israel Standard Time versus Indian Standard Time + - CDT: Central Daylight Time versus Cuba Daylight Time +- Timezones with positive and negative offsets. +- Timezones with different dates (before/after the International Date Line) +- Timezones with fractional offsets. +- Timezones with short and long names. +- Date transitions. +- Column location of showDates should shift by one hour between days before/after DST. + +-- Europe DST start (2024-03-31T01:00:00Z = 1711846800) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Sun 31 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 31 + πŸ•’ (CEST) Europe/Paris 03:00, Sun 31 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 01 + πŸ•“ (IDT) Israel 04:00, Sun 31 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Mon 01 + πŸ•• (IST) Asia/Calcutta 06:30, Sun 31 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 01 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sun 31 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 01 + πŸ•› (AEDT) Australia/Sydney 12:00, Sun 31 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 01 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun 31 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 01 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sat 30 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 31 + πŸ•— (CDT) US/Central 20:00, Sat 30 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 31 + πŸ•˜ (CDT) Cuba 21:00, Sat 30 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 31 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat 30 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 31 +-- Hour before (2024-03-31T00:00:00Z = 1711843200) -- + + What time is it? + + πŸ•› (UTC) UTC 00:00, Sun 31 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 31 + πŸ• (CET) Europe/Paris 01:00, Sun 31 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 01 + πŸ•’ (IDT) Israel 03:00, Sun 31 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Mon 01 + πŸ•” (IST) Asia/Calcutta 05:30, Sun 31 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 01 + πŸ•— (+0845) Australia/Eucla 08:45, Sun 31 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 01 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 31 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 01 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 31 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 01 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 30 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 31 + πŸ•– (CDT) US/Central 19:00, Sat 30 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 31 + πŸ•— (CDT) Cuba 20:00, Sat 30 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 31 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 30 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 31 +-- Hour after (2024-03-31T02:00:00Z = 1711850400) -- + + What time is it? + + πŸ•‘ (UTC) UTC 02:00, Sun 31 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 31 + πŸ•“ (CEST) Europe/Paris 04:00, Sun 31 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 01 + πŸ•” (IDT) Israel 05:00, Sun 31 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Mon 01 + πŸ•– (IST) Asia/Calcutta 07:30, Sun 31 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 01 + πŸ•™ (+0845) Australia/Eucla 10:45, Sun 31 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 01 + πŸ• (AEDT) Australia/Sydney 13:00, Sun 31 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 01 + πŸ•“ (+14) Pacific/Kiritimati 16:00, Sun 31 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 01 + πŸ•“ (HST) Pacific/Honolulu 16:00, Sat 30 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 31 + πŸ•˜ (CDT) US/Central 21:00, Sat 30 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 31 + πŸ•™ (CDT) Cuba 22:00, Sat 30 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 31 + πŸ•™ (-03) America/Argentina/ComodRivadavia 23:00, Sat 30 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 31 +-- 3 days before (2024-03-28T01:00:00Z = 1711587600) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Thu 28 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Thu 28 + πŸ•‘ (CET) Europe/Paris 02:00, Thu 28 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Fri 29 + πŸ•’ (IST) Israel 03:00, Thu 28 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Fri 29 + πŸ•• (IST) Asia/Calcutta 06:30, Thu 28 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Fri 29 + πŸ•˜ (+0845) Australia/Eucla 09:45, Thu 28 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Fri 29 + πŸ•› (AEDT) Australia/Sydney 12:00, Thu 28 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Fri 29 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Thu 28 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Fri 29 + πŸ•’ (HST) Pacific/Honolulu 15:00, Wed 27 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Thu 28 + πŸ•— (CDT) US/Central 20:00, Wed 27 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Thu 28 + πŸ•˜ (CDT) Cuba 21:00, Wed 27 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Thu 28 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Wed 27 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Thu 28 +-- 2 days before (2024-03-29T01:00:00Z = 1711674000) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Fri 29 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Fri 29 + πŸ•‘ (CET) Europe/Paris 02:00, Fri 29 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Sat 30 + πŸ•“ (IDT) Israel 04:00, Fri 29 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Sat 30 + πŸ•• (IST) Asia/Calcutta 06:30, Fri 29 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Sat 30 + πŸ•˜ (+0845) Australia/Eucla 09:45, Fri 29 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Sat 30 + πŸ•› (AEDT) Australia/Sydney 12:00, Fri 29 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Sat 30 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Fri 29 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sat 30 + πŸ•’ (HST) Pacific/Honolulu 15:00, Thu 28 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Fri 29 + πŸ•— (CDT) US/Central 20:00, Thu 28 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Fri 29 + πŸ•˜ (CDT) Cuba 21:00, Thu 28 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Fri 29 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Thu 28 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Fri 29 +-- 1 day before (2024-03-30T01:00:00Z = 1711760400) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Sat 30 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sat 30 + πŸ•‘ (CET) Europe/Paris 02:00, Sat 30 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Sun 31 + πŸ•“ (IDT) Israel 04:00, Sat 30 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Sun 31 + πŸ•• (IST) Asia/Calcutta 06:30, Sat 30 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Sun 31 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sat 30 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Sun 31 + πŸ•› (AEDT) Australia/Sydney 12:00, Sat 30 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Sun 31 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sat 30 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 31 + πŸ•’ (HST) Pacific/Honolulu 15:00, Fri 29 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sat 30 + πŸ•— (CDT) US/Central 20:00, Fri 29 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sat 30 + πŸ•˜ (CDT) Cuba 21:00, Fri 29 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sat 30 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Fri 29 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sat 30 +-- Day after (2024-04-01T01:00:00Z = 1711933200) -- + + What time is it? + + πŸ• (UTC) UTC 01:00, Mon 01 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Mon 01 + πŸ•’ (CEST) Europe/Paris 03:00, Mon 01 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Tue 02 + πŸ•“ (IDT) Israel 04:00, Mon 01 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Tue 02 + πŸ•• (IST) Asia/Calcutta 06:30, Mon 01 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Tue 02 + πŸ•˜ (+0845) Australia/Eucla 09:45, Mon 01 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Tue 02 + πŸ•› (AEDT) Australia/Sydney 12:00, Mon 01 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Tue 02 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Mon 01 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Tue 02 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sun 31 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 01 + πŸ•— (CDT) US/Central 20:00, Sun 31 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Mon 01 + πŸ•˜ (CDT) Cuba 21:00, Sun 31 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Mon 01 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sun 31 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Mon 01 From c6864308439e0755ff119de253c34da68a3d62e7 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:03 +1100 Subject: [PATCH 03/30] Prepare DST support: testdata/view/test-dst-*-days.txt: right-aligned (feature e4e6d44) --- testdata/view/test-dst-end-days.txt | 154 +++++++++++++------------- testdata/view/test-dst-start-days.txt | 154 +++++++++++++------------- 2 files changed, 154 insertions(+), 154 deletions(-) diff --git a/testdata/view/test-dst-end-days.txt b/testdata/view/test-dst-end-days.txt index dd38d35..8dc4d89 100644 --- a/testdata/view/test-dst-end-days.txt +++ b/testdata/view/test-dst-end-days.txt @@ -21,258 +21,258 @@ This checks the following requirements: What time is it? - πŸ• (UTC) UTC 01:00, Sun 27 + πŸ• (UTC) UTC 01:00, Sun Oct 27, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 - πŸ•‘ (CET) Europe/Paris 02:00, Sun 27 + πŸ•‘ (CET) Europe/Paris 02:00, Sun Oct 27, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 28 - πŸ•’ (IST) Israel 03:00, Sun 27 + πŸ•’ (IST) Israel 03:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 - πŸ•• (IST) Asia/Calcutta 06:30, Sun 27 + πŸ•• (IST) Asia/Calcutta 06:30, Sun Oct 27, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 28 - πŸ•˜ (+0845) Australia/Eucla 09:45, Sun 27 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sun Oct 27, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 28 - πŸ•› (AEDT) Australia/Sydney 12:00, Sun 27 + πŸ•› (AEDT) Australia/Sydney 12:00, Sun Oct 27, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 28 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun 27 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun Oct 27, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 28 - πŸ•’ (HST) Pacific/Honolulu 15:00, Sat 26 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sat Oct 26, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 27 - πŸ•— (CDT) US/Central 20:00, Sat 26 + πŸ•— (CDT) US/Central 20:00, Sat Oct 26, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 27 - πŸ•˜ (CDT) Cuba 21:00, Sat 26 + πŸ•˜ (CDT) Cuba 21:00, Sat Oct 26, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 27 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat 26 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat Oct 26, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 27 -- Hour before (2024-10-27T00:00:00Z = 1729987200) -- What time is it? - πŸ•› (UTC) UTC 00:00, Sun 27 + πŸ•› (UTC) UTC 00:00, Sun Oct 27, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 - πŸ•‘ (CEST) Europe/Paris 02:00, Sun 27 + πŸ•‘ (CEST) Europe/Paris 02:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 - πŸ•‘ (IST) Israel 02:00, Sun 27 + πŸ•‘ (IST) Israel 02:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 - πŸ•” (IST) Asia/Calcutta 05:30, Sun 27 + πŸ•” (IST) Asia/Calcutta 05:30, Sun Oct 27, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 28 - πŸ•— (+0845) Australia/Eucla 08:45, Sun 27 + πŸ•— (+0845) Australia/Eucla 08:45, Sun Oct 27, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 28 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 27 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Oct 27, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 28 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 27 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Oct 27, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 28 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 26 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Oct 26, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 27 - πŸ•– (CDT) US/Central 19:00, Sat 26 + πŸ•– (CDT) US/Central 19:00, Sat Oct 26, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 27 - πŸ•— (CDT) Cuba 20:00, Sat 26 + πŸ•— (CDT) Cuba 20:00, Sat Oct 26, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 27 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 26 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Oct 26, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 27 -- Hour after (2024-10-27T02:00:00Z = 1729994400) -- What time is it? - πŸ•‘ (UTC) UTC 02:00, Sun 27 + πŸ•‘ (UTC) UTC 02:00, Sun Oct 27, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 - πŸ•’ (CET) Europe/Paris 03:00, Sun 27 + πŸ•’ (CET) Europe/Paris 03:00, Sun Oct 27, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 28 - πŸ•“ (IST) Israel 04:00, Sun 27 + πŸ•“ (IST) Israel 04:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 - πŸ•– (IST) Asia/Calcutta 07:30, Sun 27 + πŸ•– (IST) Asia/Calcutta 07:30, Sun Oct 27, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 28 - πŸ•™ (+0845) Australia/Eucla 10:45, Sun 27 + πŸ•™ (+0845) Australia/Eucla 10:45, Sun Oct 27, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 28 - πŸ• (AEDT) Australia/Sydney 13:00, Sun 27 + πŸ• (AEDT) Australia/Sydney 13:00, Sun Oct 27, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 28 - πŸ•“ (+14) Pacific/Kiritimati 16:00, Sun 27 + πŸ•“ (+14) Pacific/Kiritimati 16:00, Sun Oct 27, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 28 - πŸ•“ (HST) Pacific/Honolulu 16:00, Sat 26 + πŸ•“ (HST) Pacific/Honolulu 16:00, Sat Oct 26, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 27 - πŸ•˜ (CDT) US/Central 21:00, Sat 26 + πŸ•˜ (CDT) US/Central 21:00, Sat Oct 26, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 27 - πŸ•™ (CDT) Cuba 22:00, Sat 26 + πŸ•™ (CDT) Cuba 22:00, Sat Oct 26, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 27 - πŸ•™ (-03) America/Argentina/ComodRivadavia 23:00, Sat 26 + πŸ•™ (-03) America/Argentina/ComodRivadavia 23:00, Sat Oct 26, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 27 -- 3 days before (2024-10-24T01:00:00Z = 1729731600) -- What time is it? - πŸ• (UTC) UTC 01:00, Thu 24 + πŸ• (UTC) UTC 01:00, Thu Oct 24, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Thu 24 - πŸ•’ (CEST) Europe/Paris 03:00, Thu 24 + πŸ•’ (CEST) Europe/Paris 03:00, Thu Oct 24, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Fri 25 - πŸ•“ (IDT) Israel 04:00, Thu 24 + πŸ•“ (IDT) Israel 04:00, Thu Oct 24, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Fri 25 - πŸ•• (IST) Asia/Calcutta 06:30, Thu 24 + πŸ•• (IST) Asia/Calcutta 06:30, Thu Oct 24, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Fri 25 - πŸ•˜ (+0845) Australia/Eucla 09:45, Thu 24 + πŸ•˜ (+0845) Australia/Eucla 09:45, Thu Oct 24, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Fri 25 - πŸ•› (AEDT) Australia/Sydney 12:00, Thu 24 + πŸ•› (AEDT) Australia/Sydney 12:00, Thu Oct 24, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Fri 25 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Thu 24 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Thu Oct 24, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Fri 25 - πŸ•’ (HST) Pacific/Honolulu 15:00, Wed 23 + πŸ•’ (HST) Pacific/Honolulu 15:00, Wed Oct 23, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Thu 24 - πŸ•— (CDT) US/Central 20:00, Wed 23 + πŸ•— (CDT) US/Central 20:00, Wed Oct 23, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Thu 24 - πŸ•˜ (CDT) Cuba 21:00, Wed 23 + πŸ•˜ (CDT) Cuba 21:00, Wed Oct 23, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Thu 24 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Wed 23 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Wed Oct 23, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Thu 24 -- 2 days before (2024-10-25T01:00:00Z = 1729818000) -- What time is it? - πŸ• (UTC) UTC 01:00, Fri 25 + πŸ• (UTC) UTC 01:00, Fri Oct 25, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Fri 25 - πŸ•’ (CEST) Europe/Paris 03:00, Fri 25 + πŸ•’ (CEST) Europe/Paris 03:00, Fri Oct 25, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Sat 26 - πŸ•“ (IDT) Israel 04:00, Fri 25 + πŸ•“ (IDT) Israel 04:00, Fri Oct 25, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Sat 26 - πŸ•• (IST) Asia/Calcutta 06:30, Fri 25 + πŸ•• (IST) Asia/Calcutta 06:30, Fri Oct 25, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sat 26 - πŸ•˜ (+0845) Australia/Eucla 09:45, Fri 25 + πŸ•˜ (+0845) Australia/Eucla 09:45, Fri Oct 25, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Sat 26 - πŸ•› (AEDT) Australia/Sydney 12:00, Fri 25 + πŸ•› (AEDT) Australia/Sydney 12:00, Fri Oct 25, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Sat 26 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Fri 25 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Fri Oct 25, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sat 26 - πŸ•’ (HST) Pacific/Honolulu 15:00, Thu 24 + πŸ•’ (HST) Pacific/Honolulu 15:00, Thu Oct 24, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Fri 25 - πŸ•— (CDT) US/Central 20:00, Thu 24 + πŸ•— (CDT) US/Central 20:00, Thu Oct 24, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Fri 25 - πŸ•˜ (CDT) Cuba 21:00, Thu 24 + πŸ•˜ (CDT) Cuba 21:00, Thu Oct 24, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Fri 25 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Thu 24 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Thu Oct 24, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Fri 25 -- 1 day before (2024-10-26T01:00:00Z = 1729904400) -- What time is it? - πŸ• (UTC) UTC 01:00, Sat 26 + πŸ• (UTC) UTC 01:00, Sat Oct 26, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 26 - πŸ•’ (CEST) Europe/Paris 03:00, Sat 26 + πŸ•’ (CEST) Europe/Paris 03:00, Sat Oct 26, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Sun 27 - πŸ•“ (IDT) Israel 04:00, Sat 26 + πŸ•“ (IDT) Israel 04:00, Sat Oct 26, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Sun 27 - πŸ•• (IST) Asia/Calcutta 06:30, Sat 26 + πŸ•• (IST) Asia/Calcutta 06:30, Sat Oct 26, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 27 - πŸ•˜ (+0845) Australia/Eucla 09:45, Sat 26 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sat Oct 26, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Sun 27 - πŸ•› (AEDT) Australia/Sydney 12:00, Sat 26 + πŸ•› (AEDT) Australia/Sydney 12:00, Sat Oct 26, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Sun 27 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Sat 26 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sat Oct 26, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 27 - πŸ•’ (HST) Pacific/Honolulu 15:00, Fri 25 + πŸ•’ (HST) Pacific/Honolulu 15:00, Fri Oct 25, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sat 26 - πŸ•— (CDT) US/Central 20:00, Fri 25 + πŸ•— (CDT) US/Central 20:00, Fri Oct 25, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sat 26 - πŸ•˜ (CDT) Cuba 21:00, Fri 25 + πŸ•˜ (CDT) Cuba 21:00, Fri Oct 25, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sat 26 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Fri 25 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Fri Oct 25, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sat 26 -- Day after (2024-10-28T01:00:00Z = 1730077200) -- What time is it? - πŸ• (UTC) UTC 01:00, Mon 28 + πŸ• (UTC) UTC 01:00, Mon Oct 28, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 28 - πŸ•‘ (CET) Europe/Paris 02:00, Mon 28 + πŸ•‘ (CET) Europe/Paris 02:00, Mon Oct 28, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Tue 29 - πŸ•’ (IST) Israel 03:00, Mon 28 + πŸ•’ (IST) Israel 03:00, Mon Oct 28, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Tue 29 - πŸ•• (IST) Asia/Calcutta 06:30, Mon 28 + πŸ•• (IST) Asia/Calcutta 06:30, Mon Oct 28, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Tue 29 - πŸ•˜ (+0845) Australia/Eucla 09:45, Mon 28 + πŸ•˜ (+0845) Australia/Eucla 09:45, Mon Oct 28, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Tue 29 - πŸ•› (AEDT) Australia/Sydney 12:00, Mon 28 + πŸ•› (AEDT) Australia/Sydney 12:00, Mon Oct 28, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Tue 29 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Mon 28 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Mon Oct 28, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Tue 29 - πŸ•’ (HST) Pacific/Honolulu 15:00, Sun 27 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sun Oct 27, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 28 - πŸ•— (CDT) US/Central 20:00, Sun 27 + πŸ•— (CDT) US/Central 20:00, Sun Oct 27, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 28 - πŸ•˜ (CDT) Cuba 21:00, Sun 27 + πŸ•˜ (CDT) Cuba 21:00, Sun Oct 27, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Mon 28 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sun 27 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sun Oct 27, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Mon 28 diff --git a/testdata/view/test-dst-start-days.txt b/testdata/view/test-dst-start-days.txt index dab0df3..3ebed24 100644 --- a/testdata/view/test-dst-start-days.txt +++ b/testdata/view/test-dst-start-days.txt @@ -21,258 +21,258 @@ This checks the following requirements: What time is it? - πŸ• (UTC) UTC 01:00, Sun 31 + πŸ• (UTC) UTC 01:00, Sun Mar 31, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 31 - πŸ•’ (CEST) Europe/Paris 03:00, Sun 31 + πŸ•’ (CEST) Europe/Paris 03:00, Sun Mar 31, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 01 - πŸ•“ (IDT) Israel 04:00, Sun 31 + πŸ•“ (IDT) Israel 04:00, Sun Mar 31, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 01 - πŸ•• (IST) Asia/Calcutta 06:30, Sun 31 + πŸ•• (IST) Asia/Calcutta 06:30, Sun Mar 31, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 01 - πŸ•˜ (+0845) Australia/Eucla 09:45, Sun 31 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sun Mar 31, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 01 - πŸ•› (AEDT) Australia/Sydney 12:00, Sun 31 + πŸ•› (AEDT) Australia/Sydney 12:00, Sun Mar 31, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 01 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun 31 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun Mar 31, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 01 - πŸ•’ (HST) Pacific/Honolulu 15:00, Sat 30 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sat Mar 30, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 31 - πŸ•— (CDT) US/Central 20:00, Sat 30 + πŸ•— (CDT) US/Central 20:00, Sat Mar 30, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 31 - πŸ•˜ (CDT) Cuba 21:00, Sat 30 + πŸ•˜ (CDT) Cuba 21:00, Sat Mar 30, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 31 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat 30 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat Mar 30, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 31 -- Hour before (2024-03-31T00:00:00Z = 1711843200) -- What time is it? - πŸ•› (UTC) UTC 00:00, Sun 31 + πŸ•› (UTC) UTC 00:00, Sun Mar 31, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 31 - πŸ• (CET) Europe/Paris 01:00, Sun 31 + πŸ• (CET) Europe/Paris 01:00, Sun Mar 31, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 01 - πŸ•’ (IDT) Israel 03:00, Sun 31 + πŸ•’ (IDT) Israel 03:00, Sun Mar 31, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 01 - πŸ•” (IST) Asia/Calcutta 05:30, Sun 31 + πŸ•” (IST) Asia/Calcutta 05:30, Sun Mar 31, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 01 - πŸ•— (+0845) Australia/Eucla 08:45, Sun 31 + πŸ•— (+0845) Australia/Eucla 08:45, Sun Mar 31, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 01 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 31 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Mar 31, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 01 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 31 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Mar 31, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 01 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 30 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Mar 30, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 31 - πŸ•– (CDT) US/Central 19:00, Sat 30 + πŸ•– (CDT) US/Central 19:00, Sat Mar 30, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 31 - πŸ•— (CDT) Cuba 20:00, Sat 30 + πŸ•— (CDT) Cuba 20:00, Sat Mar 30, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 31 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 30 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Mar 30, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 31 -- Hour after (2024-03-31T02:00:00Z = 1711850400) -- What time is it? - πŸ•‘ (UTC) UTC 02:00, Sun 31 + πŸ•‘ (UTC) UTC 02:00, Sun Mar 31, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 31 - πŸ•“ (CEST) Europe/Paris 04:00, Sun 31 + πŸ•“ (CEST) Europe/Paris 04:00, Sun Mar 31, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 01 - πŸ•” (IDT) Israel 05:00, Sun 31 + πŸ•” (IDT) Israel 05:00, Sun Mar 31, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 01 - πŸ•– (IST) Asia/Calcutta 07:30, Sun 31 + πŸ•– (IST) Asia/Calcutta 07:30, Sun Mar 31, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 01 - πŸ•™ (+0845) Australia/Eucla 10:45, Sun 31 + πŸ•™ (+0845) Australia/Eucla 10:45, Sun Mar 31, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 01 - πŸ• (AEDT) Australia/Sydney 13:00, Sun 31 + πŸ• (AEDT) Australia/Sydney 13:00, Sun Mar 31, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 01 - πŸ•“ (+14) Pacific/Kiritimati 16:00, Sun 31 + πŸ•“ (+14) Pacific/Kiritimati 16:00, Sun Mar 31, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 01 - πŸ•“ (HST) Pacific/Honolulu 16:00, Sat 30 + πŸ•“ (HST) Pacific/Honolulu 16:00, Sat Mar 30, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 31 - πŸ•˜ (CDT) US/Central 21:00, Sat 30 + πŸ•˜ (CDT) US/Central 21:00, Sat Mar 30, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 31 - πŸ•™ (CDT) Cuba 22:00, Sat 30 + πŸ•™ (CDT) Cuba 22:00, Sat Mar 30, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 31 - πŸ•™ (-03) America/Argentina/ComodRivadavia 23:00, Sat 30 + πŸ•™ (-03) America/Argentina/ComodRivadavia 23:00, Sat Mar 30, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 31 -- 3 days before (2024-03-28T01:00:00Z = 1711587600) -- What time is it? - πŸ• (UTC) UTC 01:00, Thu 28 + πŸ• (UTC) UTC 01:00, Thu Mar 28, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Thu 28 - πŸ•‘ (CET) Europe/Paris 02:00, Thu 28 + πŸ•‘ (CET) Europe/Paris 02:00, Thu Mar 28, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Fri 29 - πŸ•’ (IST) Israel 03:00, Thu 28 + πŸ•’ (IST) Israel 03:00, Thu Mar 28, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Fri 29 - πŸ•• (IST) Asia/Calcutta 06:30, Thu 28 + πŸ•• (IST) Asia/Calcutta 06:30, Thu Mar 28, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Fri 29 - πŸ•˜ (+0845) Australia/Eucla 09:45, Thu 28 + πŸ•˜ (+0845) Australia/Eucla 09:45, Thu Mar 28, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Fri 29 - πŸ•› (AEDT) Australia/Sydney 12:00, Thu 28 + πŸ•› (AEDT) Australia/Sydney 12:00, Thu Mar 28, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Fri 29 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Thu 28 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Thu Mar 28, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Fri 29 - πŸ•’ (HST) Pacific/Honolulu 15:00, Wed 27 + πŸ•’ (HST) Pacific/Honolulu 15:00, Wed Mar 27, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Thu 28 - πŸ•— (CDT) US/Central 20:00, Wed 27 + πŸ•— (CDT) US/Central 20:00, Wed Mar 27, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Thu 28 - πŸ•˜ (CDT) Cuba 21:00, Wed 27 + πŸ•˜ (CDT) Cuba 21:00, Wed Mar 27, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Thu 28 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Wed 27 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Wed Mar 27, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Thu 28 -- 2 days before (2024-03-29T01:00:00Z = 1711674000) -- What time is it? - πŸ• (UTC) UTC 01:00, Fri 29 + πŸ• (UTC) UTC 01:00, Fri Mar 29, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Fri 29 - πŸ•‘ (CET) Europe/Paris 02:00, Fri 29 + πŸ•‘ (CET) Europe/Paris 02:00, Fri Mar 29, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sat 30 - πŸ•“ (IDT) Israel 04:00, Fri 29 + πŸ•“ (IDT) Israel 04:00, Fri Mar 29, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Sat 30 - πŸ•• (IST) Asia/Calcutta 06:30, Fri 29 + πŸ•• (IST) Asia/Calcutta 06:30, Fri Mar 29, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sat 30 - πŸ•˜ (+0845) Australia/Eucla 09:45, Fri 29 + πŸ•˜ (+0845) Australia/Eucla 09:45, Fri Mar 29, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Sat 30 - πŸ•› (AEDT) Australia/Sydney 12:00, Fri 29 + πŸ•› (AEDT) Australia/Sydney 12:00, Fri Mar 29, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Sat 30 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Fri 29 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Fri Mar 29, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sat 30 - πŸ•’ (HST) Pacific/Honolulu 15:00, Thu 28 + πŸ•’ (HST) Pacific/Honolulu 15:00, Thu Mar 28, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Fri 29 - πŸ•— (CDT) US/Central 20:00, Thu 28 + πŸ•— (CDT) US/Central 20:00, Thu Mar 28, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Fri 29 - πŸ•˜ (CDT) Cuba 21:00, Thu 28 + πŸ•˜ (CDT) Cuba 21:00, Thu Mar 28, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Fri 29 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Thu 28 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Thu Mar 28, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Fri 29 -- 1 day before (2024-03-30T01:00:00Z = 1711760400) -- What time is it? - πŸ• (UTC) UTC 01:00, Sat 30 + πŸ• (UTC) UTC 01:00, Sat Mar 30, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 30 - πŸ•‘ (CET) Europe/Paris 02:00, Sat 30 + πŸ•‘ (CET) Europe/Paris 02:00, Sat Mar 30, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 31 - πŸ•“ (IDT) Israel 04:00, Sat 30 + πŸ•“ (IDT) Israel 04:00, Sat Mar 30, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Sun 31 - πŸ•• (IST) Asia/Calcutta 06:30, Sat 30 + πŸ•• (IST) Asia/Calcutta 06:30, Sat Mar 30, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 31 - πŸ•˜ (+0845) Australia/Eucla 09:45, Sat 30 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sat Mar 30, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Sun 31 - πŸ•› (AEDT) Australia/Sydney 12:00, Sat 30 + πŸ•› (AEDT) Australia/Sydney 12:00, Sat Mar 30, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Sun 31 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Sat 30 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sat Mar 30, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 31 - πŸ•’ (HST) Pacific/Honolulu 15:00, Fri 29 + πŸ•’ (HST) Pacific/Honolulu 15:00, Fri Mar 29, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sat 30 - πŸ•— (CDT) US/Central 20:00, Fri 29 + πŸ•— (CDT) US/Central 20:00, Fri Mar 29, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sat 30 - πŸ•˜ (CDT) Cuba 21:00, Fri 29 + πŸ•˜ (CDT) Cuba 21:00, Fri Mar 29, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sat 30 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Fri 29 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Fri Mar 29, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sat 30 -- Day after (2024-04-01T01:00:00Z = 1711933200) -- What time is it? - πŸ• (UTC) UTC 01:00, Mon 01 + πŸ• (UTC) UTC 01:00, Mon Apr 01, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 01 - πŸ•’ (CEST) Europe/Paris 03:00, Mon 01 + πŸ•’ (CEST) Europe/Paris 03:00, Mon Apr 01, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Tue 02 - πŸ•“ (IDT) Israel 04:00, Mon 01 + πŸ•“ (IDT) Israel 04:00, Mon Apr 01, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Tue 02 - πŸ•• (IST) Asia/Calcutta 06:30, Mon 01 + πŸ•• (IST) Asia/Calcutta 06:30, Mon Apr 01, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Tue 02 - πŸ•˜ (+0845) Australia/Eucla 09:45, Mon 01 + πŸ•˜ (+0845) Australia/Eucla 09:45, Mon Apr 01, 2024 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Tue 02 - πŸ•› (AEDT) Australia/Sydney 12:00, Mon 01 + πŸ•› (AEDT) Australia/Sydney 12:00, Mon Apr 01, 2024 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Tue 02 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Mon 01 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Mon Apr 01, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Tue 02 - πŸ•’ (HST) Pacific/Honolulu 15:00, Sun 31 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sun Mar 31, 2024 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 01 - πŸ•— (CDT) US/Central 20:00, Sun 31 + πŸ•— (CDT) US/Central 20:00, Sun Mar 31, 2024 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 01 - πŸ•˜ (CDT) Cuba 21:00, Sun 31 + πŸ•˜ (CDT) Cuba 21:00, Sun Mar 31, 2024 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Mon 01 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sun 31 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sun Mar 31, 2024 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Mon 01 From 29b013d55d9adb10dd775882ff9b3b68b035a51d Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:04 +1100 Subject: [PATCH 04/30] Prepare DST support: testdata/view/test-dst-*-days.txt: wrong zones (with regression 0bdd6e2) --- testdata/view/test-dst-end-days.txt | 14 +++++++------- testdata/view/test-dst-start-days.txt | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/testdata/view/test-dst-end-days.txt b/testdata/view/test-dst-end-days.txt index 8dc4d89..26c040a 100644 --- a/testdata/view/test-dst-end-days.txt +++ b/testdata/view/test-dst-end-days.txt @@ -24,10 +24,10 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Sun Oct 27, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 - πŸ•‘ (CET) Europe/Paris 02:00, Sun Oct 27, 2024 + πŸ•‘ (CEST) Europe/Paris 02:00, Sun Oct 27, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 28 - πŸ•’ (IST) Israel 03:00, Sun Oct 27, 2024 + πŸ•’ (IDT) Israel 03:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 πŸ•• (IST) Asia/Calcutta 06:30, Sun Oct 27, 2024 @@ -64,7 +64,7 @@ This checks the following requirements: πŸ•‘ (CEST) Europe/Paris 02:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 - πŸ•‘ (IST) Israel 02:00, Sun Oct 27, 2024 + πŸ•‘ (IDT) Israel 02:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 πŸ•” (IST) Asia/Calcutta 05:30, Sun Oct 27, 2024 @@ -98,10 +98,10 @@ This checks the following requirements: πŸ•‘ (UTC) UTC 02:00, Sun Oct 27, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 - πŸ•’ (CET) Europe/Paris 03:00, Sun Oct 27, 2024 + πŸ•’ (CEST) Europe/Paris 03:00, Sun Oct 27, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 28 - πŸ•“ (IST) Israel 04:00, Sun Oct 27, 2024 + πŸ•“ (IDT) Israel 04:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 πŸ•– (IST) Asia/Calcutta 07:30, Sun Oct 27, 2024 @@ -246,10 +246,10 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Mon Oct 28, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 28 - πŸ•‘ (CET) Europe/Paris 02:00, Mon Oct 28, 2024 + πŸ•‘ (CEST) Europe/Paris 02:00, Mon Oct 28, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Tue 29 - πŸ•’ (IST) Israel 03:00, Mon Oct 28, 2024 + πŸ•’ (IDT) Israel 03:00, Mon Oct 28, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Tue 29 πŸ•• (IST) Asia/Calcutta 06:30, Mon Oct 28, 2024 diff --git a/testdata/view/test-dst-start-days.txt b/testdata/view/test-dst-start-days.txt index 3ebed24..66d449c 100644 --- a/testdata/view/test-dst-start-days.txt +++ b/testdata/view/test-dst-start-days.txt @@ -61,7 +61,7 @@ This checks the following requirements: πŸ•› (UTC) UTC 00:00, Sun Mar 31, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 31 - πŸ• (CET) Europe/Paris 01:00, Sun Mar 31, 2024 + πŸ• (CEST) Europe/Paris 01:00, Sun Mar 31, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 01 πŸ•’ (IDT) Israel 03:00, Sun Mar 31, 2024 @@ -135,10 +135,10 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Thu Mar 28, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Thu 28 - πŸ•‘ (CET) Europe/Paris 02:00, Thu Mar 28, 2024 + πŸ•‘ (CEST) Europe/Paris 02:00, Thu Mar 28, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Fri 29 - πŸ•’ (IST) Israel 03:00, Thu Mar 28, 2024 + πŸ•’ (IDT) Israel 03:00, Thu Mar 28, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Fri 29 πŸ•• (IST) Asia/Calcutta 06:30, Thu Mar 28, 2024 @@ -172,7 +172,7 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Fri Mar 29, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Fri 29 - πŸ•‘ (CET) Europe/Paris 02:00, Fri Mar 29, 2024 + πŸ•‘ (CEST) Europe/Paris 02:00, Fri Mar 29, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sat 30 πŸ•“ (IDT) Israel 04:00, Fri Mar 29, 2024 @@ -209,7 +209,7 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Sat Mar 30, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 30 - πŸ•‘ (CET) Europe/Paris 02:00, Sat Mar 30, 2024 + πŸ•‘ (CEST) Europe/Paris 02:00, Sat Mar 30, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 31 πŸ•“ (IDT) Israel 04:00, Sat Mar 30, 2024 From 88d4c6a2c316051d147705aeab3686a8ec43234d Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:05 +1100 Subject: [PATCH 05/30] Prepare DST support: view_test.go: Fractional timezone testing --- view_test.go | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/view_test.go b/view_test.go index 1ab5b9c..67906d1 100644 --- a/view_test.go +++ b/view_test.go @@ -23,6 +23,7 @@ import ( "testing" "time" + tea "github.com/charmbracelet/bubbletea" "golang.org/x/tools/txtar" ) @@ -124,6 +125,89 @@ func TestDstStartDays(t *testing.T) { RunDstDaysTest(t, "Europe DST start", testDataFile, europeStartDst) } +func TestFractionalTimezoneOffsets(t *testing.T) { + testDataFile := "testdata/view/test-fractional-timezone-offsets.txt" + testData, err := txtar.ParseFile(testDataFile) + if err != nil { + t.Fatal(err) + } + + tests := []struct { + name string + datetime string + keystrokes string + }{ + {"Start time", "2017-11-05T00:29:02Z", ""}, + {"Plus 1 hour", "2017-11-05T01:29:02Z", "l"}, + {"Minus 15 minutes", "2017-11-05T01:14:02Z", "---------------"}, // @todo implement new keys + {"Return to start", "2017-11-05T00:29:02Z", "HL<>+++++++++++++++h"}, + {"Minus 1 hour, date changed", "2017-11-04T23:29:02Z", "h"}, + {"Return to start", "2017-11-05T00:29:02Z", "l"}, + } + + start, err := time.Parse(time.RFC3339, tests[0].datetime) + if err != nil { + t.Fatalf("Could not parse test Start time: %v", err) + } + + state := &model{ + zones: LoadDstTestZones(t), + clock: *NewClockTime(start), + keymaps: DefaultKeymaps, + isMilitary: true, + showDates: true, + } + + var observations []string + var outputData = []txtar.File{} + for _, test := range tests { + for k, key := range test.keystrokes { + msg := tea.KeyMsg{ + Type: tea.KeyRunes, + Runes: []rune{key}, + Alt: false, + } + + _, cmd := state.Update(msg) + if cmd != nil { + t.Fatalf("Expected nil Cmd for '%v' (key %v), but got %v", key, k, cmd) + } + } + + observed := stripAnsiControlSequences(state.View()) + observations = append(observations, observed) + observedDatetime := state.clock.t.Format(time.RFC3339) + observedUnixtime := state.clock.t.Unix() + if observedDatetime != test.datetime { + t.Errorf("Fraction Timezones: Mismatched datetime for %v: expected %v but got %v", test.name, test.datetime, observedDatetime) + } + outputData = append( + outputData, + txtar.File{ + Name: fmt.Sprintf("%v (%v = %v)", test.name, observedDatetime, observedUnixtime), + Data: []byte(observed), + }, + ) + } + + archive := txtar.Archive{ + Comment: testData.Comment, + Files: outputData, + } + os.WriteFile(testDataFile, txtar.Format(&archive), 0666) + + for i, test := range tests { + var expected string = "" + if len(testData.Files) > 0 { + expected = stripAnsiControlSequencesAndNewline(testData.Files[i].Data) + } + observed := stripAnsiControlSequencesAndNewline(outputData[i].Data) + if expected != observed { + t.Errorf("Fraction Timezones: Mismatched %s: Check git diff %s", test.name, testDataFile) + } + } +} + func TestRightAlignment(t *testing.T) { testDataFile := "testdata/view/test-right-alignment.txt" testData, err := txtar.ParseFile(testDataFile) From 1ee0ce0d63a9891a482f771d5933dc0de891fb32 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:06 +1100 Subject: [PATCH 06/30] Prepare DST support: testdata/view/test-fractional-timezone-offsets.txt (original as at v0.7.0) --- .../view/test-fractional-timezone-offsets.txt | 229 ++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 testdata/view/test-fractional-timezone-offsets.txt diff --git a/testdata/view/test-fractional-timezone-offsets.txt b/testdata/view/test-fractional-timezone-offsets.txt new file mode 100644 index 0000000..beeadd3 --- /dev/null +++ b/testdata/view/test-fractional-timezone-offsets.txt @@ -0,0 +1,229 @@ +Check the following: +- Fractional timezones are displayed in the correct columns. +- Left & right navigation across fractional hours shifts the timelines correctly. +- Left & right navigation round-trip equals the starting point. +- Double-midnight for Cuba midnight DST end +- Crossing date boundaries + +-- Start time (2017-11-05T00:29:02Z = 1509841742) -- + + What time is it? + + πŸ•› (UTC) UTC 00:29, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun 05 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 06 + πŸ•‘ (IST) Israel 02:29, Sun 05 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 06 + πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 06 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05 + πŸ•– (CDT) US/Central 19:29, Sat 04 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05 + πŸ•— (CDT) Cuba 20:29, Sat 04 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 05 +-- Plus 1 hour (2017-11-05T00:29:02Z = 1509841742) -- + + What time is it? + + πŸ•› (UTC) UTC 00:29, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun 05 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 06 + πŸ•‘ (IST) Israel 02:29, Sun 05 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 06 + πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 06 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05 + πŸ•– (CDT) US/Central 19:29, Sat 04 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05 + πŸ•— (CDT) Cuba 20:29, Sat 04 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 05 +-- Minus 15 minutes (2017-11-05T00:29:02Z = 1509841742) -- + + What time is it? + + πŸ•› (UTC) UTC 00:29, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun 05 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 06 + πŸ•‘ (IST) Israel 02:29, Sun 05 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 06 + πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 06 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05 + πŸ•– (CDT) US/Central 19:29, Sat 04 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05 + πŸ•— (CDT) Cuba 20:29, Sat 04 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 05 +-- Return to start (2017-11-05T00:29:02Z = 1509841742) -- + + What time is it? + + πŸ•› (UTC) UTC 00:29, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun 05 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 06 + πŸ•‘ (IST) Israel 02:29, Sun 05 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 06 + πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 06 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05 + πŸ•– (CDT) US/Central 19:29, Sat 04 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05 + πŸ•— (CDT) Cuba 20:29, Sat 04 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 05 +-- Minus 1 hour, date changed (2017-11-05T00:29:02Z = 1509841742) -- + + What time is it? + + πŸ•› (UTC) UTC 00:29, Sat 04 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sat 04 + πŸ• (CET) Europe/Paris 01:29, Sat 04 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Sun 05 + πŸ•‘ (IST) Israel 02:29, Sat 04 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Sun 05 + πŸ•” (IST) Asia/Calcutta 05:59, Sat 04 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Sun 05 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sat 04 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sat 04 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sat 04 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Fri 03 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sat 04 + πŸ•– (CDT) US/Central 19:29, Fri 03 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sat 04 + πŸ•— (CDT) Cuba 20:29, Fri 03 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Fri 03 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sat 04 +-- Return to start (2017-11-05T00:29:02Z = 1509841742) -- + + What time is it? + + πŸ•› (UTC) UTC 00:29, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun 05 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 06 + πŸ•‘ (IST) Israel 02:29, Sun 05 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 06 + πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 06 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05 + πŸ•– (CDT) US/Central 19:29, Sat 04 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05 + πŸ•— (CDT) Cuba 20:29, Sat 04 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 05 From 8c2fc01a00e7a6994479680903adc0944c21c69d Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:07 +1100 Subject: [PATCH 07/30] Prepare DST support: testdata/view/test-fractional-timezone-offsets.txt (right-aligned e4e6d44) --- .../view/test-fractional-timezone-offsets.txt | 132 +++++++++--------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/testdata/view/test-fractional-timezone-offsets.txt b/testdata/view/test-fractional-timezone-offsets.txt index beeadd3..13853c9 100644 --- a/testdata/view/test-fractional-timezone-offsets.txt +++ b/testdata/view/test-fractional-timezone-offsets.txt @@ -9,221 +9,221 @@ Check the following: What time is it? - πŸ•› (UTC) UTC 00:29, Sun 05 + πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun 05 + πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:29, Sat 04 + πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:29, Sat 04 + πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 -- Plus 1 hour (2017-11-05T00:29:02Z = 1509841742) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sun 05 + πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun 05 + πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:29, Sat 04 + πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:29, Sat 04 + πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 -- Minus 15 minutes (2017-11-05T00:29:02Z = 1509841742) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sun 05 + πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun 05 + πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:29, Sat 04 + πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:29, Sat 04 + πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 -- Return to start (2017-11-05T00:29:02Z = 1509841742) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sun 05 + πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun 05 + πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:29, Sat 04 + πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:29, Sat 04 + πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 -- Minus 1 hour, date changed (2017-11-05T00:29:02Z = 1509841742) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sat 04 + πŸ•› (UTC) UTC 00:29, Sat Nov 04, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ• (CET) Europe/Paris 01:29, Sat 04 + πŸ• (CET) Europe/Paris 01:29, Sat Nov 04, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 05 - πŸ•‘ (IST) Israel 02:29, Sat 04 + πŸ•‘ (IST) Israel 02:29, Sat Nov 04, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Sun 05 - πŸ•” (IST) Asia/Calcutta 05:59, Sat 04 + πŸ•” (IST) Asia/Calcutta 05:59, Sat Nov 04, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 05 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sat 04 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sat Nov 04, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Sun 05 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sat 04 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sat Nov 04, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Sun 05 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sat 04 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Fri 03 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Fri Nov 03, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sat 04 - πŸ•– (CDT) US/Central 19:29, Fri 03 + πŸ•– (CDT) US/Central 19:29, Fri Nov 03, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sat 04 - πŸ•— (CDT) Cuba 20:29, Fri 03 + πŸ•— (CDT) Cuba 20:29, Fri Nov 03, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sat 04 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Fri 03 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Fri Nov 03, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sat 04 -- Return to start (2017-11-05T00:29:02Z = 1509841742) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sun 05 + πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun 05 + πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun 05 + πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:59, Sun 05 + πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sun 05 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat 04 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:29, Sat 04 + πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:29, Sat 04 + πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 From 6e49188962dbe02c7ecb2d48e1f3c470162f5d5e Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:08 +1100 Subject: [PATCH 08/30] Prepare DST support: testdata/view/test-fractional-timezone-offsets.txt (with regressions 0bdd6e2 and cb3ba9f) --- .../view/test-fractional-timezone-offsets.txt | 144 +++++++++--------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/testdata/view/test-fractional-timezone-offsets.txt b/testdata/view/test-fractional-timezone-offsets.txt index 13853c9..733e1fa 100644 --- a/testdata/view/test-fractional-timezone-offsets.txt +++ b/testdata/view/test-fractional-timezone-offsets.txt @@ -12,10 +12,10 @@ Check the following: πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 + πŸ• (CEST) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 + πŸ•‘ (IDT) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 @@ -42,188 +42,188 @@ Check the following: πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 --- Plus 1 hour (2017-11-05T00:29:02Z = 1509841742) -- +-- Plus 1 hour (2017-11-05T01:00:00Z = 1509843600) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 + πŸ• (UTC) UTC 01:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 + πŸ•‘ (CEST) Europe/Paris 02:00, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 + πŸ•’ (IDT) Israel 03:00, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 + πŸ•• (IST) Asia/Calcutta 06:30, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 - 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 - πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sun Nov 05, 2017 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 06 + πŸ•› (AEDT) Australia/Sydney 12:00, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 + πŸ•— (CDT) US/Central 20:00, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 + πŸ•˜ (CDT) Cuba 21:00, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 --- Minus 15 minutes (2017-11-05T00:29:02Z = 1509841742) -- +-- Minus 15 minutes (2017-11-05T01:00:00Z = 1509843600) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 + πŸ• (UTC) UTC 01:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 + πŸ•‘ (CEST) Europe/Paris 02:00, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 + πŸ•’ (IDT) Israel 03:00, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 + πŸ•• (IST) Asia/Calcutta 06:30, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 - 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 - πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 + πŸ•˜ (+0845) Australia/Eucla 09:45, Sun Nov 05, 2017 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 06 + πŸ•› (AEDT) Australia/Sydney 12:00, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 + πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 + πŸ•’ (HST) Pacific/Honolulu 15:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 + πŸ•— (CDT) US/Central 20:00, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 + πŸ•˜ (CDT) Cuba 21:00, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 --- Return to start (2017-11-05T00:29:02Z = 1509841742) -- +-- Return to start (2017-11-05T00:00:00Z = 1509840000) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 + πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 + πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 + πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 - 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 - πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 + πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 + πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 + πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 --- Minus 1 hour, date changed (2017-11-05T00:29:02Z = 1509841742) -- +-- Minus 1 hour, date changed (2017-11-04T23:00:00Z = 1509836400) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sat Nov 04, 2017 + πŸ•™ (UTC) UTC 23:00, Sat Nov 04, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ• (CET) Europe/Paris 01:29, Sat Nov 04, 2017 + πŸ•› (CEST) Europe/Paris 00:00, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 05 - πŸ•‘ (IST) Israel 02:29, Sat Nov 04, 2017 + πŸ• (IDT) Israel 01:00, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Sun 05 - πŸ•” (IST) Asia/Calcutta 05:59, Sat Nov 04, 2017 + πŸ•“ (IST) Asia/Calcutta 04:30, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 05 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sat Nov 04, 2017 - 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 - πŸ“† Sun 05 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sat Nov 04, 2017 + πŸ•– (+0845) Australia/Eucla 07:45, Sun Nov 05, 2017 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Sun 05 + πŸ•™ (AEDT) Australia/Sydney 10:00, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Sun 05 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sat Nov 04, 2017 + πŸ• (+14) Pacific/Kiritimati 13:00, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Fri Nov 03, 2017 + πŸ• (HST) Pacific/Honolulu 13:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sat 04 - πŸ•– (CDT) US/Central 19:29, Fri Nov 03, 2017 + πŸ•• (CDT) US/Central 18:00, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sat 04 - πŸ•— (CDT) Cuba 20:29, Fri Nov 03, 2017 + πŸ•– (CDT) Cuba 19:00, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sat 04 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Fri Nov 03, 2017 + πŸ•— (-03) America/Argentina/ComodRivadavia 20:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sat 04 --- Return to start (2017-11-05T00:29:02Z = 1509841742) -- +-- Return to start (2017-11-05T00:00:00Z = 1509840000) -- What time is it? - πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 + πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 + πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 + πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 - 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 - πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 + πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 + πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 + πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 From 9411b3c6e65cb945ab80082f514655f57c1731f9 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:09 +1100 Subject: [PATCH 09/30] Prepare DST support: view_test.go: Midnight DST support --- view_test.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/view_test.go b/view_test.go index 67906d1..b963cab 100644 --- a/view_test.go +++ b/view_test.go @@ -125,6 +125,64 @@ func TestDstStartDays(t *testing.T) { RunDstDaysTest(t, "Europe DST start", testDataFile, europeStartDst) } +func TestDstSpecialMidnights(t *testing.T) { + // The following are expressed in UTC, because the local date boundary is unusual: + cubaDstStart := time.Date(2017, time.March, 12, 5, 0, 0, 0, time.UTC) // 12 Mar Cuba missing midnight + cubaDstEnd := time.Date(2017, time.November, 5, 4, 0, 0, 0, time.UTC) // 5 Mar Cuba double midnight + + testDataFile := "testdata/view/test-dst-midnights.txt" + testData, err := txtar.ParseFile(testDataFile) + if err != nil { + t.Fatal(err) + } + + config, err := LoadDefaultConfig([]string{ + "UTC", // Z + "Cuba", // Z-5 (CST), Z-4 (CDT) + }) + if err != nil { + t.Fatal(err) + } + midnightTestZones := config.Zones[1:] + + tests := []struct { + name string + time time.Time + }{ + {"Start DST missing midnight", cubaDstStart}, + {"End DST double midnight", cubaDstEnd}, + } + + var outputData = make([]txtar.File, len(tests)) + for i, test := range tests { + state := model{ + zones: midnightTestZones, + clock: *NewClockTime(test.time), + isMilitary: true, + showDates: true, + } + observed := stripAnsiControlSequences(state.View()) + outputData[i] = txtar.File{ + Name: fmt.Sprintf("%v (%v = %v)", test.name, test.time.Format(time.RFC3339), test.time.Unix()), + Data: []byte(observed), + } + } + + archive := txtar.Archive{ + Comment: testData.Comment, + Files: outputData, + } + os.WriteFile(testDataFile, txtar.Format(&archive), 0666) + + for i, test := range tests { + observed := stripAnsiControlSequencesAndNewline(outputData[i].Data) + expected := stripAnsiControlSequencesAndNewline(testData.Files[i].Data) + if observed != expected { + t.Errorf("Midnight DST: Mismatched %s: Check git diff %s", test.name, testDataFile) + } + } +} + func TestFractionalTimezoneOffsets(t *testing.T) { testDataFile := "testdata/view/test-fractional-timezone-offsets.txt" testData, err := txtar.ParseFile(testDataFile) From e66bf8a15497adb594bf222edf15e229665f152c Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:10 +1100 Subject: [PATCH 10/30] Prepare DST support: testdata/view/test-dst-midnights.txt (original as at v0.7.0) --- testdata/view/test-dst-midnights.txt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 testdata/view/test-dst-midnights.txt diff --git a/testdata/view/test-dst-midnights.txt b/testdata/view/test-dst-midnights.txt new file mode 100644 index 0000000..a52cca6 --- /dev/null +++ b/testdata/view/test-dst-midnights.txt @@ -0,0 +1,20 @@ +-- Start DST missing midnight (2017-03-12T05:00:00Z = 1489294800) -- + + What time is it? + + πŸ•” (UTC) UTC 05:00, Sun 12 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 12 + πŸ• (CDT) Cuba 01:00, Sun 12 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 12 +-- End DST double midnight (2017-11-05T04:00:00Z = 1509854400) -- + + What time is it? + + πŸ•“ (UTC) UTC 04:00, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ•› (CDT) Cuba 00:00, Sun 05 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 05 From 1228d33fc6301591062401f529bfbdcdf645a100 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:11 +1100 Subject: [PATCH 11/30] Prepare DST support: testdata/view/test-dst-midnights.txt (right-aligned e4e6d44) --- testdata/view/test-dst-midnights.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testdata/view/test-dst-midnights.txt b/testdata/view/test-dst-midnights.txt index a52cca6..5803cfd 100644 --- a/testdata/view/test-dst-midnights.txt +++ b/testdata/view/test-dst-midnights.txt @@ -2,19 +2,19 @@ What time is it? - πŸ•” (UTC) UTC 05:00, Sun 12 + πŸ•” (UTC) UTC 05:00, Sun Mar 12, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 12 - πŸ• (CDT) Cuba 01:00, Sun 12 + πŸ• (CDT) Cuba 01:00, Sun Mar 12, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 12 -- End DST double midnight (2017-11-05T04:00:00Z = 1509854400) -- What time is it? - πŸ•“ (UTC) UTC 04:00, Sun 05 + πŸ•“ (UTC) UTC 04:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•› (CDT) Cuba 00:00, Sun 05 + πŸ•› (CDT) Cuba 00:00, Sun Nov 05, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 From dc43d37ce35a0123cba1ade88036b6f87c0a4d52 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:12 +1100 Subject: [PATCH 12/30] Prepare DST support: view_test.go: Local zone comparison --- view_test.go | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/view_test.go b/view_test.go index b963cab..7f9f48d 100644 --- a/view_test.go +++ b/view_test.go @@ -266,6 +266,124 @@ func TestFractionalTimezoneOffsets(t *testing.T) { } } +// Test all vertical alignments, from the perspectives of different local zones +func TestLocalTimezones(t *testing.T) { + testDataFile := "testdata/view/test-local-timezones.txt" + testData, err := txtar.ParseFile(testDataFile) + if err != nil { + t.Fatal(err) + } + + testGroups := [][]struct { + localZone string + localTime string + }{ + { + {"UTC", "2017-11-05T00:00:00Z"}, + {"Asia/Calcutta", "2017-11-05T05:30:00+05:30"}, + {"Cuba", "2017-11-04T20:00:00-04:00"}, + }, + { + {"UTC", "2017-11-06T00:30:00Z"}, + {"Asia/Calcutta", "2017-11-06T06:00:00+05:30"}, + {"Cuba", "2017-11-05T19:30:00-05:00"}, + }, + } + + displayZones := LoadDstTestZones(t) + var outputData = []txtar.File{} + for i, testGroup := range testGroups { + for j, test := range testGroup { + testTime, err := time.Parse(time.RFC3339, test.localTime) + if err != nil { + t.Fatalf("Could not parse test time configuration [%v][%v]: '%v'", i, j, test.localTime) + } + + localZoneAtTop := make([]*Zone, 0, len(displayZones) + 1) + for _, zone := range(displayZones) { + if zone.DbName == test.localZone { + // Copy localZone to the top of list to render all other zones relative to it + localZone := *zone + localZone.Name = "Local" + localZoneAtTop = append(localZoneAtTop, &localZone) + localZoneAtTop = append(localZoneAtTop, displayZones...) + break + } + } + if len(localZoneAtTop) == 0 { + t.Fatalf("Could not find displayable timezone for case [%v][%v]: '%v'", i, j, test.localTime) + } + + state := model{ + zones: localZoneAtTop, + clock: *NewClockTime(testTime), + isMilitary: true, + showDates: true, + } + + observed := stripAnsiControlSequences(state.View()) + outputData = append(outputData, txtar.File{ + Name: fmt.Sprintf("[%v][%v] %v (%v = %v)", i, j, test.localZone, testTime.Format(time.RFC3339), testTime.Unix()), + Data: []byte(observed), + }) + } + } + + archive := txtar.Archive{ + Comment: testData.Comment, + Files: outputData, + } + os.WriteFile(testDataFile, txtar.Format(&archive), 0666) + + var count = 0 + for i, testGroup := range testGroups { + // Implementation explained in the testData file: + comparisonColumns := make([]string, len(testGroup)) + + for j, test := range testGroup { + // Test for any changes + observed := stripAnsiControlSequencesAndNewline(outputData[count].Data) + expected := stripAnsiControlSequencesAndNewline(testData.Files[count].Data) + if observed != expected { + t.Errorf("Local Timezones: Unexpected result [%v][%v] for %v: Check git diff %v", i, j, test.localZone, testDataFile) + } + + // Test for expected properties (this is sensitive to the layout format) + hourIndex := 11 + localTime := test.localTime[hourIndex:hourIndex + 2] + if localTime[0] == '0' { + localTime = " " + localTime[1:] + } + localTime = " " + localTime + " " + + localLine := 4 + lines := strings.Split(observed, "\n") + columnIndex := strings.Index(lines[localLine], localTime) + if columnIndex < 0 { + t.Errorf("Local Timezones: Failed [%v][%v] for %v: Could not find local hour %v", i, j, test.localZone, localTime) + } else { + rowGap := 3 + column := strings.Builder{} + for l := localLine + rowGap; l < len(lines); l += rowGap { + line := lines[l] + column.WriteString(line[columnIndex:columnIndex + 3]) + } + comparisonColumns[j] = column.String() + } + + count = count + 1 + } + + for _, result := range comparisonColumns { + if result != comparisonColumns[0] { + t.Errorf("Local Timezones: Inconsistencies in group [%v]:\n%v", i, strings.Join(comparisonColumns, "\n")) + break + } + } + + } +} + func TestRightAlignment(t *testing.T) { testDataFile := "testdata/view/test-right-alignment.txt" testData, err := txtar.ParseFile(testDataFile) From cabdb0c30d987ccde30dc5892dd4a83da92e6322 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:13 +1100 Subject: [PATCH 13/30] Prepare DST support: testdata/view/test-local-timezones.txt (original as at v0.7.0) --- testdata/view/test-local-timezones.txt | 261 +++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 testdata/view/test-local-timezones.txt diff --git a/testdata/view/test-local-timezones.txt b/testdata/view/test-local-timezones.txt new file mode 100644 index 0000000..2c0ec71 --- /dev/null +++ b/testdata/view/test-local-timezones.txt @@ -0,0 +1,261 @@ +Test local timezones other than UTC, with UTC as a reference for consistency. +Checking: +- Fractional-hour timezones +- Daylight saving peculiarities + +How to read the results (this is the method used in view_test.go’s TestLocalTimezones): +- Numbered as [group][test] so within a [group] we check that all [test] are β€˜aligned’ +- Read the β€˜alignment’ by looking at the date-time in each test title and finding its column + within the test (be sure you look on the correct side of any date line), then check that all + the hours in the columns _below_ Local are the same for all tests within the group. + For example: + - First test [0][0] is timestamped midnight UTC, which is the first column on the left. + - Second test [0][1] is timestamped 5:30 am in India, which is the sixth column from the left. + - Third test [0][2] is timestamped 8:00 pm in Cuba, which is the 4th column from the right. + - These three columns should show the same hours vertically. +- Although there are other ways of checking it, these may be harder because of differences + caused by daylight-saving offsets on either side of midnight. + +Note: The expectation for test case [1][2] (Cuba) is an exceptional corner case, +because the DST-ending midnight is not the first hour of day, hence no πŸ“† icon. + +-- [0][0] UTC (2017-11-05T00:00:00Z = 1509840000) -- + + What time is it? + + πŸ•› Local 00:00, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ•› (UTC) UTC 00:00, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ• (CET) Europe/Paris 01:00, Sun 05 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 06 + πŸ•‘ (IST) Israel 02:00, Sun 05 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 06 + πŸ•” (IST) Asia/Calcutta 05:30, Sun 05 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 06 + πŸ•— (+0845) Australia/Eucla 08:45, Sun 05 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 05 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 05 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 06 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 04 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05 + πŸ•– (CDT) US/Central 19:00, Sat 04 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05 + πŸ•— (CDT) Cuba 20:00, Sat 04 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 04 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 05 +-- [0][1] Asia/Calcutta (2017-11-05T05:30:00+05:30 = 1509840000) -- + + What time is it? + + πŸ•” Local 05:30, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ•› (UTC) UTC 00:00, Sun 05 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05 + πŸ• (CET) Europe/Paris 01:00, Sun 05 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Sun 05 + πŸ•‘ (IST) Israel 02:00, Sun 05 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 05 + πŸ•” (IST) Asia/Calcutta 05:30, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ•— (+0845) Australia/Eucla 08:45, Sun 05 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 05 + 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 + πŸ“† Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 05 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 04 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Sun 05 + πŸ•– (CDT) US/Central 19:00, Sat 04 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05 + πŸ•— (CDT) Cuba 20:00, Sat 04 + 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + πŸ“† Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 04 + 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + πŸ“† Sun 05 +-- [0][2] Cuba (2017-11-04T20:00:00-04:00 = 1509840000) -- + + What time is it? + + πŸ•— Local 20:00, Sat 04 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sat 04 + πŸ•› (UTC) UTC 00:00, Sun 05 + 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 + πŸ“† Sun 05 + πŸ• (CET) Europe/Paris 01:00, Sun 05 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Sun 05 + πŸ•‘ (IST) Israel 02:00, Sun 05 + 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 + πŸ“† Sun 05 + πŸ•” (IST) Asia/Calcutta 05:30, Sun 05 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Sun 05 + πŸ•— (+0845) Australia/Eucla 08:45, Sun 05 + 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 + πŸ“† Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 05 + 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + πŸ“† Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 05 + 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 + πŸ“† Sun 05 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 04 + 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 + πŸ“† Sat 04 + πŸ•– (CDT) US/Central 19:00, Sat 04 + 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + πŸ“† Sat 04 + πŸ•— (CDT) Cuba 20:00, Sat 04 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 04 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Sun 05 +-- [1][0] UTC (2017-11-06T00:30:00Z = 1509928200) -- + + What time is it? + + πŸ•› Local 00:30, Mon 06 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Mon 06 + πŸ•› (UTC) UTC 00:30, Mon 06 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Mon 06 + πŸ• (CET) Europe/Paris 01:30, Mon 06 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Tue 07 + πŸ•‘ (IST) Israel 02:30, Mon 06 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Tue 07 + πŸ•• (IST) Asia/Calcutta 06:00, Mon 06 + 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 + πŸ“† Tue 07 + πŸ•˜ (+0845) Australia/Eucla 09:15, Mon 06 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Tue 07 + πŸ•™ (AEDT) Australia/Sydney 11:30, Mon 06 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Tue 07 + πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon 06 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Tue 07 + πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun 05 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 06 + πŸ•• (CDT) US/Central 18:30, Sun 05 + 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 + πŸ“† Mon 06 + πŸ•– (CDT) Cuba 19:30, Sun 05 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Mon 06 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun 05 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Mon 06 +-- [1][1] Asia/Calcutta (2017-11-06T06:00:00+05:30 = 1509928200) -- + + What time is it? + + πŸ•• Local 06:00, Mon 06 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Mon 06 + πŸ•› (UTC) UTC 00:30, Mon 06 + 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 + πŸ“† Mon 06 + πŸ• (CET) Europe/Paris 01:30, Mon 06 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Mon 06 + πŸ•‘ (IST) Israel 02:30, Mon 06 + 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + πŸ“† Mon 06 + πŸ•• (IST) Asia/Calcutta 06:00, Mon 06 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:15, Mon 06 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + πŸ“† Tue 07 + πŸ•™ (AEDT) Australia/Sydney 11:30, Mon 06 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Tue 07 + πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon 06 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Tue 07 + πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun 05 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 06 + πŸ•• (CDT) US/Central 18:30, Sun 05 + 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 + πŸ“† Mon 06 + πŸ•– (CDT) Cuba 19:30, Sun 05 + 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 + πŸ“† Mon 06 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun 05 + 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + πŸ“† Mon 06 +-- [1][2] Cuba (2017-11-05T19:30:00-05:00 = 1509928200) -- + + What time is it? + + πŸ•– Local 19:30, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ•› (UTC) UTC 00:30, Mon 06 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 06 + πŸ• (CET) Europe/Paris 01:30, Mon 06 + 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 + πŸ“† Mon 06 + πŸ•‘ (IST) Israel 02:30, Mon 06 + 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 + πŸ“† Mon 06 + πŸ•• (IST) Asia/Calcutta 06:00, Mon 06 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:15, Mon 06 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:30, Mon 06 + 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + πŸ“† Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon 06 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Mon 06 + πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun 05 + 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05 + πŸ•• (CDT) US/Central 18:30, Sun 05 + 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + πŸ“† Sun 05 + πŸ•– (CDT) Cuba 19:30, Sun 05 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun 05 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 06 From acb2291477989b7b0994a95fd16fd844430b60c1 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Thu, 10 Oct 2024 17:45:14 +1100 Subject: [PATCH 14/30] Prepare DST support: testdata/view/test-local-timezones.txt (right-aligned e4e6d44) --- testdata/view/test-local-timezones.txt | 144 ++++++++++++------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/testdata/view/test-local-timezones.txt b/testdata/view/test-local-timezones.txt index 2c0ec71..90e79ba 100644 --- a/testdata/view/test-local-timezones.txt +++ b/testdata/view/test-local-timezones.txt @@ -23,239 +23,239 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico What time is it? - πŸ•› Local 00:00, Sun 05 + πŸ•› Local 00:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•› (UTC) UTC 00:00, Sun 05 + πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:00, Sun 05 + πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:00, Sun 05 + πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:30, Sun 05 + πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•— (+0845) Australia/Eucla 08:45, Sun 05 + πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 04 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:00, Sat 04 + πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:00, Sat 04 + πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 -- [0][1] Asia/Calcutta (2017-11-05T05:30:00+05:30 = 1509840000) -- What time is it? - πŸ•” Local 05:30, Sun 05 + πŸ•” Local 05:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•› (UTC) UTC 00:00, Sun 05 + πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:00, Sun 05 + πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•‘ (IST) Israel 02:00, Sun 05 + πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 - πŸ•” (IST) Asia/Calcutta 05:30, Sun 05 + πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•— (+0845) Australia/Eucla 08:45, Sun 05 + πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 04 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:00, Sat 04 + πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:00, Sat 04 + πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 πŸ“† Sun 05 -- [0][2] Cuba (2017-11-04T20:00:00-04:00 = 1509840000) -- What time is it? - πŸ•— Local 20:00, Sat 04 + πŸ•— Local 20:00, Sat Nov 04, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ•› (UTC) UTC 00:00, Sun 05 + πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:00, Sun 05 + πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 05 - πŸ•‘ (IST) Israel 02:00, Sun 05 + πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Sun 05 - πŸ•” (IST) Asia/Calcutta 05:30, Sun 05 + πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Sun 05 - πŸ•— (+0845) Australia/Eucla 08:45, Sun 05 + πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 πŸ“† Sun 05 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun 05 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 πŸ“† Sun 05 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun 05 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat 04 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sat 04 - πŸ•– (CDT) US/Central 19:00, Sat 04 + πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 πŸ“† Sat 04 - πŸ•— (CDT) Cuba 20:00, Sat 04 + πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat 04 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 05 -- [1][0] UTC (2017-11-06T00:30:00Z = 1509928200) -- What time is it? - πŸ•› Local 00:30, Mon 06 + πŸ•› Local 00:30, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ•› (UTC) UTC 00:30, Mon 06 + πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ• (CET) Europe/Paris 01:30, Mon 06 + πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Tue 07 - πŸ•‘ (IST) Israel 02:30, Mon 06 + πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Tue 07 - πŸ•• (IST) Asia/Calcutta 06:00, Mon 06 + πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Tue 07 - πŸ•˜ (+0845) Australia/Eucla 09:15, Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Tue 07 - πŸ•™ (AEDT) Australia/Sydney 11:30, Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Tue 07 - πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Tue 07 - πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun 05 + πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•• (CDT) US/Central 18:30, Sun 05 + πŸ•• (CDT) US/Central 18:30, Sun Nov 05, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Mon 06 - πŸ•– (CDT) Cuba 19:30, Sun 05 + πŸ•– (CDT) Cuba 19:30, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Mon 06 -- [1][1] Asia/Calcutta (2017-11-06T06:00:00+05:30 = 1509928200) -- What time is it? - πŸ•• Local 06:00, Mon 06 + πŸ•• Local 06:00, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ•› (UTC) UTC 00:30, Mon 06 + πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Mon 06 - πŸ• (CET) Europe/Paris 01:30, Mon 06 + πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:30, Mon 06 + πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Mon 06 - πŸ•• (IST) Asia/Calcutta 06:00, Mon 06 + πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:15, Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Tue 07 - πŸ•™ (AEDT) Australia/Sydney 11:30, Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Tue 07 - πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Tue 07 - πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun 05 + πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 06 - πŸ•• (CDT) US/Central 18:30, Sun 05 + πŸ•• (CDT) US/Central 18:30, Sun Nov 05, 2017 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 πŸ“† Mon 06 - πŸ•– (CDT) Cuba 19:30, Sun 05 + πŸ•– (CDT) Cuba 19:30, Sun Nov 05, 2017 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 πŸ“† Mon 06 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 πŸ“† Mon 06 -- [1][2] Cuba (2017-11-05T19:30:00-05:00 = 1509928200) -- What time is it? - πŸ•– Local 19:30, Sun 05 + πŸ•– Local 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•› (UTC) UTC 00:30, Mon 06 + πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ• (CET) Europe/Paris 01:30, Mon 06 + πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:30, Mon 06 + πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 πŸ“† Mon 06 - πŸ•• (IST) Asia/Calcutta 06:00, Mon 06 + πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:15, Mon 06 + πŸ•˜ (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:30, Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun 05 + πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•• (CDT) US/Central 18:30, Sun 05 + πŸ•• (CDT) US/Central 18:30, Sun Nov 05, 2017 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 πŸ“† Sun 05 - πŸ•– (CDT) Cuba 19:30, Sun 05 + πŸ•– (CDT) Cuba 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun 05 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 From 5d058bb4813d9b969b8edc4fd2fd1a51609b05ff Mon Sep 17 00:00:00 2001 From: James Devenish Date: Fri, 11 Oct 2024 20:30:00 +1100 Subject: [PATCH 15/30] DST support Part 1: config.go: Use stable time (fix 0bdd6e2) --- config.go | 7 +++++-- config_env.go | 4 ++-- config_file.go | 4 ++-- config_file_test.go | 4 +++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/config.go b/config.go index f68205a..73650e7 100644 --- a/config.go +++ b/config.go @@ -20,6 +20,7 @@ import ( "fmt" "slices" "strings" + "time" ) // Keymaps represents the key mappings in the TOML file @@ -67,14 +68,16 @@ func LoadDefaultConfig(tzConfigs []string) (*Config, error) { } func LoadConfig(tomlFile string, tzConfigs []string) (*Config, error) { + now := time.Now() + // Apply config file first - fileConfig, fileError := LoadConfigFile(tomlFile) + fileConfig, fileError := LoadConfigFile(tomlFile, now) if fileError != nil { return nil, fmt.Errorf("File error: %w", fileError) } // Override with env var config - envConfig, envErr := LoadConfigEnv(tzConfigs) + envConfig, envErr := LoadConfigEnv(tzConfigs, now) if envErr != nil { return nil, fmt.Errorf("Env error: %w", envErr) } diff --git a/config_env.go b/config_env.go index 13f336f..96f7f47 100644 --- a/config_env.go +++ b/config_env.go @@ -24,7 +24,7 @@ import ( ) // LoadConfigEnv from environment -func LoadConfigEnv(tzConfigs []string) (*Config, error) { +func LoadConfigEnv(tzConfigs []string, now time.Time) (*Config, error) { conf := Config{} if len(tzConfigs) == 0 { @@ -41,7 +41,7 @@ func LoadConfigEnv(tzConfigs []string) (*Config, error) { // Add zones from TZ_LIST for i, zoneConf := range tzConfigs { - zone, err := ReadZoneFromString(time.Now(), zoneConf) + zone, err := ReadZoneFromString(now, zoneConf) if err != nil { return nil, err } diff --git a/config_file.go b/config_file.go index 4908436..9566ce0 100644 --- a/config_file.go +++ b/config_file.go @@ -67,7 +67,7 @@ func DefaultConfigFile() (*string, error) { return &configFilePath, nil } -func LoadConfigFile(configFilePath string) (*Config, error) { +func LoadConfigFile(configFilePath string, now time.Time) (*Config, error) { conf := Config{} configFile, err := os.ReadFile(configFilePath) @@ -85,7 +85,7 @@ func LoadConfigFile(configFilePath string) (*Config, error) { // Add zones from config file zones := make([]*Zone, len(config.Zones)) for i, zoneConf := range config.Zones { - zone, err := ReadZonesFromFile(time.Now(), zoneConf) + zone, err := ReadZonesFromFile(now, zoneConf) if err != nil { return nil, err } diff --git a/config_file_test.go b/config_file_test.go index 13f4011..caf3aaa 100644 --- a/config_file_test.go +++ b/config_file_test.go @@ -18,6 +18,7 @@ package main import ( "testing" + "time" ) func TestDefaultConfigFile(t *testing.T) { @@ -28,8 +29,9 @@ func TestDefaultConfigFile(t *testing.T) { } func TestExampleConfigFile(t *testing.T) { + now := time.Now() tomlPath := "./example-conf.toml" - config, err := LoadConfigFile(tomlPath) + config, err := LoadConfigFile(tomlPath, now) if err != nil { t.Fatalf("Could not read test config from %s: %v", tomlPath, err) } From 68ea4f7f4c4b25a313f39a6f599e439e2bc05297 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Fri, 11 Oct 2024 20:30:01 +1100 Subject: [PATCH 16/30] DST support Part 1: clock.go: AddHours: Preserve current minute (fix cb3ba9f) --- clock.go | 12 +- main_test.go | 15 +- .../view/test-fractional-timezone-offsets.txt | 140 +++++++++--------- testdata/view/test-local-timezones.txt | 24 +-- 4 files changed, 93 insertions(+), 98 deletions(-) diff --git a/clock.go b/clock.go index a099fd0..02508f2 100644 --- a/clock.go +++ b/clock.go @@ -38,18 +38,8 @@ func (c *Clock) AddDays(n int) { c.isRealTime = false } -// AddDays adds n days to the current date and clears the minutes +// AddDays adds n hours to the current date-time, keeping the minutes func (c *Clock) AddHours(n int) { - c.t = time.Date( - c.t.Year(), - c.t.Month(), - c.t.Day(), - c.t.Hour(), - 0, // Minutes set to 0 - 0, // Seconds set to 0 - 0, // Nanoseconds set to 0 - c.t.Location(), - ) c.t = c.t.Add(time.Hour * time.Duration(n)) c.isRealTime = false } diff --git a/main_test.go b/main_test.go index bfe8ad9..344f1b9 100644 --- a/main_test.go +++ b/main_test.go @@ -55,9 +55,9 @@ func getTimestampWithHour(hour int) time.Time { time.Now().Month(), time.Now().Day(), hour, - 0, // Minutes set to 0 - 0, // Seconds set to 0 - 0, // Nanoseconds set to 0 + 43, // Minutes + 59, // Seconds + 127, // Nanoseconds time.Now().Location(), ) } @@ -102,9 +102,11 @@ func TestUpdateIncHour(t *testing.T) { clock: *NewClockTime(getTimestampWithHour(test.startHour)), } - db := m.clock.Time().Day() + tb := m.clock.Time() + db := tb.Day() _, cmd := m.Update(msg) - da := m.clock.Time().Day() + ta := m.clock.Time() + da := ta.Day() if cmd != nil { t.Errorf("Expected nil Cmd, but got %v", cmd) @@ -117,6 +119,9 @@ func TestUpdateIncHour(t *testing.T) { if test.changesClockDateBy != 0 && da == db { t.Errorf("Expected date change of %d day, but got %d", test.changesClockDateBy, da-db) } + if ta.Minute() != tb.Minute() { + t.Errorf("Unexpected change of minute from '%s' to '%s'", tb, ta) + } } } diff --git a/testdata/view/test-fractional-timezone-offsets.txt b/testdata/view/test-fractional-timezone-offsets.txt index 733e1fa..2bdf276 100644 --- a/testdata/view/test-fractional-timezone-offsets.txt +++ b/testdata/view/test-fractional-timezone-offsets.txt @@ -42,188 +42,188 @@ Check the following: πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 --- Plus 1 hour (2017-11-05T01:00:00Z = 1509843600) -- +-- Plus 1 hour (2017-11-05T01:29:02Z = 1509845342) -- What time is it? - πŸ• (UTC) UTC 01:00, Sun Nov 05, 2017 + πŸ• (UTC) UTC 01:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•‘ (CEST) Europe/Paris 02:00, Sun Nov 05, 2017 + πŸ•‘ (CEST) Europe/Paris 02:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•’ (IDT) Israel 03:00, Sun Nov 05, 2017 + πŸ•’ (IDT) Israel 03:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•• (IST) Asia/Calcutta 06:30, Sun Nov 05, 2017 + πŸ•• (IST) Asia/Calcutta 06:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:45, Sun Nov 05, 2017 - 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 - πŸ“† Mon 06 - πŸ•› (AEDT) Australia/Sydney 12:00, Sun Nov 05, 2017 + πŸ•™ (+0845) Australia/Eucla 10:14, Sun Nov 05, 2017 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•› (AEDT) Australia/Sydney 12:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun Nov 05, 2017 + πŸ•’ (+14) Pacific/Kiritimati 15:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•’ (HST) Pacific/Honolulu 15:00, Sat Nov 04, 2017 + πŸ•’ (HST) Pacific/Honolulu 15:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•— (CDT) US/Central 20:00, Sat Nov 04, 2017 + πŸ•— (CDT) US/Central 20:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•˜ (CDT) Cuba 21:00, Sat Nov 04, 2017 + πŸ•˜ (CDT) Cuba 21:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat Nov 04, 2017 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 --- Minus 15 minutes (2017-11-05T01:00:00Z = 1509843600) -- +-- Minus 15 minutes (2017-11-05T01:29:02Z = 1509845342) -- What time is it? - πŸ• (UTC) UTC 01:00, Sun Nov 05, 2017 + πŸ• (UTC) UTC 01:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•‘ (CEST) Europe/Paris 02:00, Sun Nov 05, 2017 + πŸ•‘ (CEST) Europe/Paris 02:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•’ (IDT) Israel 03:00, Sun Nov 05, 2017 + πŸ•’ (IDT) Israel 03:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•• (IST) Asia/Calcutta 06:30, Sun Nov 05, 2017 + πŸ•• (IST) Asia/Calcutta 06:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:45, Sun Nov 05, 2017 - 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 - πŸ“† Mon 06 - πŸ•› (AEDT) Australia/Sydney 12:00, Sun Nov 05, 2017 + πŸ•™ (+0845) Australia/Eucla 10:14, Sun Nov 05, 2017 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•› (AEDT) Australia/Sydney 12:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•’ (+14) Pacific/Kiritimati 15:00, Sun Nov 05, 2017 + πŸ•’ (+14) Pacific/Kiritimati 15:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•’ (HST) Pacific/Honolulu 15:00, Sat Nov 04, 2017 + πŸ•’ (HST) Pacific/Honolulu 15:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•— (CDT) US/Central 20:00, Sat Nov 04, 2017 + πŸ•— (CDT) US/Central 20:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•˜ (CDT) Cuba 21:00, Sat Nov 04, 2017 + πŸ•˜ (CDT) Cuba 21:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:00, Sat Nov 04, 2017 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 --- Return to start (2017-11-05T00:00:00Z = 1509840000) -- +-- Return to start (2017-11-05T00:29:02Z = 1509841742) -- What time is it? - πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• (CEST) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ (IDT) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 + πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 - 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 - πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 + πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 + πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 --- Minus 1 hour, date changed (2017-11-04T23:00:00Z = 1509836400) -- +-- Minus 1 hour, date changed (2017-11-04T23:29:02Z = 1509838142) -- What time is it? - πŸ•™ (UTC) UTC 23:00, Sat Nov 04, 2017 + πŸ•™ (UTC) UTC 23:29, Sat Nov 04, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ•› (CEST) Europe/Paris 00:00, Sun Nov 05, 2017 + πŸ•› (CEST) Europe/Paris 00:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 05 - πŸ• (IDT) Israel 01:00, Sun Nov 05, 2017 + πŸ• (IDT) Israel 01:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Sun 05 - πŸ•“ (IST) Asia/Calcutta 04:30, Sun Nov 05, 2017 + πŸ•“ (IST) Asia/Calcutta 04:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 05 - πŸ•– (+0845) Australia/Eucla 07:45, Sun Nov 05, 2017 - 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 - πŸ“† Sun 05 - πŸ•™ (AEDT) Australia/Sydney 10:00, Sun Nov 05, 2017 + πŸ•— (+0845) Australia/Eucla 08:14, Sun Nov 05, 2017 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Sun 05 + πŸ•™ (AEDT) Australia/Sydney 10:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Sun 05 - πŸ• (+14) Pacific/Kiritimati 13:00, Sun Nov 05, 2017 + πŸ• (+14) Pacific/Kiritimati 13:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ• (HST) Pacific/Honolulu 13:00, Sat Nov 04, 2017 + πŸ• (HST) Pacific/Honolulu 13:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sat 04 - πŸ•• (CDT) US/Central 18:00, Sat Nov 04, 2017 + πŸ•• (CDT) US/Central 18:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sat 04 - πŸ•– (CDT) Cuba 19:00, Sat Nov 04, 2017 + πŸ•– (CDT) Cuba 19:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sat 04 - πŸ•— (-03) America/Argentina/ComodRivadavia 20:00, Sat Nov 04, 2017 + πŸ•— (-03) America/Argentina/ComodRivadavia 20:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sat 04 --- Return to start (2017-11-05T00:00:00Z = 1509840000) -- +-- Return to start (2017-11-05T00:29:02Z = 1509841742) -- What time is it? - πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• (CEST) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ (IDT) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 + πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 - 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 - πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 + πŸ•˜ (+0845) Australia/Eucla 09:14, Sun Nov 05, 2017 + 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:29, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 + πŸ•‘ (+14) Pacific/Kiritimati 14:29, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 + πŸ•‘ (HST) Pacific/Honolulu 14:29, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 + πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 + πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 diff --git a/testdata/view/test-local-timezones.txt b/testdata/view/test-local-timezones.txt index 90e79ba..db1267a 100644 --- a/testdata/view/test-local-timezones.txt +++ b/testdata/view/test-local-timezones.txt @@ -29,10 +29,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 @@ -69,10 +69,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 @@ -109,10 +109,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 05 - πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Sun 05 πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 @@ -149,10 +149,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• (CEST) Europe/Paris 01:30, Mon Nov 06, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Tue 07 - πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ (IDT) Israel 02:30, Mon Nov 06, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Tue 07 πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 @@ -189,10 +189,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Mon 06 - πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• (CEST) Europe/Paris 01:30, Mon Nov 06, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ (IDT) Israel 02:30, Mon Nov 06, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Mon 06 πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 @@ -229,10 +229,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• (CEST) Europe/Paris 01:30, Mon Nov 06, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ (IDT) Israel 02:30, Mon Nov 06, 2017 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 πŸ“† Mon 06 πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 From 41ec3057de0306d21f3539a235dee1f78eade448 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Fri, 11 Oct 2024 20:30:02 +1100 Subject: [PATCH 17/30] DST support Part 2: view.go: Rename currentTime to timeInZone --- view.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view.go b/view.go index 8e7ce1b..0126ba7 100644 --- a/view.go +++ b/view.go @@ -52,11 +52,11 @@ func (m model) View() string { for zi, zone := range m.zones { hours := strings.Builder{} dates := strings.Builder{} - currentTime := zone.currentTime(m.clock.t) + timeInZone := zone.currentTime(m.clock.t) startHour := 0 if zi > 0 { - startHour = (currentTime.Hour() - m.zones[0].currentTime(m.clock.t).Hour()) % 24 + startHour = (timeInZone.Hour() - m.zones[0].currentTime(m.clock.t).Hour()) % 24 } dateChanged := false From f7a214735f4631c5d0e926ce2b3f41a23cffccb2 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Fri, 11 Oct 2024 20:30:03 +1100 Subject: [PATCH 18/30] DST support Part 2: view.go: Major DST implementation (breaking changes, fix 092a39a) and +/-/0 keys for minute navigation (fix cb3ba9f) --- clock.go | 6 ++ config.go | 25 +++++ config_file.go | 3 + example-conf.toml | 4 + main.go | 18 ++++ testdata/view/test-dst-end-days.txt | 10 +- testdata/view/test-dst-midnights.txt | 8 +- testdata/view/test-dst-start-days.txt | 8 +- .../view/test-fractional-timezone-offsets.txt | 58 ++++++------ testdata/view/test-local-timezones.txt | 16 ++-- view.go | 94 ++++++++++++------- view_test.go | 2 +- 12 files changed, 165 insertions(+), 87 deletions(-) diff --git a/clock.go b/clock.go index 02508f2..ff60f8d 100644 --- a/clock.go +++ b/clock.go @@ -44,6 +44,12 @@ func (c *Clock) AddHours(n int) { c.isRealTime = false } +// AddMinutes adds n minutes to the current date-time, keeping the seconds +func (c *Clock) AddMinutes(n int) { + c.t = c.t.Add(time.Minute * time.Duration(n)) + c.isRealTime = false +} + // Get the wrapped time.Time struct func (c *Clock) Time() time.Time { return c.t diff --git a/config.go b/config.go index 73650e7..073fb42 100644 --- a/config.go +++ b/config.go @@ -25,6 +25,9 @@ import ( // Keymaps represents the key mappings in the TOML file type Keymaps struct { + PrevMinute []string + NextMinute []string + ZeroMinute []string PrevHour []string NextHour []string PrevDay []string @@ -46,6 +49,9 @@ type Config struct { // Function to provide default values for the Config struct var DefaultKeymaps = Keymaps{ + PrevMinute: []string{"-"}, + NextMinute: []string{"+"}, + ZeroMinute: []string{"0"}, PrevHour: []string{"h", "left"}, NextHour: []string{"l", "right"}, PrevDay: []string{"H", "shift+left", "pgup", "shift+up", "ctrl+u"}, @@ -104,6 +110,18 @@ func LoadConfig(tomlFile string, tzConfigs []string) (*Config, error) { logger.Printf("Merged zones: %s", mergedConfig.Zones) // Merge Keymaps + if len(fileConfig.Keymaps.PrevMinute) > 0 { + mergedConfig.Keymaps.PrevMinute = fileConfig.Keymaps.PrevMinute + } + + if len(fileConfig.Keymaps.NextMinute) > 0 { + mergedConfig.Keymaps.NextMinute = fileConfig.Keymaps.NextMinute + } + + if len(fileConfig.Keymaps.ZeroMinute) > 0 { + mergedConfig.Keymaps.ZeroMinute = fileConfig.Keymaps.ZeroMinute + } + if len(fileConfig.Keymaps.PrevHour) > 0 { mergedConfig.Keymaps.PrevHour = fileConfig.Keymaps.PrevHour } @@ -140,11 +158,18 @@ func LoadConfig(tomlFile string, tzConfigs []string) (*Config, error) { mergedConfig.Keymaps.Now = fileConfig.Keymaps.Now } + if len(fileConfig.Keymaps.Help) > 0 { + mergedConfig.Keymaps.Help = fileConfig.Keymaps.Help + } + if len(fileConfig.Keymaps.Quit) > 0 { mergedConfig.Keymaps.Quit = fileConfig.Keymaps.Quit } allKeymaps := [][]string { + mergedConfig.Keymaps.PrevMinute, + mergedConfig.Keymaps.NextMinute, + mergedConfig.Keymaps.ZeroMinute, mergedConfig.Keymaps.PrevHour, mergedConfig.Keymaps.NextHour, mergedConfig.Keymaps.PrevDay, diff --git a/config_file.go b/config_file.go index 9566ce0..d5dc080 100644 --- a/config_file.go +++ b/config_file.go @@ -24,6 +24,9 @@ type ConfigFileZone struct { // Keymaps represents the key mappings in the TOML file type ConfigFileKeymaps struct { + PrevMinute []string `toml:"prev_minute"` + NextMinute []string `toml:"next_minute"` + ZeroMinute []string `toml:"zero_minute"` PrevHour []string `toml:"prev_hour"` NextHour []string `toml:"next_hour"` PrevDay []string `toml:"prev_day"` diff --git a/example-conf.toml b/example-conf.toml index 155dfbd..f5399c9 100644 --- a/example-conf.toml +++ b/example-conf.toml @@ -15,6 +15,9 @@ id = "UTC" name = "UTC" [keymaps] +prev_minute = ["-"] +next_minute = ["+"] +zero_minute = ["0"] prev_hour = ["h", "left"] next_hour = ["l", "right"] prev_day = ["k", "up"] @@ -24,4 +27,5 @@ next_week = ["n", ">"] toggle_date = ["d"] open_web = ["o", "x"] now = ["t"] +help = ["f1"] quit = ["q", "esc", "ctrl+c"] diff --git a/main.go b/main.go index 00eb8c1..6987b4e 100644 --- a/main.go +++ b/main.go @@ -107,6 +107,24 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case match(key, m.keymaps.Quit): return m, tea.Quit + case match(key, m.keymaps.PrevMinute): + m.clock.AddMinutes(-1) + + case match(key, m.keymaps.NextMinute): + m.clock.AddMinutes(1) + + case match(key, m.keymaps.ZeroMinute): + m.clock = *NewClockTime(time.Date( + m.clock.t.Year(), + m.clock.t.Month(), + m.clock.t.Day(), + m.clock.t.Hour(), + 0, + 0, + 0, + m.clock.t.Location(), + )) + case match(key, m.keymaps.PrevHour): m.clock.AddHours(-1) diff --git a/testdata/view/test-dst-end-days.txt b/testdata/view/test-dst-end-days.txt index 26c040a..8bad2d7 100644 --- a/testdata/view/test-dst-end-days.txt +++ b/testdata/view/test-dst-end-days.txt @@ -25,7 +25,7 @@ This checks the following requirements: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 πŸ•‘ (CEST) Europe/Paris 02:00, Sun Oct 27, 2024 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 28 πŸ•’ (IDT) Israel 03:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 @@ -62,8 +62,8 @@ This checks the following requirements: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 πŸ•‘ (CEST) Europe/Paris 02:00, Sun Oct 27, 2024 - 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 - πŸ“† Mon 28 + 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 28 πŸ•‘ (IDT) Israel 02:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 @@ -99,7 +99,7 @@ This checks the following requirements: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 πŸ•’ (CEST) Europe/Paris 03:00, Sun Oct 27, 2024 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 28 πŸ•“ (IDT) Israel 04:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 @@ -213,7 +213,7 @@ This checks the following requirements: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Sun 27 πŸ•“ (IDT) Israel 04:00, Sat Oct 26, 2024 - 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 + 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 1 πŸ“† Sun 27 πŸ•• (IST) Asia/Calcutta 06:30, Sat Oct 26, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 diff --git a/testdata/view/test-dst-midnights.txt b/testdata/view/test-dst-midnights.txt index 5803cfd..94df593 100644 --- a/testdata/view/test-dst-midnights.txt +++ b/testdata/view/test-dst-midnights.txt @@ -6,8 +6,8 @@ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 12 πŸ• (CDT) Cuba 01:00, Sun Mar 12, 2017 - 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - πŸ“† Sun 12 + 19 20 21 22 23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + -- End DST double midnight (2017-11-05T04:00:00Z = 1509854400) -- What time is it? @@ -16,5 +16,5 @@ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 πŸ•› (CDT) Cuba 00:00, Sun Nov 05, 2017 - 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - πŸ“† Sun 05 + 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05πŸ“† Sun 05 diff --git a/testdata/view/test-dst-start-days.txt b/testdata/view/test-dst-start-days.txt index 66d449c..9c5797a 100644 --- a/testdata/view/test-dst-start-days.txt +++ b/testdata/view/test-dst-start-days.txt @@ -25,7 +25,7 @@ This checks the following requirements: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 31 πŸ•’ (CEST) Europe/Paris 03:00, Sun Mar 31, 2024 - 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 01 πŸ•“ (IDT) Israel 04:00, Sun Mar 31, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 @@ -62,8 +62,8 @@ This checks the following requirements: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 31 πŸ• (CEST) Europe/Paris 01:00, Sun Mar 31, 2024 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 - πŸ“† Mon 01 + 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 01 πŸ•’ (IDT) Israel 03:00, Sun Mar 31, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 01 @@ -99,7 +99,7 @@ This checks the following requirements: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 31 πŸ•“ (CEST) Europe/Paris 04:00, Sun Mar 31, 2024 - 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 01 πŸ•” (IDT) Israel 05:00, Sun Mar 31, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 diff --git a/testdata/view/test-fractional-timezone-offsets.txt b/testdata/view/test-fractional-timezone-offsets.txt index 2bdf276..a000345 100644 --- a/testdata/view/test-fractional-timezone-offsets.txt +++ b/testdata/view/test-fractional-timezone-offsets.txt @@ -34,11 +34,11 @@ Check the following: 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 - 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05 πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 - 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - πŸ“† Sun 05 + 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05πŸ“† Sun 05 πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -71,49 +71,49 @@ Check the following: 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 πŸ•— (CDT) US/Central 20:29, Sat Nov 04, 2017 - 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05 πŸ•˜ (CDT) Cuba 21:29, Sat Nov 04, 2017 - 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - πŸ“† Sun 05 + 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05πŸ“† Sun 05 πŸ•™ (-03) America/Argentina/ComodRivadavia 22:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 --- Minus 15 minutes (2017-11-05T01:29:02Z = 1509845342) -- +-- Minus 15 minutes (2017-11-05T01:14:02Z = 1509844442) -- What time is it? - πŸ• (UTC) UTC 01:29, Sun Nov 05, 2017 + πŸ• (UTC) UTC 01:14, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•‘ (CEST) Europe/Paris 02:29, Sun Nov 05, 2017 + πŸ•‘ (CEST) Europe/Paris 02:14, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•’ (IDT) Israel 03:29, Sun Nov 05, 2017 + πŸ•’ (IDT) Israel 03:14, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•• (IST) Asia/Calcutta 06:59, Sun Nov 05, 2017 + πŸ•• (IST) Asia/Calcutta 06:44, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•™ (+0845) Australia/Eucla 10:14, Sun Nov 05, 2017 - 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 - πŸ“† Mon 06 - πŸ•› (AEDT) Australia/Sydney 12:29, Sun Nov 05, 2017 + πŸ•˜ (+0845) Australia/Eucla 09:59, Sun Nov 05, 2017 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 06 + πŸ•› (AEDT) Australia/Sydney 12:14, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•’ (+14) Pacific/Kiritimati 15:29, Sun Nov 05, 2017 + πŸ•’ (+14) Pacific/Kiritimati 15:14, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•’ (HST) Pacific/Honolulu 15:29, Sat Nov 04, 2017 + πŸ•’ (HST) Pacific/Honolulu 15:14, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•— (CDT) US/Central 20:29, Sat Nov 04, 2017 - 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ•— (CDT) US/Central 20:14, Sat Nov 04, 2017 + 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05 - πŸ•˜ (CDT) Cuba 21:29, Sat Nov 04, 2017 - 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - πŸ“† Sun 05 - πŸ•™ (-03) America/Argentina/ComodRivadavia 22:29, Sat Nov 04, 2017 + πŸ•˜ (CDT) Cuba 21:14, Sat Nov 04, 2017 + 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05πŸ“† Sun 05 + πŸ•™ (-03) America/Argentina/ComodRivadavia 22:14, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 -- Return to start (2017-11-05T00:29:02Z = 1509841742) -- @@ -145,11 +145,11 @@ Check the following: 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 - 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05 πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 - 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - πŸ“† Sun 05 + 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05πŸ“† Sun 05 πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -219,11 +219,11 @@ Check the following: 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 - 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05 πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 - 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - πŸ“† Sun 05 + 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05πŸ“† Sun 05 πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 diff --git a/testdata/view/test-local-timezones.txt b/testdata/view/test-local-timezones.txt index db1267a..f0527ff 100644 --- a/testdata/view/test-local-timezones.txt +++ b/testdata/view/test-local-timezones.txt @@ -51,11 +51,11 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 - 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05 πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 - 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - πŸ“† Sun 05 + 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05πŸ“† Sun 05 πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -91,11 +91,11 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 - 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + 14 15 16 17 18 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 πŸ“† Sun 05 πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 - 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - πŸ“† Sun 05 + 15 16 17 18 19 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05πŸ“† Sun 05 πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 πŸ“† Sun 05 @@ -251,8 +251,8 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 πŸ•• (CDT) US/Central 18:30, Sun Nov 05, 2017 - 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 - πŸ“† Sun 05 + 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + πŸ“† Sun 05 πŸ•– (CDT) Cuba 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 diff --git a/view.go b/view.go index 0126ba7..2723221 100644 --- a/view.go +++ b/view.go @@ -21,6 +21,7 @@ import ( "os" "strconv" "strings" + "time" "github.com/muesli/termenv" xterm "golang.org/x/term" @@ -48,25 +49,34 @@ func (m model) View() string { } } + midnight := time.Date( + m.clock.t.Year(), + m.clock.t.Month(), + m.clock.t.Day(), + 0, // Hours + m.clock.t.Minute(), + 0, // Seconds + 0, // Nanoseconds + m.clock.t.Location(), + ) + midnightOffset := time.Duration(m.clock.t.UnixNano() - midnight.UnixNano()) + cursorColumn := int(midnightOffset / time.Hour) + // Show hours for each zone - for zi, zone := range m.zones { + for _, zone := range m.zones { hours := strings.Builder{} dates := strings.Builder{} timeInZone := zone.currentTime(m.clock.t) - - startHour := 0 - if zi > 0 { - startHour = (timeInZone.Hour() - m.zones[0].currentTime(m.clock.t).Hour()) % 24 - } + midnightInZone := timeInZone.Add(-midnightOffset) dateChanged := false - for i := startHour; i < startHour+24; i++ { - hour := ((i % 24) + 24) % 24 // mod 24 + for column := 0; column < 24; column++ { + hour := midnightInZone.Add(time.Duration(column) * time.Hour).Hour() out := termenv.String(fmt.Sprintf("%2d", hour)) out = out.Foreground(term.Color(hourColorCode(hour))) // Cursor - if m.clock.t.Hour() == i-startHour { + if column == cursorColumn { out = out.Background(term.Color(hourColorCode(hour))) if hasDarkBackground { out = out.Foreground(term.Color("#262626")).Bold() @@ -113,36 +123,48 @@ func (m model) View() string { return s } -// Generate the string -func generateKeymapString(k Keymaps) string { - return fmt.Sprintf(", %s/%s: hours, %s/%s: days, %s/%s: weeks, %s: toggle date, %s: now, %s: open in web", - // Only use the first of each mapping - k.PrevHour[0], k.NextHour[0], - k.PrevDay[0], k.NextDay[0], - k.PrevWeek[0], k.NextWeek[0], - k.ToggleDate[0], - k.Now[0], - k.OpenWeb[0], - ) +// Generate the help lines +func generateKeymapStrings(k Keymaps, showAll bool) []string { + helpKey := fmt.Sprintf("%s: help", k.Help[0]) + quitKey := fmt.Sprintf("%s: quit", k.Quit[0]) + + if showAll { + delimiter := ", " + return []string { + strings.Join( + []string { + helpKey, + fmt.Sprintf("%s/%s/%s: minutes", k.PrevMinute[0], k.NextMinute[0], k.ZeroMinute[0]), + fmt.Sprintf("%s/%s: hours", k.PrevHour[0], k.NextHour[0]), + fmt.Sprintf("%s/%s: days", k.PrevDay[0], k.NextDay[0]), + fmt.Sprintf("%s/%s: weeks", k.PrevWeek[0], k.NextWeek[0]), + fmt.Sprintf("%s: go to now", k.Now[0]), + }, + delimiter, + ), + strings.Join( + []string { + quitKey, + fmt.Sprintf("%s: toggle dates", k.ToggleDate[0]), + fmt.Sprintf("%s: open in web", k.OpenWeb[0]), + }, + delimiter, + ), + } + } else { + return []string { + helpKey, + quitKey, + } + } } func status(m model) string { - var text string + var text []string = generateKeymapStrings(m.keymaps, m.showHelp) - helpPrefix := " q: quit, ?: help" - - if m.showHelp { - text = helpPrefix + generateKeymapString(m.keymaps) - } else { - text = helpPrefix - } - - for { - text += " " - if len(text) > UIWidth { - text = text[0:UIWidth] - break - } + backgroundPadding := strings.Repeat(" ", UIWidth) + for i, line := range text { + text[i] = (" " + line + backgroundPadding)[:UIWidth] } color := "#939183" @@ -150,7 +172,7 @@ func status(m model) string { color = "#605C5A" } - status := termenv.String(text).Foreground(term.Color(color)) + status := termenv.String(strings.Join(text, "\n")).Foreground(term.Color(color)) return status.String() } diff --git a/view_test.go b/view_test.go index 7f9f48d..993ece0 100644 --- a/view_test.go +++ b/view_test.go @@ -197,7 +197,7 @@ func TestFractionalTimezoneOffsets(t *testing.T) { }{ {"Start time", "2017-11-05T00:29:02Z", ""}, {"Plus 1 hour", "2017-11-05T01:29:02Z", "l"}, - {"Minus 15 minutes", "2017-11-05T01:14:02Z", "---------------"}, // @todo implement new keys + {"Minus 15 minutes", "2017-11-05T01:14:02Z", "---------------"}, {"Return to start", "2017-11-05T00:29:02Z", "HL<>+++++++++++++++h"}, {"Minus 1 hour, date changed", "2017-11-04T23:29:02Z", "h"}, {"Return to start", "2017-11-05T00:29:02Z", "l"}, From de15e5e333c8514d02865d380aec2ce4cfb2ae5e Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sat, 12 Oct 2024 11:42:09 +1100 Subject: [PATCH 19/30] DST support Part 3: view.go: DST start/end visual indicators --- testdata/view/test-dst-end-days.txt | 8 ++--- testdata/view/test-dst-midnights.txt | 4 +-- testdata/view/test-dst-start-days.txt | 8 ++--- .../view/test-fractional-timezone-offsets.txt | 20 ++++++------- testdata/view/test-local-timezones.txt | 14 ++++----- view.go | 30 ++++++++++++------- 6 files changed, 47 insertions(+), 37 deletions(-) diff --git a/testdata/view/test-dst-end-days.txt b/testdata/view/test-dst-end-days.txt index 8bad2d7..e80763e 100644 --- a/testdata/view/test-dst-end-days.txt +++ b/testdata/view/test-dst-end-days.txt @@ -26,7 +26,7 @@ This checks the following requirements: πŸ“† Sun 27 πŸ•‘ (CEST) Europe/Paris 02:00, Sun Oct 27, 2024 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 - πŸ“† Mon 28 + β‰ DST πŸ“† Mon 28 πŸ•’ (IDT) Israel 03:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 @@ -63,7 +63,7 @@ This checks the following requirements: πŸ“† Sun 27 πŸ•‘ (CEST) Europe/Paris 02:00, Sun Oct 27, 2024 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 - πŸ“† Mon 28 + β‰ DST πŸ“† Mon 28 πŸ•‘ (IDT) Israel 02:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 @@ -100,7 +100,7 @@ This checks the following requirements: πŸ“† Sun 27 πŸ•’ (CEST) Europe/Paris 03:00, Sun Oct 27, 2024 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 - πŸ“† Mon 28 + β‰ DST πŸ“† Mon 28 πŸ•“ (IDT) Israel 04:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 @@ -214,7 +214,7 @@ This checks the following requirements: πŸ“† Sun 27 πŸ•“ (IDT) Israel 04:00, Sat Oct 26, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 1 - πŸ“† Sun 27 + πŸ“† Sun 27β‰ DST πŸ•• (IST) Asia/Calcutta 06:30, Sat Oct 26, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 27 diff --git a/testdata/view/test-dst-midnights.txt b/testdata/view/test-dst-midnights.txt index 94df593..d746b0b 100644 --- a/testdata/view/test-dst-midnights.txt +++ b/testdata/view/test-dst-midnights.txt @@ -7,7 +7,7 @@ πŸ“† Sun 12 πŸ• (CDT) Cuba 01:00, Sun Mar 12, 2017 19 20 21 22 23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - + =DST -- End DST double midnight (2017-11-05T04:00:00Z = 1509854400) -- What time is it? @@ -17,4 +17,4 @@ πŸ“† Sun 05 πŸ•› (CDT) Cuba 00:00, Sun Nov 05, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05 + πŸ“† Sun 05πŸ“† Sun 05β‰ DST diff --git a/testdata/view/test-dst-start-days.txt b/testdata/view/test-dst-start-days.txt index 9c5797a..0faf9aa 100644 --- a/testdata/view/test-dst-start-days.txt +++ b/testdata/view/test-dst-start-days.txt @@ -26,7 +26,7 @@ This checks the following requirements: πŸ“† Sun 31 πŸ•’ (CEST) Europe/Paris 03:00, Sun Mar 31, 2024 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 - πŸ“† Mon 01 + =DST πŸ“† Mon 01 πŸ•“ (IDT) Israel 04:00, Sun Mar 31, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 01 @@ -63,7 +63,7 @@ This checks the following requirements: πŸ“† Sun 31 πŸ• (CEST) Europe/Paris 01:00, Sun Mar 31, 2024 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 - πŸ“† Mon 01 + =DST πŸ“† Mon 01 πŸ•’ (IDT) Israel 03:00, Sun Mar 31, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 01 @@ -100,7 +100,7 @@ This checks the following requirements: πŸ“† Sun 31 πŸ•“ (CEST) Europe/Paris 04:00, Sun Mar 31, 2024 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 - πŸ“† Mon 01 + =DST πŸ“† Mon 01 πŸ•” (IDT) Israel 05:00, Sun Mar 31, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 01 @@ -177,7 +177,7 @@ This checks the following requirements: πŸ“† Sat 30 πŸ•“ (IDT) Israel 04:00, Fri Mar 29, 2024 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 - πŸ“† Sat 30 + =DST πŸ“† Sat 30 πŸ•• (IST) Asia/Calcutta 06:30, Fri Mar 29, 2024 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sat 30 diff --git a/testdata/view/test-fractional-timezone-offsets.txt b/testdata/view/test-fractional-timezone-offsets.txt index a000345..5354390 100644 --- a/testdata/view/test-fractional-timezone-offsets.txt +++ b/testdata/view/test-fractional-timezone-offsets.txt @@ -35,10 +35,10 @@ Check the following: πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05 + πŸ“† Sun 05πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -72,10 +72,10 @@ Check the following: πŸ“† Sun 05 πŸ•— (CDT) US/Central 20:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•˜ (CDT) Cuba 21:29, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05 + πŸ“† Sun 05πŸ“† Sun 05β‰ DST πŸ•™ (-03) America/Argentina/ComodRivadavia 22:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -109,10 +109,10 @@ Check the following: πŸ“† Sun 05 πŸ•— (CDT) US/Central 20:14, Sat Nov 04, 2017 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•˜ (CDT) Cuba 21:14, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05 + πŸ“† Sun 05πŸ“† Sun 05β‰ DST πŸ•™ (-03) America/Argentina/ComodRivadavia 22:14, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -146,10 +146,10 @@ Check the following: πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05 + πŸ“† Sun 05πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -220,10 +220,10 @@ Check the following: πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:29, Sat Nov 04, 2017 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05 + πŸ“† Sun 05πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 diff --git a/testdata/view/test-local-timezones.txt b/testdata/view/test-local-timezones.txt index f0527ff..336bcce 100644 --- a/testdata/view/test-local-timezones.txt +++ b/testdata/view/test-local-timezones.txt @@ -52,10 +52,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05 + πŸ“† Sun 05πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -92,10 +92,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ“† Sun 05 πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 15 16 17 18 19 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 - πŸ“† Sun 05πŸ“† Sun 05 + πŸ“† Sun 05πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 πŸ“† Sun 05 @@ -225,7 +225,7 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•– Local 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 @@ -252,10 +252,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ“† Sun 05 πŸ•• (CDT) US/Central 18:30, Sun Nov 05, 2017 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•– (CDT) Cuba 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 - πŸ“† Sun 05 + πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 diff --git a/view.go b/view.go index 2723221..77a8c48 100644 --- a/view.go +++ b/view.go @@ -68,10 +68,13 @@ func (m model) View() string { dates := strings.Builder{} timeInZone := zone.currentTime(m.clock.t) midnightInZone := timeInZone.Add(-midnightOffset) + wasDST := midnightInZone.Add(-time.Hour).IsDST() dateChanged := false for column := 0; column < 24; column++ { - hour := midnightInZone.Add(time.Duration(column) * time.Hour).Hour() + time := midnightInZone.Add(time.Duration(column) * time.Hour) + nowDST := time.IsDST() + hour := time.Hour() out := termenv.String(fmt.Sprintf("%2d", hour)) out = out.Foreground(term.Color(hourColorCode(hour))) @@ -88,16 +91,23 @@ func (m model) View() string { hours.WriteString(" ") // Show the day under the hour, when the date changes. - if !m.showDates { - continue - } - if hour == 0 { - dates.WriteString(formatDayChange(&m, zone)) - dateChanged = true - } - if !dateChanged { - dates.WriteString(" ") + if m.showDates { + if hour == 0 { + dates.WriteString(formatDayChange(&m, zone)) + dateChanged = true + } + if wasDST != nowDST { + if nowDST { + dates.WriteString("=DST") + } else { + dates.WriteString("β‰ DST") + } + } else if !dateChanged { + dates.WriteString(" ") + } } + + wasDST = nowDST } var datetime string From cec9768a2034f168f97bbd2ad1030c502b955d06 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sat, 12 Oct 2024 12:31:22 +1100 Subject: [PATCH 20/30] DST support Part 4: view.go: Midnight DST support (fix 01ff381) --- testdata/view/test-dst-midnights.txt | 4 ++-- testdata/view/test-fractional-timezone-offsets.txt | 10 +++++----- testdata/view/test-local-timezones.txt | 8 ++++---- view.go | 5 ++++- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/testdata/view/test-dst-midnights.txt b/testdata/view/test-dst-midnights.txt index d746b0b..ce122c5 100644 --- a/testdata/view/test-dst-midnights.txt +++ b/testdata/view/test-dst-midnights.txt @@ -7,7 +7,7 @@ πŸ“† Sun 12 πŸ• (CDT) Cuba 01:00, Sun Mar 12, 2017 19 20 21 22 23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - =DST + πŸ“† Sun 12=DST -- End DST double midnight (2017-11-05T04:00:00Z = 1509854400) -- What time is it? @@ -17,4 +17,4 @@ πŸ“† Sun 05 πŸ•› (CDT) Cuba 00:00, Sun Nov 05, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05β‰ DST + πŸ“† Sun 05β‰ DST diff --git a/testdata/view/test-fractional-timezone-offsets.txt b/testdata/view/test-fractional-timezone-offsets.txt index 5354390..3629b13 100644 --- a/testdata/view/test-fractional-timezone-offsets.txt +++ b/testdata/view/test-fractional-timezone-offsets.txt @@ -38,7 +38,7 @@ Check the following: πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05β‰ DST + πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -75,7 +75,7 @@ Check the following: πŸ“† Sun 05β‰ DST πŸ•˜ (CDT) Cuba 21:29, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05β‰ DST + πŸ“† Sun 05β‰ DST πŸ•™ (-03) America/Argentina/ComodRivadavia 22:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -112,7 +112,7 @@ Check the following: πŸ“† Sun 05β‰ DST πŸ•˜ (CDT) Cuba 21:14, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05β‰ DST + πŸ“† Sun 05β‰ DST πŸ•™ (-03) America/Argentina/ComodRivadavia 22:14, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -149,7 +149,7 @@ Check the following: πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05β‰ DST + πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -223,7 +223,7 @@ Check the following: πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:29, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05β‰ DST + πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 diff --git a/testdata/view/test-local-timezones.txt b/testdata/view/test-local-timezones.txt index 336bcce..d40c197 100644 --- a/testdata/view/test-local-timezones.txt +++ b/testdata/view/test-local-timezones.txt @@ -55,7 +55,7 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - πŸ“† Sun 05πŸ“† Sun 05β‰ DST + πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 @@ -95,7 +95,7 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ“† Sun 05β‰ DST πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 15 16 17 18 19 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 - πŸ“† Sun 05πŸ“† Sun 05β‰ DST + πŸ“† Sun 05β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 πŸ“† Sun 05 @@ -225,7 +225,7 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•– Local 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 - πŸ“† Sun 05β‰ DST + β‰ DST πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 @@ -255,7 +255,7 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ“† Sun 05β‰ DST πŸ•– (CDT) Cuba 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 - πŸ“† Sun 05β‰ DST + β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 diff --git a/view.go b/view.go index 77a8c48..4fd822c 100644 --- a/view.go +++ b/view.go @@ -69,6 +69,7 @@ func (m model) View() string { timeInZone := zone.currentTime(m.clock.t) midnightInZone := timeInZone.Add(-midnightOffset) wasDST := midnightInZone.Add(-time.Hour).IsDST() + previousHour := midnightInZone.Add(-time.Hour).Hour() dateChanged := false for column := 0; column < 24; column++ { @@ -92,10 +93,11 @@ func (m model) View() string { // Show the day under the hour, when the date changes. if m.showDates { - if hour == 0 { + if hour < previousHour { dates.WriteString(formatDayChange(&m, zone)) dateChanged = true } + if wasDST != nowDST { if nowDST { dates.WriteString("=DST") @@ -108,6 +110,7 @@ func (m model) View() string { } wasDST = nowDST + previousHour = hour } var datetime string From ac75a0a1f21820a7b97a559b8c9f5c5b57b551a1 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sat, 12 Oct 2024 13:58:44 +1100 Subject: [PATCH 21/30] DST support Part 5: zone.go: Add Loc --- config_env.go | 1 + config_file.go | 1 + zone.go | 12 ++++++------ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/config_env.go b/config_env.go index 96f7f47..92a0bb8 100644 --- a/config_env.go +++ b/config_env.go @@ -71,6 +71,7 @@ func ReadZoneFromString(now time.Time, zoneConf string) (*Zone, error) { then := now.In(loc) shortName, _ := then.Zone() return &Zone{ + Loc: loc, DbName: loc.String(), Name: fmt.Sprintf("(%s) %s", shortName, name), }, nil diff --git a/config_file.go b/config_file.go index d5dc080..26c0311 100644 --- a/config_file.go +++ b/config_file.go @@ -54,6 +54,7 @@ func ReadZonesFromFile(now time.Time, zoneConf ConfigFileZone) (*Zone, error) { then := now.In(loc) shortName, _ := then.Zone() return &Zone{ + Loc: loc, DbName: loc.String(), Name: fmt.Sprintf("(%s) %s", shortName, name), }, nil diff --git a/zone.go b/zone.go index 32ddac6..40f3cac 100644 --- a/zone.go +++ b/zone.go @@ -18,13 +18,16 @@ package main import "time" -var name, _ = time.Now().Zone() +var now = time.Now() +var name, _ = now.Zone() var DefaultZones = []*Zone{ { + Loc: now.Location(), Name: "Local", DbName: name, }, { + Loc: time.UTC, Name: "UTC", DbName: "UTC", }, @@ -48,6 +51,7 @@ var EmojiClocks = map[int]string{ // Zone stores the name of a time zone type Zone struct { + Loc *time.Location DbName string // Name in tzdata Name string // Short name } @@ -75,11 +79,7 @@ func (z Zone) ShortMT(t time.Time) string { func (z Zone) currentTime(t time.Time) time.Time { zName, _ := t.Zone() if z.DbName != zName { - loc, err := time.LoadLocation(z.DbName) - if err != nil { - return t - } - return t.In(loc) + return t.In(z.Loc) } return t } From ff62be5bb109932432e2d1e61446af5c847ea4d7 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sat, 12 Oct 2024 15:17:18 +1100 Subject: [PATCH 22/30] DST support Part 5: zone.go: Redefine Name, add dynamic Abbreviation(t) --- config_env.go | 4 +--- config_file.go | 4 +--- zone.go | 9 ++++++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/config_env.go b/config_env.go index 92a0bb8..c26b6d8 100644 --- a/config_env.go +++ b/config_env.go @@ -68,11 +68,9 @@ func ReadZoneFromString(now time.Time, zoneConf string) (*Zone, error) { if name == "" { name = loc.String() } - then := now.In(loc) - shortName, _ := then.Zone() return &Zone{ Loc: loc, DbName: loc.String(), - Name: fmt.Sprintf("(%s) %s", shortName, name), + Name: name, }, nil } diff --git a/config_file.go b/config_file.go index 26c0311..e185501 100644 --- a/config_file.go +++ b/config_file.go @@ -51,12 +51,10 @@ func ReadZonesFromFile(now time.Time, zoneConf ConfigFileZone) (*Zone, error) { if name == "" { name = loc.String() } - then := now.In(loc) - shortName, _ := then.Zone() return &Zone{ Loc: loc, DbName: loc.String(), - Name: fmt.Sprintf("(%s) %s", shortName, name), + Name: name, }, nil } diff --git a/zone.go b/zone.go index 40f3cac..48d2948 100644 --- a/zone.go +++ b/zone.go @@ -53,13 +53,20 @@ var EmojiClocks = map[int]string{ type Zone struct { Loc *time.Location DbName string // Name in tzdata - Name string // Short name + Name string // Preferred name (user-provided, or else DbName by default) } func (z Zone) String() string { return z.Name } +// Abbreviated short name for the zone (e.g. acronym "ABC" if available, or else a number like "-3"). +// It depends dynamically on the daylight saving policy in the zone at time `t`. +func (z Zone) Abbreviation(t time.Time) string { + shortName, _ := z.currentTime(t).Zone() + return shortName +} + // ClockEmoji returns the corresponding emoji clock for a given hour func (z Zone) ClockEmoji(t time.Time) string { h := ((z.currentTime(t).Hour() % 12) + 12) % 12 From 82a9af94d183cb288388f86aae51475da6fa4af5 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sat, 12 Oct 2024 15:34:04 +1100 Subject: [PATCH 23/30] DST support Part 5: zone.go: Dynamic VerboseString(t) (fix 0bdd6e2) --- testdata/main/test-military-time.txt | 2 +- testdata/view/test-right-alignment.txt | 12 ++++++------ view.go | 2 +- zone.go | 9 ++++++++- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/testdata/main/test-military-time.txt b/testdata/main/test-military-time.txt index 3ef6377..5fbb89f 100644 --- a/testdata/main/test-military-time.txt +++ b/testdata/main/test-military-time.txt @@ -7,6 +7,6 @@ However for clarity, we include a colon delimiter between hours and minutes anyw What time is it? - πŸ•› UTC 00:01, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:01, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 diff --git a/testdata/view/test-right-alignment.txt b/testdata/view/test-right-alignment.txt index a3add25..9bfcc36 100644 --- a/testdata/view/test-right-alignment.txt +++ b/testdata/view/test-right-alignment.txt @@ -1,25 +1,25 @@ -- expected -- - πŸ•› UTC 00:01, Sun Nov 05, 2017 - πŸ•› UTC 00:01, Sun Nov 05, 2017 - πŸ•› UTC 00:01, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:01, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:01, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:01, Sun Nov 05, 2017 -- observed: narrow -- What time is it? - πŸ•› UTC 00:01, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:01, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 -- observed: medium -- What time is it? - πŸ•› UTC 00:01, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:01, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 -- observed: wide -- What time is it? - πŸ•› UTC 00:01, Sun Nov 05, 2017 + πŸ•› (UTC) UTC 00:01, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 diff --git a/view.go b/view.go index 4fd822c..5c1cee0 100644 --- a/view.go +++ b/view.go @@ -121,7 +121,7 @@ func (m model) View() string { } clockString := zone.ClockEmoji(m.clock.t) - zoneString := zone.String() + zoneString := zone.VerboseString(m.clock.t) usedZoneHeaderWidth := termenv.String(clockString + zoneString + datetime).Width() unusedZoneHeaderWidth := max(0, zoneHeaderWidth - usedZoneHeaderWidth - MinimumZoneHeaderPadding) rightAlignmentSpace := strings.Repeat(" ", unusedZoneHeaderWidth) diff --git a/zone.go b/zone.go index 48d2948..693c35b 100644 --- a/zone.go +++ b/zone.go @@ -16,7 +16,10 @@ **/ package main -import "time" +import ( + "fmt" + "time" +) var now = time.Now() var name, _ = now.Zone() @@ -60,6 +63,10 @@ func (z Zone) String() string { return z.Name } +func (z Zone) VerboseString(t time.Time) string { + return fmt.Sprintf("(%s) %s", z.Abbreviation(t), z.Name) +} + // Abbreviated short name for the zone (e.g. acronym "ABC" if available, or else a number like "-3"). // It depends dynamically on the daylight saving policy in the zone at time `t`. func (z Zone) Abbreviation(t time.Time) string { From eb4e531a42fa10070bec718b80bdbfa02d9507b0 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sat, 12 Oct 2024 15:54:37 +1100 Subject: [PATCH 24/30] DST support Part 5: zone.go: Test dynamic VerboseString(t) --- testdata/view/test-dst-end-days.txt | 14 +++--- testdata/view/test-dst-start-days.txt | 10 ++-- .../view/test-fractional-timezone-offsets.txt | 24 +++++----- testdata/view/test-local-timezones.txt | 48 +++++++++---------- 4 files changed, 48 insertions(+), 48 deletions(-) diff --git a/testdata/view/test-dst-end-days.txt b/testdata/view/test-dst-end-days.txt index e80763e..03ebb33 100644 --- a/testdata/view/test-dst-end-days.txt +++ b/testdata/view/test-dst-end-days.txt @@ -24,10 +24,10 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Sun Oct 27, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 - πŸ•‘ (CEST) Europe/Paris 02:00, Sun Oct 27, 2024 + πŸ•‘ (CET) Europe/Paris 02:00, Sun Oct 27, 2024 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 β‰ DST πŸ“† Mon 28 - πŸ•’ (IDT) Israel 03:00, Sun Oct 27, 2024 + πŸ•’ (IST) Israel 03:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 πŸ•• (IST) Asia/Calcutta 06:30, Sun Oct 27, 2024 @@ -64,7 +64,7 @@ This checks the following requirements: πŸ•‘ (CEST) Europe/Paris 02:00, Sun Oct 27, 2024 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 β‰ DST πŸ“† Mon 28 - πŸ•‘ (IDT) Israel 02:00, Sun Oct 27, 2024 + πŸ•‘ (IST) Israel 02:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 πŸ•” (IST) Asia/Calcutta 05:30, Sun Oct 27, 2024 @@ -98,10 +98,10 @@ This checks the following requirements: πŸ•‘ (UTC) UTC 02:00, Sun Oct 27, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 27 - πŸ•’ (CEST) Europe/Paris 03:00, Sun Oct 27, 2024 + πŸ•’ (CET) Europe/Paris 03:00, Sun Oct 27, 2024 2 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 β‰ DST πŸ“† Mon 28 - πŸ•“ (IDT) Israel 04:00, Sun Oct 27, 2024 + πŸ•“ (IST) Israel 04:00, Sun Oct 27, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 28 πŸ•– (IST) Asia/Calcutta 07:30, Sun Oct 27, 2024 @@ -246,10 +246,10 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Mon Oct 28, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 28 - πŸ•‘ (CEST) Europe/Paris 02:00, Mon Oct 28, 2024 + πŸ•‘ (CET) Europe/Paris 02:00, Mon Oct 28, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Tue 29 - πŸ•’ (IDT) Israel 03:00, Mon Oct 28, 2024 + πŸ•’ (IST) Israel 03:00, Mon Oct 28, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Tue 29 πŸ•• (IST) Asia/Calcutta 06:30, Mon Oct 28, 2024 diff --git a/testdata/view/test-dst-start-days.txt b/testdata/view/test-dst-start-days.txt index 0faf9aa..7ec5b00 100644 --- a/testdata/view/test-dst-start-days.txt +++ b/testdata/view/test-dst-start-days.txt @@ -61,7 +61,7 @@ This checks the following requirements: πŸ•› (UTC) UTC 00:00, Sun Mar 31, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 31 - πŸ• (CEST) Europe/Paris 01:00, Sun Mar 31, 2024 + πŸ• (CET) Europe/Paris 01:00, Sun Mar 31, 2024 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 =DST πŸ“† Mon 01 πŸ•’ (IDT) Israel 03:00, Sun Mar 31, 2024 @@ -135,10 +135,10 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Thu Mar 28, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Thu 28 - πŸ•‘ (CEST) Europe/Paris 02:00, Thu Mar 28, 2024 + πŸ•‘ (CET) Europe/Paris 02:00, Thu Mar 28, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Fri 29 - πŸ•’ (IDT) Israel 03:00, Thu Mar 28, 2024 + πŸ•’ (IST) Israel 03:00, Thu Mar 28, 2024 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Fri 29 πŸ•• (IST) Asia/Calcutta 06:30, Thu Mar 28, 2024 @@ -172,7 +172,7 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Fri Mar 29, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Fri 29 - πŸ•‘ (CEST) Europe/Paris 02:00, Fri Mar 29, 2024 + πŸ•‘ (CET) Europe/Paris 02:00, Fri Mar 29, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sat 30 πŸ•“ (IDT) Israel 04:00, Fri Mar 29, 2024 @@ -209,7 +209,7 @@ This checks the following requirements: πŸ• (UTC) UTC 01:00, Sat Mar 30, 2024 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 30 - πŸ•‘ (CEST) Europe/Paris 02:00, Sat Mar 30, 2024 + πŸ•‘ (CET) Europe/Paris 02:00, Sat Mar 30, 2024 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 31 πŸ•“ (IDT) Israel 04:00, Sat Mar 30, 2024 diff --git a/testdata/view/test-fractional-timezone-offsets.txt b/testdata/view/test-fractional-timezone-offsets.txt index 3629b13..4fb24a1 100644 --- a/testdata/view/test-fractional-timezone-offsets.txt +++ b/testdata/view/test-fractional-timezone-offsets.txt @@ -12,10 +12,10 @@ Check the following: πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CEST) Europe/Paris 01:29, Sun Nov 05, 2017 + πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IDT) Israel 02:29, Sun Nov 05, 2017 + πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 @@ -49,10 +49,10 @@ Check the following: πŸ• (UTC) UTC 01:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•‘ (CEST) Europe/Paris 02:29, Sun Nov 05, 2017 + πŸ•‘ (CET) Europe/Paris 02:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•’ (IDT) Israel 03:29, Sun Nov 05, 2017 + πŸ•’ (IST) Israel 03:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 πŸ•• (IST) Asia/Calcutta 06:59, Sun Nov 05, 2017 @@ -86,10 +86,10 @@ Check the following: πŸ• (UTC) UTC 01:14, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•‘ (CEST) Europe/Paris 02:14, Sun Nov 05, 2017 + πŸ•‘ (CET) Europe/Paris 02:14, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•’ (IDT) Israel 03:14, Sun Nov 05, 2017 + πŸ•’ (IST) Israel 03:14, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 πŸ•• (IST) Asia/Calcutta 06:44, Sun Nov 05, 2017 @@ -123,10 +123,10 @@ Check the following: πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CEST) Europe/Paris 01:29, Sun Nov 05, 2017 + πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IDT) Israel 02:29, Sun Nov 05, 2017 + πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 @@ -160,10 +160,10 @@ Check the following: πŸ•™ (UTC) UTC 23:29, Sat Nov 04, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ•› (CEST) Europe/Paris 00:29, Sun Nov 05, 2017 + πŸ•› (CET) Europe/Paris 00:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 05 - πŸ• (IDT) Israel 01:29, Sun Nov 05, 2017 + πŸ• (IST) Israel 01:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Sun 05 πŸ•“ (IST) Asia/Calcutta 04:59, Sun Nov 05, 2017 @@ -197,10 +197,10 @@ Check the following: πŸ•› (UTC) UTC 00:29, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CEST) Europe/Paris 01:29, Sun Nov 05, 2017 + πŸ• (CET) Europe/Paris 01:29, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IDT) Israel 02:29, Sun Nov 05, 2017 + πŸ•‘ (IST) Israel 02:29, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 πŸ•” (IST) Asia/Calcutta 05:59, Sun Nov 05, 2017 diff --git a/testdata/view/test-local-timezones.txt b/testdata/view/test-local-timezones.txt index d40c197..cfee2a1 100644 --- a/testdata/view/test-local-timezones.txt +++ b/testdata/view/test-local-timezones.txt @@ -23,16 +23,16 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico What time is it? - πŸ•› Local 00:00, Sun Nov 05, 2017 + πŸ•› (UTC) Local 00:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 @@ -63,16 +63,16 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico What time is it? - πŸ•” Local 05:30, Sun Nov 05, 2017 + πŸ•” (IST) Local 05:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 @@ -103,16 +103,16 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico What time is it? - πŸ•— Local 20:00, Sat Nov 04, 2017 + πŸ•— (CDT) Local 20:00, Sat Nov 04, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 πŸ“† Sun 05 - πŸ• (CEST) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 05 - πŸ•‘ (IDT) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Sun 05 πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 @@ -143,16 +143,16 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico What time is it? - πŸ•› Local 00:30, Mon Nov 06, 2017 + πŸ•› (UTC) Local 00:30, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ• (CEST) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Tue 07 - πŸ•‘ (IDT) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Tue 07 πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 @@ -170,10 +170,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•• (CDT) US/Central 18:30, Sun Nov 05, 2017 + πŸ•• (CST) US/Central 18:30, Sun Nov 05, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Mon 06 - πŸ•– (CDT) Cuba 19:30, Sun Nov 05, 2017 + πŸ•– (CST) Cuba 19:30, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 @@ -183,16 +183,16 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico What time is it? - πŸ•• Local 06:00, Mon Nov 06, 2017 + πŸ•• (IST) Local 06:00, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Mon 06 - πŸ• (CEST) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•‘ (IDT) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Mon 06 πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 @@ -210,10 +210,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 06 - πŸ•• (CDT) US/Central 18:30, Sun Nov 05, 2017 + πŸ•• (CST) US/Central 18:30, Sun Nov 05, 2017 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 πŸ“† Mon 06 - πŸ•– (CDT) Cuba 19:30, Sun Nov 05, 2017 + πŸ•– (CST) Cuba 19:30, Sun Nov 05, 2017 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 πŸ“† Mon 06 πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 @@ -223,16 +223,16 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico What time is it? - πŸ•– Local 19:30, Sun Nov 05, 2017 + πŸ•– (CST) Local 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 β‰ DST πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ• (CEST) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Mon 06 - πŸ•‘ (IDT) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 πŸ“† Mon 06 πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 @@ -250,10 +250,10 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•• (CDT) US/Central 18:30, Sun Nov 05, 2017 + πŸ•• (CST) US/Central 18:30, Sun Nov 05, 2017 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 πŸ“† Sun 05β‰ DST - πŸ•– (CDT) Cuba 19:30, Sun Nov 05, 2017 + πŸ•– (CST) Cuba 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 β‰ DST πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 From 4676cfc6b75c7865763842f83355f872867a84e0 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sat, 12 Oct 2024 16:17:03 +1100 Subject: [PATCH 25/30] DST support Part 5: config_test.go: Test LoadConfigParser --- config_test.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/config_test.go b/config_test.go index f5da9d8..f0530c4 100644 --- a/config_test.go +++ b/config_test.go @@ -52,6 +52,42 @@ func TestLoadConfig(t *testing.T) { } } +func TestLoadConfigParser(t *testing.T) { + tests := []struct { + args []string + envArg string + expected string + }{ + {nil, "", "Local;UTC"}, + {[]string{"GMT"}, "UTC", "Local;GMT"}, + {[]string{"", "GMT", ""}, "UTC", "Local;UTC;GMT;UTC"}, + {nil, "GMT", "Local;GMT"}, + {nil, ";GMT;", "Local;UTC;GMT;UTC"}, + {nil, "Unknown", ""}, + } + + oldEnv := os.Getenv("TZ_LIST") + for _, test := range tests { + os.Setenv("TZ_LIST", test.envArg) + config, err := LoadDefaultConfig(test.args) + if err != nil { + if test.expected != "" { + t.Error(err) + } + } else { + names := make([]string, len(config.Zones)) + for i, z := range config.Zones { + names[i] = z.Name + } + observed := strings.Join(names, ";") + if observed != test.expected { + t.Errorf("Expected '%v' to be: '%v'", observed, test.expected) + } + } + } + os.Setenv("TZ_LIST", oldEnv) +} + func TestLoadDefaultConfig(t *testing.T) { _, err := LoadDefaultConfig(nil) if err != nil { From 638b37f2632a0bf9926ce0c853913c5aa8504e88 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sat, 12 Oct 2024 17:23:44 +1100 Subject: [PATCH 26/30] DST support Part 6: view.go: Zone offset styles (main.go: "z" key) --- config.go | 14 +++ config_file.go | 2 + example-conf.toml | 2 + main.go | 8 ++ testdata/view/test-local-timezones.txt | 144 ++++++++++++------------- testdata/view/test-zone-styles.txt | 25 +++++ view.go | 45 +++++++- view_test.go | 84 +++++++++++++++ 8 files changed, 251 insertions(+), 73 deletions(-) create mode 100644 testdata/view/test-zone-styles.txt diff --git a/config.go b/config.go index 073fb42..d7c1a42 100644 --- a/config.go +++ b/config.go @@ -34,6 +34,8 @@ type Keymaps struct { NextDay []string PrevWeek []string NextWeek []string + PrevZStyle []string + NextZStyle []string ToggleDate []string OpenWeb []string Now []string @@ -58,6 +60,8 @@ var DefaultKeymaps = Keymaps{ NextDay: []string{"L", "shift+right", "pgdown", "shift+down", "ctrl+d"}, PrevWeek: []string{"p", "ctrl+left", "shift+pgup", "ctrl+b"}, NextWeek: []string{"n", "ctrl+right", "shift+pgdown", "ctrl+f"}, + PrevZStyle: []string{"Z"}, + NextZStyle: []string{"z"}, ToggleDate: []string{"d"}, OpenWeb: []string{"o"}, Now: []string{"t"}, @@ -146,6 +150,14 @@ func LoadConfig(tomlFile string, tzConfigs []string) (*Config, error) { mergedConfig.Keymaps.NextWeek = fileConfig.Keymaps.NextWeek } + if len(fileConfig.Keymaps.PrevZStyle) > 0 { + mergedConfig.Keymaps.PrevZStyle = fileConfig.Keymaps.PrevZStyle + } + + if len(fileConfig.Keymaps.NextZStyle) > 0 { + mergedConfig.Keymaps.NextZStyle = fileConfig.Keymaps.NextZStyle + } + if len(fileConfig.Keymaps.ToggleDate) > 0 { mergedConfig.Keymaps.ToggleDate = fileConfig.Keymaps.ToggleDate } @@ -176,6 +188,8 @@ func LoadConfig(tomlFile string, tzConfigs []string) (*Config, error) { mergedConfig.Keymaps.NextDay, mergedConfig.Keymaps.PrevWeek, mergedConfig.Keymaps.NextWeek, + mergedConfig.Keymaps.PrevZStyle, + mergedConfig.Keymaps.NextZStyle, mergedConfig.Keymaps.ToggleDate, mergedConfig.Keymaps.OpenWeb, mergedConfig.Keymaps.Now, diff --git a/config_file.go b/config_file.go index e185501..807b928 100644 --- a/config_file.go +++ b/config_file.go @@ -33,6 +33,8 @@ type ConfigFileKeymaps struct { NextDay []string `toml:"next_day"` PrevWeek []string `toml:"prev_week"` NextWeek []string `toml:"next_week"` + PrevZStyle []string `toml:"prev_zone_style"` + NextZStyle []string `toml:"next_zone_style"` ToggleDate []string `toml:"toggle_date"` OpenWeb []string `toml:"open_web"` Now []string `toml:"now"` diff --git a/example-conf.toml b/example-conf.toml index f5399c9..f1d2c66 100644 --- a/example-conf.toml +++ b/example-conf.toml @@ -24,6 +24,8 @@ prev_day = ["k", "up"] next_day = ["j", "down"] prev_week = ["p", "<"] next_week = ["n", ">"] +next_zone_style = ["z"] +prev_zone_style = ["Z"] toggle_date = ["d"] open_web = ["o", "x"] now = ["t"] diff --git a/main.go b/main.go index 6987b4e..8670347 100644 --- a/main.go +++ b/main.go @@ -81,6 +81,7 @@ type model struct { isMilitary bool watch bool showHelp bool + zoneStyle ZoneStyle } func (m model) Init() tea.Cmd { @@ -143,6 +144,12 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case match(key, m.keymaps.NextWeek): m.clock.AddDays(7) + case match(key, m.keymaps.PrevZStyle): + m.zoneStyle = m.zoneStyle.previous() + + case match(key, m.keymaps.NextZStyle): + m.zoneStyle = m.zoneStyle.next() + case match(key, m.keymaps.OpenWeb): openInTimeAndDateDotCom(m.clock.Time()) @@ -206,6 +213,7 @@ func main() { isMilitary: *military, watch: *watch, showHelp: false, + zoneStyle: AbbreviationZoneStyle, } if *when != 0 { diff --git a/testdata/view/test-local-timezones.txt b/testdata/view/test-local-timezones.txt index cfee2a1..d8ac687 100644 --- a/testdata/view/test-local-timezones.txt +++ b/testdata/view/test-local-timezones.txt @@ -23,239 +23,239 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico What time is it? - πŸ•› (UTC) Local 00:00, Sun Nov 05, 2017 + πŸ•› [+00:00] (UTC) Local 00:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 + πŸ•› [+00:00] (UTC) UTC 00:00, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• [+01:00] (CET) Europe/Paris 01:00, Sun Nov 05, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ [+02:00] (IST) Israel 02:00, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 + πŸ•” [+05:30] (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 + πŸ•— [+08:45] (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 + πŸ•™ [+11:00] (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 + πŸ•‘ [+14:00] (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 + πŸ•‘ [-10:00] (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 + πŸ•– [-05:00] (CDT) US/Central 19:00, Sat Nov 04, 2017 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05β‰ DST - πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 + πŸ•— [-04:00] (CDT) Cuba 20:00, Sat Nov 04, 2017 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05β‰ DST - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 + πŸ•˜ [-03:00] (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 -- [0][1] Asia/Calcutta (2017-11-05T05:30:00+05:30 = 1509840000) -- What time is it? - πŸ•” (IST) Local 05:30, Sun Nov 05, 2017 + πŸ•” [+00:00] (IST) Local 05:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 + πŸ•› [-05:30] (UTC) UTC 00:00, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• [-04:30] (CET) Europe/Paris 01:00, Sun Nov 05, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ [-03:30] (IST) Israel 02:00, Sun Nov 05, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 - πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 + πŸ•” [+00:00] (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 + πŸ•— [+03:15] (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 + πŸ•™ [+05:30] (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 + πŸ•‘ [+08:30] (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 + πŸ•‘ [-15:30] (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Sun 05 - πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 + πŸ•– [-10:30] (CDT) US/Central 19:00, Sat Nov 04, 2017 14 15 16 17 18 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 πŸ“† Sun 05β‰ DST - πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 + πŸ•— [-09:30] (CDT) Cuba 20:00, Sat Nov 04, 2017 15 16 17 18 19 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05β‰ DST - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 + πŸ•˜ [-08:30] (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 πŸ“† Sun 05 -- [0][2] Cuba (2017-11-04T20:00:00-04:00 = 1509840000) -- What time is it? - πŸ•— (CDT) Local 20:00, Sat Nov 04, 2017 + πŸ•— [+00:00] (CDT) Local 20:00, Sat Nov 04, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 + πŸ•› [+04:00] (UTC) UTC 00:00, Sun Nov 05, 2017 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 πŸ“† Sun 05 - πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• [+05:00] (CET) Europe/Paris 01:00, Sun Nov 05, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 05 - πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ [+06:00] (IST) Israel 02:00, Sun Nov 05, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Sun 05 - πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 + πŸ•” [+09:30] (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Sun 05 - πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 + πŸ•— [+12:45] (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 πŸ“† Sun 05 - πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 + πŸ•™ [+15:00] (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 πŸ“† Sun 05 - πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 + πŸ•‘ [+18:00] (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05 - πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 + πŸ•‘ [-06:00] (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sat 04 - πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 + πŸ•– [-01:00] (CDT) US/Central 19:00, Sat Nov 04, 2017 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 πŸ“† Sat 04 - πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 + πŸ•— [+00:00] (CDT) Cuba 20:00, Sat Nov 04, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 + πŸ•˜ [+01:00] (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 05 -- [1][0] UTC (2017-11-06T00:30:00Z = 1509928200) -- What time is it? - πŸ•› (UTC) Local 00:30, Mon Nov 06, 2017 + πŸ•› [+00:00] (UTC) Local 00:30, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 + πŸ•› [+00:00] (UTC) UTC 00:30, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• [+01:00] (CET) Europe/Paris 01:30, Mon Nov 06, 2017 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Tue 07 - πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ [+02:00] (IST) Israel 02:30, Mon Nov 06, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Tue 07 - πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 + πŸ•• [+05:30] (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Tue 07 - πŸ•˜ (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 + πŸ•˜ [+08:45] (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Tue 07 - πŸ•™ (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 + πŸ•™ [+11:00] (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Tue 07 - πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 + πŸ•‘ [+14:00] (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Tue 07 - πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 + πŸ•‘ [-10:00] (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•• (CST) US/Central 18:30, Sun Nov 05, 2017 + πŸ•• [-06:00] (CST) US/Central 18:30, Sun Nov 05, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Mon 06 - πŸ•– (CST) Cuba 19:30, Sun Nov 05, 2017 + πŸ•– [-05:00] (CST) Cuba 19:30, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 + πŸ•˜ [-03:00] (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Mon 06 -- [1][1] Asia/Calcutta (2017-11-06T06:00:00+05:30 = 1509928200) -- What time is it? - πŸ•• (IST) Local 06:00, Mon Nov 06, 2017 + πŸ•• [+00:00] (IST) Local 06:00, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 + πŸ•› [-05:30] (UTC) UTC 00:30, Mon Nov 06, 2017 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Mon 06 - πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• [-04:30] (CET) Europe/Paris 01:30, Mon Nov 06, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ [-03:30] (IST) Israel 02:30, Mon Nov 06, 2017 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Mon 06 - πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 + πŸ•• [+00:00] (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 + πŸ•˜ [+03:15] (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Tue 07 - πŸ•™ (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 + πŸ•™ [+05:30] (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Tue 07 - πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 + πŸ•‘ [+08:30] (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Tue 07 - πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 + πŸ•‘ [-15:30] (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 06 - πŸ•• (CST) US/Central 18:30, Sun Nov 05, 2017 + πŸ•• [-11:30] (CST) US/Central 18:30, Sun Nov 05, 2017 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 πŸ“† Mon 06 - πŸ•– (CST) Cuba 19:30, Sun Nov 05, 2017 + πŸ•– [-10:30] (CST) Cuba 19:30, Sun Nov 05, 2017 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 πŸ“† Mon 06 - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 + πŸ•˜ [-08:30] (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 πŸ“† Mon 06 -- [1][2] Cuba (2017-11-05T19:30:00-05:00 = 1509928200) -- What time is it? - πŸ•– (CST) Local 19:30, Sun Nov 05, 2017 + πŸ•– [+00:00] (CST) Local 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 β‰ DST - πŸ•› (UTC) UTC 00:30, Mon Nov 06, 2017 + πŸ•› [+05:00] (UTC) UTC 00:30, Mon Nov 06, 2017 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ• (CET) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• [+06:00] (CET) Europe/Paris 01:30, Mon Nov 06, 2017 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Mon 06 - πŸ•‘ (IST) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ [+07:00] (IST) Israel 02:30, Mon Nov 06, 2017 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 πŸ“† Mon 06 - πŸ•• (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 + πŸ•• [+10:30] (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•˜ (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 + πŸ•˜ [+13:45] (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•™ (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 + πŸ•™ [+16:00] (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 πŸ“† Mon 06 - πŸ•‘ (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 + πŸ•‘ [+19:00] (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•‘ (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 + πŸ•‘ [-05:00] (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•• (CST) US/Central 18:30, Sun Nov 05, 2017 + πŸ•• [-01:00] (CST) US/Central 18:30, Sun Nov 05, 2017 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 πŸ“† Sun 05β‰ DST - πŸ•– (CST) Cuba 19:30, Sun Nov 05, 2017 + πŸ•– [+00:00] (CST) Cuba 19:30, Sun Nov 05, 2017 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 β‰ DST - πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 + πŸ•˜ [+02:00] (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 diff --git a/testdata/view/test-zone-styles.txt b/testdata/view/test-zone-styles.txt new file mode 100644 index 0000000..5535eeb --- /dev/null +++ b/testdata/view/test-zone-styles.txt @@ -0,0 +1,25 @@ +-- expected -- +πŸ•› (UTC) UTC +πŸ•› [Z+00:00] (UTC) UTC +πŸ•› [+00:00] (UTC) UTC +-- observed: AbbreviationZoneStyle -- + + What time is it? + + πŸ•› (UTC) UTC 12:01AM, Sun Nov 05, 2017 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 +-- observed: WithZOffsetZoneStyle -- + + What time is it? + + πŸ•› [Z+00:00] (UTC) UTC 12:01AM, Sun Nov 05, 2017 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 +-- observed: WithRelativeZoneStyle -- + + What time is it? + + πŸ•› [+00:00] (UTC) UTC 12:01AM, Sun Nov 05, 2017 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 diff --git a/view.go b/view.go index 5c1cee0..0a048e5 100644 --- a/view.go +++ b/view.go @@ -27,6 +27,36 @@ import ( xterm "golang.org/x/term" ) +type ZoneStyle int + +const ( + AbbreviationZoneStyle ZoneStyle = iota + WithZOffsetZoneStyle + WithRelativeZoneStyle +) + +func (zs ZoneStyle) next() ZoneStyle { + switch (zs) { + case AbbreviationZoneStyle: + return WithZOffsetZoneStyle + case WithZOffsetZoneStyle: + return WithRelativeZoneStyle + default: + return AbbreviationZoneStyle + } +} + +func (zs ZoneStyle) previous() ZoneStyle { + switch (zs) { + case AbbreviationZoneStyle: + return WithRelativeZoneStyle + case WithRelativeZoneStyle: + return WithZOffsetZoneStyle + default: + return AbbreviationZoneStyle + } +} + // Width required to display 24 hours const UIWidth = 94 const MinimumZoneHeaderPadding = 6 @@ -120,8 +150,20 @@ func (m model) View() string { datetime = zone.ShortDT(m.clock.t) } + var zoneString = zone.VerboseString(timeInZone) + switch m.zoneStyle { + case WithZOffsetZoneStyle: + utcOffset := timeInZone.Format("Z-07:00") + zoneString = fmt.Sprintf("[%s] %s", utcOffset, zoneString) + case WithRelativeZoneStyle: + _, otherOffset := timeInZone.Zone() + _, localOffset := m.clock.t.Zone() + relativeOffset := m.clock.t.In(time.FixedZone("", otherOffset - localOffset)).Format("-07:00") + zoneString = fmt.Sprintf("[%s] %s", relativeOffset, zoneString) + default: + } + clockString := zone.ClockEmoji(m.clock.t) - zoneString := zone.VerboseString(m.clock.t) usedZoneHeaderWidth := termenv.String(clockString + zoneString + datetime).Width() unusedZoneHeaderWidth := max(0, zoneHeaderWidth - usedZoneHeaderWidth - MinimumZoneHeaderPadding) rightAlignmentSpace := strings.Repeat(" ", unusedZoneHeaderWidth) @@ -159,6 +201,7 @@ func generateKeymapStrings(k Keymaps, showAll bool) []string { []string { quitKey, fmt.Sprintf("%s: toggle dates", k.ToggleDate[0]), + fmt.Sprintf("%s: toggle zone offsets", k.NextZStyle[0]), fmt.Sprintf("%s: open in web", k.OpenWeb[0]), }, delimiter, diff --git a/view_test.go b/view_test.go index 993ece0..72443ba 100644 --- a/view_test.go +++ b/view_test.go @@ -319,6 +319,7 @@ func TestLocalTimezones(t *testing.T) { clock: *NewClockTime(testTime), isMilitary: true, showDates: true, + zoneStyle: WithRelativeZoneStyle, } observed := stripAnsiControlSequences(state.View()) @@ -440,3 +441,86 @@ func TestRightAlignment(t *testing.T) { } } } + +func TestZoneStyles(t *testing.T) { + testDataFile := "testdata/view/test-zone-styles.txt" + testData, err := txtar.ParseFile(testDataFile) + if err != nil { + t.Fatal(err) + } + + expected := stripAnsiControlSequencesAndNewline(testData.Files[0].Data) + + tests := []struct { + name string + zoneStyle ZoneStyle + }{ + {"AbbreviationZoneStyle", AbbreviationZoneStyle}, + {"WithZOffsetZoneStyle", WithZOffsetZoneStyle}, + {"WithRelativeZoneStyle", WithRelativeZoneStyle}, + } + + var observations []string + var outputs = []txtar.File{ + { + Name: "expected", + Data: []byte(expected), + }, + } + oldHasDarkBackground := hasDarkBackground + hasDarkBackground = true + var state = utcMinuteAfterMidnightModel + state.isMilitary = false + for i, test := range tests { + if state.zoneStyle != test.zoneStyle { + t.Errorf("Expected %s %v for test %d but got: %v", test.name, test.zoneStyle, i, state.zoneStyle) + } + observed := stripAnsiControlSequences(state.View()) + observations = append(observations, observed) + outputs = append( + outputs, + txtar.File{ + Name: fmt.Sprintf("observed: %v", test.name), + Data: []byte(observed), + }, + ) + msg := tea.KeyMsg{ + Type: tea.KeyRunes, + Runes: []rune{'z'}, + Alt: false, + } + _, cmd := state.Update(msg) + if cmd != nil { + t.Fatalf("Expected nil Cmd, but got %v", cmd) + } + } + hasDarkBackground = oldHasDarkBackground + + for i := len(tests) - 1; i >= 0; i-- { + msg := tea.KeyMsg{ + Type: tea.KeyRunes, + Runes: []rune{'Z'}, + Alt: false, + } + _, cmd := state.Update(msg) + if cmd != nil { + t.Fatalf("Expected nil Cmd, but got %v", cmd) + } + if state.zoneStyle != tests[i].zoneStyle { + t.Errorf("Expected %s %v for reverse test %d but got: %v", tests[i].name, tests[i].zoneStyle, i, state.zoneStyle) + } + } + + archive := txtar.Archive{ + Comment: testData.Comment, + Files: outputs, + } + os.WriteFile(testDataFile, txtar.Format(&archive), 0666) + + expectations := strings.Split(expected, "\n") + for i, test := range tests { + if !strings.Contains(observations[i], expectations[i]) { + t.Errorf("Expected %v β€œ%s”, but got: β€œ%s”", test.name, expectations[i], observations[i]) + } + } +} From 91c32b9e1520c410adea9ce3aea44219b1567644 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sat, 12 Oct 2024 17:33:23 +1100 Subject: [PATCH 27/30] DST support Part 6: view.go: Format styles (main.go: "f" key) --- config.go | 14 +++ config_file.go | 2 + example-conf.toml | 2 + main.go | 7 ++ testdata/view/test-local-timezones.txt | 144 ++++++++++++------------- testdata/view/test-time-formats.txt | 25 +++++ view.go | 55 +++++++++- view_test.go | 83 ++++++++++++++ 8 files changed, 256 insertions(+), 76 deletions(-) create mode 100644 testdata/view/test-time-formats.txt diff --git a/config.go b/config.go index d7c1a42..97cabba 100644 --- a/config.go +++ b/config.go @@ -34,6 +34,8 @@ type Keymaps struct { NextDay []string PrevWeek []string NextWeek []string + PrevFStyle []string + NextFStyle []string PrevZStyle []string NextZStyle []string ToggleDate []string @@ -60,6 +62,8 @@ var DefaultKeymaps = Keymaps{ NextDay: []string{"L", "shift+right", "pgdown", "shift+down", "ctrl+d"}, PrevWeek: []string{"p", "ctrl+left", "shift+pgup", "ctrl+b"}, NextWeek: []string{"n", "ctrl+right", "shift+pgdown", "ctrl+f"}, + PrevFStyle: []string{"F"}, + NextFStyle: []string{"f"}, PrevZStyle: []string{"Z"}, NextZStyle: []string{"z"}, ToggleDate: []string{"d"}, @@ -150,6 +154,14 @@ func LoadConfig(tomlFile string, tzConfigs []string) (*Config, error) { mergedConfig.Keymaps.NextWeek = fileConfig.Keymaps.NextWeek } + if len(fileConfig.Keymaps.PrevFStyle) > 0 { + mergedConfig.Keymaps.PrevFStyle = fileConfig.Keymaps.PrevFStyle + } + + if len(fileConfig.Keymaps.NextFStyle) > 0 { + mergedConfig.Keymaps.NextFStyle = fileConfig.Keymaps.NextFStyle + } + if len(fileConfig.Keymaps.PrevZStyle) > 0 { mergedConfig.Keymaps.PrevZStyle = fileConfig.Keymaps.PrevZStyle } @@ -188,6 +200,8 @@ func LoadConfig(tomlFile string, tzConfigs []string) (*Config, error) { mergedConfig.Keymaps.NextDay, mergedConfig.Keymaps.PrevWeek, mergedConfig.Keymaps.NextWeek, + mergedConfig.Keymaps.PrevFStyle, + mergedConfig.Keymaps.NextFStyle, mergedConfig.Keymaps.PrevZStyle, mergedConfig.Keymaps.NextZStyle, mergedConfig.Keymaps.ToggleDate, diff --git a/config_file.go b/config_file.go index 807b928..616655c 100644 --- a/config_file.go +++ b/config_file.go @@ -33,6 +33,8 @@ type ConfigFileKeymaps struct { NextDay []string `toml:"next_day"` PrevWeek []string `toml:"prev_week"` NextWeek []string `toml:"next_week"` + PrevFStyle []string `toml:"prev_format_style"` + NextFStyle []string `toml:"next_format_style"` PrevZStyle []string `toml:"prev_zone_style"` NextZStyle []string `toml:"next_zone_style"` ToggleDate []string `toml:"toggle_date"` diff --git a/example-conf.toml b/example-conf.toml index f1d2c66..0c8faee 100644 --- a/example-conf.toml +++ b/example-conf.toml @@ -24,6 +24,8 @@ prev_day = ["k", "up"] next_day = ["j", "down"] prev_week = ["p", "<"] next_week = ["n", ">"] +next_format_style = ["f"] +prev_format_style = ["F"] next_zone_style = ["z"] prev_zone_style = ["Z"] toggle_date = ["d"] diff --git a/main.go b/main.go index 8670347..9001491 100644 --- a/main.go +++ b/main.go @@ -81,6 +81,7 @@ type model struct { isMilitary bool watch bool showHelp bool + formatStyle FormatStyle zoneStyle ZoneStyle } @@ -144,6 +145,12 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case match(key, m.keymaps.NextWeek): m.clock.AddDays(7) + case match(key, m.keymaps.NextFStyle): + m.formatStyle = m.formatStyle.next() + + case match(key, m.keymaps.PrevFStyle): + m.formatStyle = m.formatStyle.previous() + case match(key, m.keymaps.PrevZStyle): m.zoneStyle = m.zoneStyle.previous() diff --git a/testdata/view/test-local-timezones.txt b/testdata/view/test-local-timezones.txt index d8ac687..d7d98b0 100644 --- a/testdata/view/test-local-timezones.txt +++ b/testdata/view/test-local-timezones.txt @@ -23,239 +23,239 @@ because the DST-ending midnight is not the first hour of day, hence no πŸ“† ico What time is it? - πŸ•› [+00:00] (UTC) Local 00:00, Sun Nov 05, 2017 + πŸ•› [+00:00] (UTC) Local 2017-11-05T00:00+00:00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•› [+00:00] (UTC) UTC 00:00, Sun Nov 05, 2017 + πŸ•› [+00:00] (UTC) UTC 2017-11-05T00:00+00:00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ• [+01:00] (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• [+01:00] (CET) Europe/Paris 2017-11-05T01:00+01:00 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Mon 06 - πŸ•‘ [+02:00] (IST) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ [+02:00] (IST) Israel 2017-11-05T02:00+02:00 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 - πŸ•” [+05:30] (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 + πŸ•” [+05:30] (IST) Asia/Calcutta 2017-11-05T05:30+05:30 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ•— [+08:45] (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 + πŸ•— [+08:45] (+0845) Australia/Eucla 2017-11-05T08:45+08:45 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 06 - πŸ•™ [+11:00] (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 + πŸ•™ [+11:00] (AEDT) Australia/Sydney 2017-11-05T11:00+11:00 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•‘ [+14:00] (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 + πŸ•‘ [+14:00] (+14) Pacific/Kiritimati 2017-11-05T14:00+14:00 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•‘ [-10:00] (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 + πŸ•‘ [-10:00] (HST) Pacific/Honolulu 2017-11-04T14:00-10:00 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05 - πŸ•– [-05:00] (CDT) US/Central 19:00, Sat Nov 04, 2017 + πŸ•– [-05:00] (CDT) US/Central 2017-11-04T19:00-05:00 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05β‰ DST - πŸ•— [-04:00] (CDT) Cuba 20:00, Sat Nov 04, 2017 + πŸ•— [-04:00] (CDT) Cuba 2017-11-04T20:00-04:00 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05β‰ DST - πŸ•˜ [-03:00] (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 + πŸ•˜ [-03:00] (-03) America/Argentina/ComodRivadavia 2017-11-04T21:00-03:00 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 -- [0][1] Asia/Calcutta (2017-11-05T05:30:00+05:30 = 1509840000) -- What time is it? - πŸ•” [+00:00] (IST) Local 05:30, Sun Nov 05, 2017 + πŸ•” [+00:00] (IST) Local 2017-11-05T05:30+05:30 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•› [-05:30] (UTC) UTC 00:00, Sun Nov 05, 2017 + πŸ•› [-05:30] (UTC) UTC 2017-11-05T00:00+00:00 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ• [-04:30] (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• [-04:30] (CET) Europe/Paris 2017-11-05T01:00+01:00 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Sun 05 - πŸ•‘ [-03:30] (IST) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ [-03:30] (IST) Israel 2017-11-05T02:00+02:00 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 - πŸ•” [+00:00] (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 + πŸ•” [+00:00] (IST) Asia/Calcutta 2017-11-05T05:30+05:30 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sun 05 - πŸ•— [+03:15] (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 + πŸ•— [+03:15] (+0845) Australia/Eucla 2017-11-05T08:45+08:45 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Mon 06 - πŸ•™ [+05:30] (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 + πŸ•™ [+05:30] (AEDT) Australia/Sydney 2017-11-05T11:00+11:00 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Mon 06 - πŸ•‘ [+08:30] (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 + πŸ•‘ [+08:30] (+14) Pacific/Kiritimati 2017-11-05T14:00+14:00 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Mon 06 - πŸ•‘ [-15:30] (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 + πŸ•‘ [-15:30] (HST) Pacific/Honolulu 2017-11-04T14:00-10:00 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Sun 05 - πŸ•– [-10:30] (CDT) US/Central 19:00, Sat Nov 04, 2017 + πŸ•– [-10:30] (CDT) US/Central 2017-11-04T19:00-05:00 14 15 16 17 18 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 πŸ“† Sun 05β‰ DST - πŸ•— [-09:30] (CDT) Cuba 20:00, Sat Nov 04, 2017 + πŸ•— [-09:30] (CDT) Cuba 2017-11-04T20:00-04:00 15 16 17 18 19 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Sun 05β‰ DST - πŸ•˜ [-08:30] (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 + πŸ•˜ [-08:30] (-03) America/Argentina/ComodRivadavia 2017-11-04T21:00-03:00 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 πŸ“† Sun 05 -- [0][2] Cuba (2017-11-04T20:00:00-04:00 = 1509840000) -- What time is it? - πŸ•— [+00:00] (CDT) Local 20:00, Sat Nov 04, 2017 + πŸ•— [+00:00] (CDT) Local 2017-11-04T20:00-04:00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ•› [+04:00] (UTC) UTC 00:00, Sun Nov 05, 2017 + πŸ•› [+04:00] (UTC) UTC 2017-11-05T00:00+00:00 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 πŸ“† Sun 05 - πŸ• [+05:00] (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + πŸ• [+05:00] (CET) Europe/Paris 2017-11-05T01:00+01:00 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Sun 05 - πŸ•‘ [+06:00] (IST) Israel 02:00, Sun Nov 05, 2017 + πŸ•‘ [+06:00] (IST) Israel 2017-11-05T02:00+02:00 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Sun 05 - πŸ•” [+09:30] (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 + πŸ•” [+09:30] (IST) Asia/Calcutta 2017-11-05T05:30+05:30 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Sun 05 - πŸ•— [+12:45] (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 + πŸ•— [+12:45] (+0845) Australia/Eucla 2017-11-05T08:45+08:45 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 πŸ“† Sun 05 - πŸ•™ [+15:00] (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 + πŸ•™ [+15:00] (AEDT) Australia/Sydney 2017-11-05T11:00+11:00 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 πŸ“† Sun 05 - πŸ•‘ [+18:00] (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 + πŸ•‘ [+18:00] (+14) Pacific/Kiritimati 2017-11-05T14:00+14:00 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sun 05 - πŸ•‘ [-06:00] (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 + πŸ•‘ [-06:00] (HST) Pacific/Honolulu 2017-11-04T14:00-10:00 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Sat 04 - πŸ•– [-01:00] (CDT) US/Central 19:00, Sat Nov 04, 2017 + πŸ•– [-01:00] (CDT) US/Central 2017-11-04T19:00-05:00 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 πŸ“† Sat 04 - πŸ•— [+00:00] (CDT) Cuba 20:00, Sat Nov 04, 2017 + πŸ•— [+00:00] (CDT) Cuba 2017-11-04T20:00-04:00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Sat 04 - πŸ•˜ [+01:00] (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 + πŸ•˜ [+01:00] (-03) America/Argentina/ComodRivadavia 2017-11-04T21:00-03:00 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Sun 05 -- [1][0] UTC (2017-11-06T00:30:00Z = 1509928200) -- What time is it? - πŸ•› [+00:00] (UTC) Local 00:30, Mon Nov 06, 2017 + πŸ•› [+00:00] (UTC) Local 2017-11-06T00:30+00:00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ•› [+00:00] (UTC) UTC 00:30, Mon Nov 06, 2017 + πŸ•› [+00:00] (UTC) UTC 2017-11-06T00:30+00:00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ• [+01:00] (CET) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• [+01:00] (CET) Europe/Paris 2017-11-06T01:30+01:00 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 πŸ“† Tue 07 - πŸ•‘ [+02:00] (IST) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ [+02:00] (IST) Israel 2017-11-06T02:30+02:00 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Tue 07 - πŸ•• [+05:30] (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 + πŸ•• [+05:30] (IST) Asia/Calcutta 2017-11-06T06:00+05:30 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Tue 07 - πŸ•˜ [+08:45] (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 + πŸ•˜ [+08:45] (+0845) Australia/Eucla 2017-11-06T09:15+08:45 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 πŸ“† Tue 07 - πŸ•™ [+11:00] (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 + πŸ•™ [+11:00] (AEDT) Australia/Sydney 2017-11-06T11:30+11:00 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Tue 07 - πŸ•‘ [+14:00] (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 + πŸ•‘ [+14:00] (+14) Pacific/Kiritimati 2017-11-06T14:30+14:00 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Tue 07 - πŸ•‘ [-10:00] (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 + πŸ•‘ [-10:00] (HST) Pacific/Honolulu 2017-11-05T14:30-10:00 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•• [-06:00] (CST) US/Central 18:30, Sun Nov 05, 2017 + πŸ•• [-06:00] (CST) US/Central 2017-11-05T18:30-06:00 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Mon 06 - πŸ•– [-05:00] (CST) Cuba 19:30, Sun Nov 05, 2017 + πŸ•– [-05:00] (CST) Cuba 2017-11-05T19:30-05:00 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•˜ [-03:00] (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 + πŸ•˜ [-03:00] (-03) America/Argentina/ComodRivadavia 2017-11-05T21:30-03:00 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Mon 06 -- [1][1] Asia/Calcutta (2017-11-06T06:00:00+05:30 = 1509928200) -- What time is it? - πŸ•• [+00:00] (IST) Local 06:00, Mon Nov 06, 2017 + πŸ•• [+00:00] (IST) Local 2017-11-06T06:00+05:30 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ•› [-05:30] (UTC) UTC 00:30, Mon Nov 06, 2017 + πŸ•› [-05:30] (UTC) UTC 2017-11-06T00:30+00:00 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 πŸ“† Mon 06 - πŸ• [-04:30] (CET) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• [-04:30] (CET) Europe/Paris 2017-11-06T01:30+01:00 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•‘ [-03:30] (IST) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ [-03:30] (IST) Israel 2017-11-06T02:30+02:00 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 πŸ“† Mon 06 - πŸ•• [+00:00] (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 + πŸ•• [+00:00] (IST) Asia/Calcutta 2017-11-06T06:00+05:30 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 πŸ“† Mon 06 - πŸ•˜ [+03:15] (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 + πŸ•˜ [+03:15] (+0845) Australia/Eucla 2017-11-06T09:15+08:45 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 πŸ“† Tue 07 - πŸ•™ [+05:30] (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 + πŸ•™ [+05:30] (AEDT) Australia/Sydney 2017-11-06T11:30+11:00 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Tue 07 - πŸ•‘ [+08:30] (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 + πŸ•‘ [+08:30] (+14) Pacific/Kiritimati 2017-11-06T14:30+14:00 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Tue 07 - πŸ•‘ [-15:30] (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 + πŸ•‘ [-15:30] (HST) Pacific/Honolulu 2017-11-05T14:30-10:00 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 πŸ“† Mon 06 - πŸ•• [-11:30] (CST) US/Central 18:30, Sun Nov 05, 2017 + πŸ•• [-11:30] (CST) US/Central 2017-11-05T18:30-06:00 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 πŸ“† Mon 06 - πŸ•– [-10:30] (CST) Cuba 19:30, Sun Nov 05, 2017 + πŸ•– [-10:30] (CST) Cuba 2017-11-05T19:30-05:00 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 πŸ“† Mon 06 - πŸ•˜ [-08:30] (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 + πŸ•˜ [-08:30] (-03) America/Argentina/ComodRivadavia 2017-11-05T21:30-03:00 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 πŸ“† Mon 06 -- [1][2] Cuba (2017-11-05T19:30:00-05:00 = 1509928200) -- What time is it? - πŸ•– [+00:00] (CST) Local 19:30, Sun Nov 05, 2017 + πŸ•– [+00:00] (CST) Local 2017-11-05T19:30-05:00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 β‰ DST - πŸ•› [+05:00] (UTC) UTC 00:30, Mon Nov 06, 2017 + πŸ•› [+05:00] (UTC) UTC 2017-11-06T00:30+00:00 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 πŸ“† Mon 06 - πŸ• [+06:00] (CET) Europe/Paris 01:30, Mon Nov 06, 2017 + πŸ• [+06:00] (CET) Europe/Paris 2017-11-06T01:30+01:00 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 πŸ“† Mon 06 - πŸ•‘ [+07:00] (IST) Israel 02:30, Mon Nov 06, 2017 + πŸ•‘ [+07:00] (IST) Israel 2017-11-06T02:30+02:00 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 πŸ“† Mon 06 - πŸ•• [+10:30] (IST) Asia/Calcutta 06:00, Mon Nov 06, 2017 + πŸ•• [+10:30] (IST) Asia/Calcutta 2017-11-06T06:00+05:30 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 πŸ“† Mon 06 - πŸ•˜ [+13:45] (+0845) Australia/Eucla 09:15, Mon Nov 06, 2017 + πŸ•˜ [+13:45] (+0845) Australia/Eucla 2017-11-06T09:15+08:45 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 πŸ“† Mon 06 - πŸ•™ [+16:00] (AEDT) Australia/Sydney 11:30, Mon Nov 06, 2017 + πŸ•™ [+16:00] (AEDT) Australia/Sydney 2017-11-06T11:30+11:00 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 πŸ“† Mon 06 - πŸ•‘ [+19:00] (+14) Pacific/Kiritimati 14:30, Mon Nov 06, 2017 + πŸ•‘ [+19:00] (+14) Pacific/Kiritimati 2017-11-06T14:30+14:00 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Mon 06 - πŸ•‘ [-05:00] (HST) Pacific/Honolulu 14:30, Sun Nov 05, 2017 + πŸ•‘ [-05:00] (HST) Pacific/Honolulu 2017-11-05T14:30-10:00 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 πŸ“† Sun 05 - πŸ•• [-01:00] (CST) US/Central 18:30, Sun Nov 05, 2017 + πŸ•• [-01:00] (CST) US/Central 2017-11-05T18:30-06:00 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 πŸ“† Sun 05β‰ DST - πŸ•– [+00:00] (CST) Cuba 19:30, Sun Nov 05, 2017 + πŸ•– [+00:00] (CST) Cuba 2017-11-05T19:30-05:00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 β‰ DST - πŸ•˜ [+02:00] (-03) America/Argentina/ComodRivadavia 21:30, Sun Nov 05, 2017 + πŸ•˜ [+02:00] (-03) America/Argentina/ComodRivadavia 2017-11-05T21:30-03:00 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 πŸ“† Mon 06 diff --git a/testdata/view/test-time-formats.txt b/testdata/view/test-time-formats.txt new file mode 100644 index 0000000..4bea86d --- /dev/null +++ b/testdata/view/test-time-formats.txt @@ -0,0 +1,25 @@ +-- expected -- +00:01, Sun Nov 05, 2017 +2017-11-05T00:01+00:00 +No DST, Week 44, Day 309, Unix 1509840062 +-- observed: DefaultFormatStyle -- + + What time is it? + + πŸ•› (UTC) UTC 00:01, Sun Nov 05, 2017 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 +-- observed: IsoFormatStyle -- + + What time is it? + + πŸ•› (UTC) UTC 2017-11-05T00:01+00:00 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 +-- observed: UnixFormatStyle -- + + What time is it? + + πŸ•› (UTC) UTC No DST, Week 44, Day 309, Unix 1509840062 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 diff --git a/view.go b/view.go index 0a048e5..b24b0b1 100644 --- a/view.go +++ b/view.go @@ -27,6 +27,36 @@ import ( xterm "golang.org/x/term" ) +type FormatStyle int + +const ( + DefaultFormatStyle FormatStyle = iota + IsoFormatStyle + UnixFormatStyle +) + +func (fs FormatStyle) next() FormatStyle { + switch (fs) { + case DefaultFormatStyle: + return IsoFormatStyle + case IsoFormatStyle: + return UnixFormatStyle + default: + return DefaultFormatStyle + } +} + +func (fs FormatStyle) previous() FormatStyle { + switch (fs) { + case DefaultFormatStyle: + return UnixFormatStyle + case UnixFormatStyle: + return IsoFormatStyle + default: + return DefaultFormatStyle + } +} + type ZoneStyle int const ( @@ -144,10 +174,26 @@ func (m model) View() string { } var datetime string - if m.isMilitary { - datetime = zone.ShortMT(m.clock.t) - } else { - datetime = zone.ShortDT(m.clock.t) + switch m.formatStyle { + case IsoFormatStyle: + datetime = timeInZone.Format("2006-01-02T15:04-07:00") + case UnixFormatStyle: + _, weekOfYear := timeInZone.ISOWeek() + dayOfYear := timeInZone.Format("__2") + yesNo := map[bool]string{true: "With", false: "No"} + datetime = fmt.Sprintf( + "%v DST, Week %v, Day %v, Unix %v", + yesNo[timeInZone.IsDST()], + weekOfYear, + dayOfYear, + timeInZone.Unix(), + ) + default: + if m.isMilitary { + datetime = zone.ShortMT(m.clock.t) + } else { + datetime = zone.ShortDT(m.clock.t) + } } var zoneString = zone.VerboseString(timeInZone) @@ -201,6 +247,7 @@ func generateKeymapStrings(k Keymaps, showAll bool) []string { []string { quitKey, fmt.Sprintf("%s: toggle dates", k.ToggleDate[0]), + fmt.Sprintf("%s: toggle formats", k.NextFStyle[0]), fmt.Sprintf("%s: toggle zone offsets", k.NextZStyle[0]), fmt.Sprintf("%s: open in web", k.OpenWeb[0]), }, diff --git a/view_test.go b/view_test.go index 72443ba..d6f1dc1 100644 --- a/view_test.go +++ b/view_test.go @@ -319,6 +319,7 @@ func TestLocalTimezones(t *testing.T) { clock: *NewClockTime(testTime), isMilitary: true, showDates: true, + formatStyle: IsoFormatStyle, zoneStyle: WithRelativeZoneStyle, } @@ -442,6 +443,88 @@ func TestRightAlignment(t *testing.T) { } } +func TestTimeFormats(t *testing.T) { + testDataFile := "testdata/view/test-time-formats.txt" + testData, err := txtar.ParseFile(testDataFile) + if err != nil { + t.Fatal(err) + } + + expected := stripAnsiControlSequencesAndNewline(testData.Files[0].Data) + + tests := []struct { + name string + formatStyle FormatStyle + }{ + {"DefaultFormatStyle", DefaultFormatStyle}, + {"IsoFormatStyle", IsoFormatStyle}, + {"UnixFormatStyle", UnixFormatStyle}, + } + + var observations []string + var outputs = []txtar.File{ + { + Name: "expected", + Data: []byte(expected), + }, + } + oldHasDarkBackground := hasDarkBackground + hasDarkBackground = true + var state = utcMinuteAfterMidnightModel + for i, test := range tests { + if state.formatStyle != test.formatStyle { + t.Errorf("Expected %s %v for test %d but got: %v", test.name, test.formatStyle, i, state.formatStyle) + } + observed := stripAnsiControlSequences(state.View()) + observations = append(observations, observed) + outputs = append( + outputs, + txtar.File{ + Name: fmt.Sprintf("observed: %v", test.name), + Data: []byte(observed), + }, + ) + msg := tea.KeyMsg{ + Type: tea.KeyRunes, + Runes: []rune{'f'}, + Alt: false, + } + _, cmd := state.Update(msg) + if cmd != nil { + t.Fatalf("Expected nil Cmd, but got %v", cmd) + } + } + hasDarkBackground = oldHasDarkBackground + + for i := len(tests) - 1; i >= 0; i-- { + msg := tea.KeyMsg{ + Type: tea.KeyRunes, + Runes: []rune{'F'}, + Alt: false, + } + _, cmd := state.Update(msg) + if cmd != nil { + t.Fatalf("Expected nil Cmd, but got %v", cmd) + } + if state.formatStyle != tests[i].formatStyle { + t.Errorf("Expected %s %v for reverse test %d but got: %v", tests[i].name, tests[i].formatStyle, i, state.formatStyle) + } + } + + archive := txtar.Archive{ + Comment: testData.Comment, + Files: outputs, + } + os.WriteFile(testDataFile, txtar.Format(&archive), 0666) + + expectations := strings.Split(expected, "\n") + for i, test := range tests { + if !strings.Contains(observations[i], expectations[i]) { + t.Errorf("Expected %v β€œ%s”, but got: β€œ%s”", test.name, expectations[i], observations[i]) + } + } +} + func TestZoneStyles(t *testing.T) { testDataFile := "testdata/view/test-zone-styles.txt" testData, err := txtar.ParseFile(testDataFile) From 1aaf8b542a9dbcd06840b5d2ebb5c592dbd67e0d Mon Sep 17 00:00:00 2001 From: James Devenish Date: Sun, 13 Oct 2024 12:22:56 +1100 Subject: [PATCH 28/30] view.go: highlight zone with markers (main.go: "j"/"k" keys) --- config.go | 14 +++++++++ config_file.go | 2 ++ example-conf.toml | 2 ++ main.go | 9 ++++++ testdata/view/test-highlight-markers.txt | 7 +++++ view.go | 13 ++++++-- view_test.go | 40 ++++++++++++++++++++++++ 7 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 testdata/view/test-highlight-markers.txt diff --git a/config.go b/config.go index 97cabba..d6d752f 100644 --- a/config.go +++ b/config.go @@ -34,6 +34,8 @@ type Keymaps struct { NextDay []string PrevWeek []string NextWeek []string + PrevLine []string + NextLine []string PrevFStyle []string NextFStyle []string PrevZStyle []string @@ -62,6 +64,8 @@ var DefaultKeymaps = Keymaps{ NextDay: []string{"L", "shift+right", "pgdown", "shift+down", "ctrl+d"}, PrevWeek: []string{"p", "ctrl+left", "shift+pgup", "ctrl+b"}, NextWeek: []string{"n", "ctrl+right", "shift+pgdown", "ctrl+f"}, + PrevLine: []string{"k", "up"}, + NextLine: []string{"j", "down"}, PrevFStyle: []string{"F"}, NextFStyle: []string{"f"}, PrevZStyle: []string{"Z"}, @@ -154,6 +158,14 @@ func LoadConfig(tomlFile string, tzConfigs []string) (*Config, error) { mergedConfig.Keymaps.NextWeek = fileConfig.Keymaps.NextWeek } + if len(fileConfig.Keymaps.PrevLine) > 0 { + mergedConfig.Keymaps.PrevLine = fileConfig.Keymaps.PrevLine + } + + if len(fileConfig.Keymaps.NextLine) > 0 { + mergedConfig.Keymaps.NextLine = fileConfig.Keymaps.NextLine + } + if len(fileConfig.Keymaps.PrevFStyle) > 0 { mergedConfig.Keymaps.PrevFStyle = fileConfig.Keymaps.PrevFStyle } @@ -200,6 +212,8 @@ func LoadConfig(tomlFile string, tzConfigs []string) (*Config, error) { mergedConfig.Keymaps.NextDay, mergedConfig.Keymaps.PrevWeek, mergedConfig.Keymaps.NextWeek, + mergedConfig.Keymaps.PrevLine, + mergedConfig.Keymaps.NextLine, mergedConfig.Keymaps.PrevFStyle, mergedConfig.Keymaps.NextFStyle, mergedConfig.Keymaps.PrevZStyle, diff --git a/config_file.go b/config_file.go index 616655c..b45cd98 100644 --- a/config_file.go +++ b/config_file.go @@ -33,6 +33,8 @@ type ConfigFileKeymaps struct { NextDay []string `toml:"next_day"` PrevWeek []string `toml:"prev_week"` NextWeek []string `toml:"next_week"` + PrevLine []string `toml:"prev_line_select"` + NextLine []string `toml:"next_line_select"` PrevFStyle []string `toml:"prev_format_style"` NextFStyle []string `toml:"next_format_style"` PrevZStyle []string `toml:"prev_zone_style"` diff --git a/example-conf.toml b/example-conf.toml index 0c8faee..d424524 100644 --- a/example-conf.toml +++ b/example-conf.toml @@ -24,6 +24,8 @@ prev_day = ["k", "up"] next_day = ["j", "down"] prev_week = ["p", "<"] next_week = ["n", ">"] +prev_line_select = [","] +next_line_select = ["."] next_format_style = ["f"] prev_format_style = ["F"] next_zone_style = ["z"] diff --git a/main.go b/main.go index 9001491..f58b963 100644 --- a/main.go +++ b/main.go @@ -76,6 +76,7 @@ type model struct { zones []*Zone keymaps Keymaps clock Clock + highlighted int // 0 == none, else row number indexed from 1 showDates bool interactive bool isMilitary bool @@ -145,6 +146,14 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case match(key, m.keymaps.NextWeek): m.clock.AddDays(7) + case match(key, m.keymaps.PrevLine): + modulo := len(m.zones) + 1 + m.highlighted = (m.highlighted - 1 + modulo) % modulo + + case match(key, m.keymaps.NextLine): + modulo := len(m.zones) + 1 + m.highlighted = (m.highlighted + 1) % modulo + case match(key, m.keymaps.NextFStyle): m.formatStyle = m.formatStyle.next() diff --git a/testdata/view/test-highlight-markers.txt b/testdata/view/test-highlight-markers.txt new file mode 100644 index 0000000..b81fa1e --- /dev/null +++ b/testdata/view/test-highlight-markers.txt @@ -0,0 +1,7 @@ +-- Highlight Local Zone -- + + What time is it? + +>>πŸ•› (UTC) UTC 00:01, Sun Nov 05, 2017 +>> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 +>>πŸ“† Sun 05 diff --git a/view.go b/view.go index b24b0b1..9625659 100644 --- a/view.go +++ b/view.go @@ -123,13 +123,14 @@ func (m model) View() string { cursorColumn := int(midnightOffset / time.Hour) // Show hours for each zone - for _, zone := range m.zones { + for i, zone := range m.zones { hours := strings.Builder{} dates := strings.Builder{} timeInZone := zone.currentTime(m.clock.t) midnightInZone := timeInZone.Add(-midnightOffset) wasDST := midnightInZone.Add(-time.Hour).IsDST() previousHour := midnightInZone.Add(-time.Hour).Hour() + highlighted := i == (m.highlighted - 1) dateChanged := false for column := 0; column < 24; column++ { @@ -215,7 +216,14 @@ func (m model) View() string { rightAlignmentSpace := strings.Repeat(" ", unusedZoneHeaderWidth) zoneHeader := fmt.Sprintf("%s %s %s%s", clockString, normalTextStyle(zoneString), rightAlignmentSpace, dateTimeStyle(datetime)) - s += fmt.Sprintf(" %s\n %s\n %s\n", zoneHeader, hours.String(), dates.String()) + marker := " " + if highlighted { + marker = termenv.String(">>").Reverse().String() + } + lines := []string{zoneHeader, hours.String(), dates.String()} + for _, line := range lines { + s += fmt.Sprintf("%s%s\n", marker, line) + } } if m.interactive { @@ -240,6 +248,7 @@ func generateKeymapStrings(k Keymaps, showAll bool) []string { fmt.Sprintf("%s/%s: days", k.PrevDay[0], k.NextDay[0]), fmt.Sprintf("%s/%s: weeks", k.PrevWeek[0], k.NextWeek[0]), fmt.Sprintf("%s: go to now", k.Now[0]), + fmt.Sprintf("%s/%s: highlight", k.NextLine[0], k.PrevLine[0]), }, delimiter, ), diff --git a/view_test.go b/view_test.go index d6f1dc1..1934479 100644 --- a/view_test.go +++ b/view_test.go @@ -266,6 +266,46 @@ func TestFractionalTimezoneOffsets(t *testing.T) { } } +func TestHighlightMarkers(t *testing.T) { + testDataFile := "testdata/view/test-highlight-markers.txt" + testData, err := txtar.ParseFile(testDataFile) + if err != nil { + t.Fatal(err) + } + + expected := stripAnsiControlSequencesAndNewline(testData.Files[0].Data) + + keys := "jkj" // down, up, down + + var state = utcMinuteAfterMidnightModel + for k, key := range keys { + msg := tea.KeyMsg{ + Type: tea.KeyRunes, + Runes: []rune{key}, + Alt: false, + } + _, cmd := state.Update(msg) + if cmd != nil { + t.Fatalf("Expected nil Cmd for '%v' (key %v), but got %v", key, k, cmd) + } + } + + observed := txtar.File{ + Name: "Highlight Local Zone", + Data: []byte(stripAnsiControlSequences(state.View())), + } + + archive := txtar.Archive{ + Comment: testData.Comment, + Files: []txtar.File{observed}, + } + os.WriteFile(testDataFile, txtar.Format(&archive), 0666) + + if expected != stripAnsiControlSequencesAndNewline(observed.Data) { + t.Errorf("Fraction Timezones: Mismatched highlight markers: Check git diff %s", testDataFile) + } +} + // Test all vertical alignments, from the perspectives of different local zones func TestLocalTimezones(t *testing.T) { testDataFile := "testdata/view/test-local-timezones.txt" From 6055a4debee0661e9f22d3b151b6c15d87c07e85 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Fri, 25 Oct 2024 15:51:17 +1100 Subject: [PATCH 29/30] view_test.go: Test new weekly key mappings per 31f3810 --- view_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/view_test.go b/view_test.go index 1934479..1443db6 100644 --- a/view_test.go +++ b/view_test.go @@ -198,7 +198,7 @@ func TestFractionalTimezoneOffsets(t *testing.T) { {"Start time", "2017-11-05T00:29:02Z", ""}, {"Plus 1 hour", "2017-11-05T01:29:02Z", "l"}, {"Minus 15 minutes", "2017-11-05T01:14:02Z", "---------------"}, - {"Return to start", "2017-11-05T00:29:02Z", "HL<>+++++++++++++++h"}, + {"Return to start", "2017-11-05T00:29:02Z", "HLpn+++++++++++++++h"}, {"Minus 1 hour, date changed", "2017-11-04T23:29:02Z", "h"}, {"Return to start", "2017-11-05T00:29:02Z", "l"}, } From 498e6cacacc0d866c94345a5d5a067707853c018 Mon Sep 17 00:00:00 2001 From: James Devenish Date: Fri, 25 Oct 2024 15:56:10 +1100 Subject: [PATCH 30/30] view_test.go: Test zero-minute key mapping --- .../view/test-fractional-timezone-offsets.txt | 37 +++++++++++++++++++ view_test.go | 1 + 2 files changed, 38 insertions(+) diff --git a/testdata/view/test-fractional-timezone-offsets.txt b/testdata/view/test-fractional-timezone-offsets.txt index 4fb24a1..c7088b1 100644 --- a/testdata/view/test-fractional-timezone-offsets.txt +++ b/testdata/view/test-fractional-timezone-offsets.txt @@ -227,3 +227,40 @@ Check the following: πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:29, Sat Nov 04, 2017 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 πŸ“† Sun 05 +-- Zero minutes (2017-11-05T00:00:00Z = 1509840000) -- + + What time is it? + + πŸ•› (UTC) UTC 00:00, Sun Nov 05, 2017 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + πŸ“† Sun 05 + πŸ• (CET) Europe/Paris 01:00, Sun Nov 05, 2017 + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 + πŸ“† Mon 06 + πŸ•‘ (IST) Israel 02:00, Sun Nov 05, 2017 + 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 + πŸ“† Mon 06 + πŸ•” (IST) Asia/Calcutta 05:30, Sun Nov 05, 2017 + 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 + πŸ“† Mon 06 + πŸ•— (+0845) Australia/Eucla 08:45, Sun Nov 05, 2017 + 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 + πŸ“† Mon 06 + πŸ•™ (AEDT) Australia/Sydney 11:00, Sun Nov 05, 2017 + 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 + πŸ“† Mon 06 + πŸ•‘ (+14) Pacific/Kiritimati 14:00, Sun Nov 05, 2017 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Mon 06 + πŸ•‘ (HST) Pacific/Honolulu 14:00, Sat Nov 04, 2017 + 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + πŸ“† Sun 05 + πŸ•– (CDT) US/Central 19:00, Sat Nov 04, 2017 + 19 20 21 22 23 0 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 + πŸ“† Sun 05β‰ DST + πŸ•— (CDT) Cuba 20:00, Sat Nov 04, 2017 + 20 21 22 23 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 + πŸ“† Sun 05β‰ DST + πŸ•˜ (-03) America/Argentina/ComodRivadavia 21:00, Sat Nov 04, 2017 + 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + πŸ“† Sun 05 diff --git a/view_test.go b/view_test.go index 1443db6..28b991c 100644 --- a/view_test.go +++ b/view_test.go @@ -201,6 +201,7 @@ func TestFractionalTimezoneOffsets(t *testing.T) { {"Return to start", "2017-11-05T00:29:02Z", "HLpn+++++++++++++++h"}, {"Minus 1 hour, date changed", "2017-11-04T23:29:02Z", "h"}, {"Return to start", "2017-11-05T00:29:02Z", "l"}, + {"Zero minutes", "2017-11-05T00:00:00Z", "0"}, } start, err := time.Parse(time.RFC3339, tests[0].datetime)