Skip to content

Commit 3289932

Browse files
committed
Adding new features from systemd.time
Adding the `ago` keywords to Adjustedtime. Add a new function that will translate common keywords `now`, `today`, `tomorrow`, `yesterday`.
1 parent 14c6bb4 commit 3289932

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

pkg/systemdtime/systemdtime.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package systemdtime
22

33
import (
4+
"errors"
45
"fmt"
56
"regexp"
67
"strconv"
@@ -69,6 +70,8 @@ func ParseDuration(raw string) (time.Duration, error) {
6970
return 0, fmt.Errorf("ParseDuration: incorrect format for raw input %s", raw)
7071
}
7172

73+
isAgo := strings.Contains(raw, "ago")
74+
7275
reNegative, err := regexp.Compile(`^\s*-.*`)
7376
if err != nil {
7477
return 0, err
@@ -114,9 +117,29 @@ func ParseDuration(raw string) (time.Duration, error) {
114117
totalDuration *= -1
115118
}
116119

120+
if isAgo {
121+
totalDuration *= -1
122+
}
123+
117124
return totalDuration, nil
118125
}
119126

127+
func TranslateWords(raw string) (time.Time, error) {
128+
switch raw {
129+
case "now":
130+
return time.Now(), nil
131+
case "today":
132+
return time.Now().Truncate(time.Hour * 24), nil
133+
case "yesterday":
134+
return time.Now().Add(time.Hour * -24).Truncate(time.Hour * 24), nil
135+
case "tomorrow":
136+
return time.Now().Add(time.Hour * 24).Truncate(time.Hour * 24), nil
137+
default:
138+
var t time.Time
139+
return t, errors.New("no matching words")
140+
}
141+
}
142+
120143
// AdjustTime takes a systemd time adjustment string and uses it to modify a time.Time
121144
func AdjustTime(original time.Time, adjustment string) (time.Time, error) {
122145
duration, err := ParseDuration(adjustment)

pkg/systemdtime/systemdtime_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,11 @@ func TestToDuration(t *testing.T) {
107107
" 2 min 23sec": 2*time.Minute + 23*time.Second,
108108
"1sec": 1 * time.Second,
109109
"1 hour": 1 * time.Hour,
110+
"-1hour": -1 * time.Hour,
111+
"-1hour ago": 1 * time.Hour,
110112
"-2day": -2 * 24 * time.Hour,
113+
"2day ago": -2 * 24 * time.Hour,
114+
"-2day ago": 2 * 24 * time.Hour,
111115
"10 minutes": 10 * time.Minute,
112116
}
113117

@@ -123,6 +127,26 @@ func TestToDuration(t *testing.T) {
123127
}
124128
}
125129

130+
func TestTranslatedWords(t *testing.T) {
131+
testWord := func(t *testing.T, raw string, shouldSucceed time.Time) {
132+
got, err := TranslateWords(raw)
133+
if raw == "now" {
134+
got = got.Truncate(time.Second)
135+
}
136+
if err != nil {
137+
t.Fatalf("Input '%s' failed: err is '%v', and shouldSucceed set to %v", raw, err, shouldSucceed)
138+
}
139+
if !got.Equal(shouldSucceed) {
140+
t.Fatalf("Input '%s' failed: got %v, and shouldSucceed set to %v", raw, got, shouldSucceed)
141+
}
142+
}
143+
144+
testWord(t, "now", time.Now().Truncate(time.Second))
145+
testWord(t, "today", time.Now().Truncate(time.Hour*24))
146+
testWord(t, "yesterday", time.Now().Add(time.Hour*-24).Truncate(time.Hour*24))
147+
testWord(t, "tomorrow", time.Now().Add(time.Hour*24).Truncate(time.Hour*24))
148+
}
149+
126150
func TestAdjustTime(t *testing.T) {
127151
time1 := time.Date(2012, time.May, 12, 5, 0, 0, 0, time.UTC)
128152
time1Mod, err := AdjustTime(time1, " 4 days 2 hr")

0 commit comments

Comments
 (0)