From e063f34997f79863dd39b2db7b0b13d834e68b7f Mon Sep 17 00:00:00 2001 From: David Dworken Date: Wed, 7 Sep 2022 22:53:48 -0700 Subject: [PATCH] Improve datetime parsing for the after: and before: search atoms --- client/data/data.go | 2 +- client/data/data_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/client/data/data.go b/client/data/data.go index 959f2b1..74b14b9 100644 --- a/client/data/data.go +++ b/client/data/data.go @@ -128,6 +128,7 @@ func DecryptHistoryEntry(userSecret string, entry shared.EncHistoryEntry) (Histo } func parseTimeGenerously(input string) (time.Time, error) { + input = strings.ReplaceAll(input, "_", " ") return dateparse.ParseLocal(input) } @@ -206,7 +207,6 @@ func parseAtomizedToken(token string) (string, interface{}, error) { } return "(CAST(strftime(\"%s\",start_time) AS INTEGER) < ?)", t.Unix(), nil case "after": - // TODO: This doesn't support precise timestamps containg a space. Can we do better here? t, err := parseTimeGenerously(val) if err != nil { return "", nil, fmt.Errorf("failed to parse after:%s as a timestamp: %v", val, err) diff --git a/client/data/data_test.go b/client/data/data_test.go index c343edc..53188b8 100644 --- a/client/data/data_test.go +++ b/client/data/data_test.go @@ -29,16 +29,41 @@ func TestParseTimeGenerously(t *testing.T) { if ts.Unix() != 1136243040 { t.Fatalf("parsed time incorrectly: %d", ts.Unix()) } + ts, err = parseTimeGenerously("2006-01-02 T15:04:00 -08:00") + shared.Check(t, err) + if ts.Unix() != 1136243040 { + t.Fatalf("parsed time incorrectly: %d", ts.Unix()) + } + ts, err = parseTimeGenerously("2006-01-02_T15:04:00_-08:00") + shared.Check(t, err) + if ts.Unix() != 1136243040 { + t.Fatalf("parsed time incorrectly: %d", ts.Unix()) + } ts, err = parseTimeGenerously("2006-01-02T15:04:00") shared.Check(t, err) if ts.Year() != 2006 || ts.Month() != time.January || ts.Day() != 2 || ts.Hour() != 15 || ts.Minute() != 4 || ts.Second() != 0 { t.Fatalf("parsed time incorrectly: %d", ts.Unix()) } + ts, err = parseTimeGenerously("2006-01-02_T15:04:00") + shared.Check(t, err) + if ts.Year() != 2006 || ts.Month() != time.January || ts.Day() != 2 || ts.Hour() != 15 || ts.Minute() != 4 || ts.Second() != 0 { + t.Fatalf("parsed time incorrectly: %d", ts.Unix()) + } + ts, err = parseTimeGenerously("2006-01-02_15:04:00") + shared.Check(t, err) + if ts.Year() != 2006 || ts.Month() != time.January || ts.Day() != 2 || ts.Hour() != 15 || ts.Minute() != 4 || ts.Second() != 0 { + t.Fatalf("parsed time incorrectly: %d", ts.Unix()) + } ts, err = parseTimeGenerously("2006-01-02T15:04") shared.Check(t, err) if ts.Year() != 2006 || ts.Month() != time.January || ts.Day() != 2 || ts.Hour() != 15 || ts.Minute() != 4 || ts.Second() != 0 { t.Fatalf("parsed time incorrectly: %d", ts.Unix()) } + ts, err = parseTimeGenerously("2006-01-02_15:04") + shared.Check(t, err) + if ts.Year() != 2006 || ts.Month() != time.January || ts.Day() != 2 || ts.Hour() != 15 || ts.Minute() != 4 || ts.Second() != 0 { + t.Fatalf("parsed time incorrectly: %d", ts.Unix()) + } ts, err = parseTimeGenerously("2006-01-02") shared.Check(t, err) if ts.Year() != 2006 || ts.Month() != time.January || ts.Day() != 2 || ts.Hour() != 0 || ts.Minute() != 0 || ts.Second() != 0 {