Files
olebedev-when/rules/common/timezone_test.go
T
dualfroz fa0fa5b55b feat(rules): add an opt-in timezone rule (#23)
common.Timezone matches UTC and GMT with an optional offset (UTC+2,
GMT-05:30, GMT+0530) and a small table of upper case abbreviations
(EST, PDT, CET, ...), and sets Context.Location, so "10 pm EST" comes back
as 22:00 in a -05:00 zone. A timezone alone does not count as a match.
It is not added to common.All, so existing parsers behave as before.
2026-10-03 02:49:55 +02:00

45 lines
1.3 KiB
Go

package common_test
import (
"testing"
"time"
"github.com/olebedev/when"
"github.com/olebedev/when/rules"
"github.com/olebedev/when/rules/common"
"github.com/olebedev/when/rules/en"
"github.com/stretchr/testify/require"
)
func TestTimezone(t *testing.T) {
fixt := []Fixture{
{"call me at 10 pm EST", 11, "10 pm EST", 27 * time.Hour},
{"call me at 10 pm PDT", 11, "10 pm PDT", 29 * time.Hour},
{"call me at 10 pm CEST", 11, "10 pm CEST", 20 * time.Hour},
{"at 22:00 UTC", 3, "22:00 UTC", 22 * time.Hour},
{"at 22:00 utc+2", 3, "22:00 utc+2", 20 * time.Hour},
{"at 22:00 GMT-05:30", 3, "22:00 GMT-05:30", 27*time.Hour + 30*time.Minute},
{"at 22:00 GMT+0530", 3, "22:00 GMT+0530", 16*time.Hour + 30*time.Minute},
// abbreviations only in upper case, "est" is left alone
{"call me at 10 pm est", 11, "10 pm", 22 * time.Hour},
}
w := when.New(nil)
w.Add(en.All...)
w.Add(common.Timezone(rules.Override))
ApplyFixtures(t, "common.Timezone", w, fixt)
nilFixt := []Fixture{
{"the EST office", 0, "a timezone alone is not a time", 0},
}
ApplyFixturesNil(t, "common.Timezone nil", w, nilFixt)
res, err := w.Parse("call me at 10 pm EST", null)
require.Nil(t, err)
name, offset := res.Time.Zone()
require.Equal(t, "EST", name)
require.Equal(t, -5*60*60, offset)
}