Skip to content

Commit c2920d7

Browse files
authored
feat(civil): add Compare method to Date, Time, and DateTime (#10193)
1 parent 66581c4 commit c2920d7

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

civil/civil.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,17 @@ func (d Date) After(d2 Date) bool {
111111
return d2.Before(d)
112112
}
113113

114+
// Compare compares d and d2. If d is before d2, it returns -1;
115+
// if d is after d2, it returns +1; otherwise it returns 0.
116+
func (d Date) Compare(d2 Date) int {
117+
if d.Before(d2) {
118+
return -1
119+
} else if d.After(d2) {
120+
return +1
121+
}
122+
return 0
123+
}
124+
114125
// IsZero reports whether date fields are set to their default value.
115126
func (d Date) IsZero() bool {
116127
return (d.Year == 0) && (int(d.Month) == 0) && (d.Day == 0)
@@ -209,6 +220,17 @@ func (t Time) After(t2 Time) bool {
209220
return t2.Before(t)
210221
}
211222

223+
// Compare compares t and t2. If t is before t2, it returns -1;
224+
// if t is after t2, it returns +1; otherwise it returns 0.
225+
func (t Time) Compare(t2 Time) int {
226+
if t.Before(t2) {
227+
return -1
228+
} else if t.After(t2) {
229+
return +1
230+
}
231+
return 0
232+
}
233+
212234
// MarshalText implements the encoding.TextMarshaler interface.
213235
// The output is the result of t.String().
214236
func (t Time) MarshalText() ([]byte, error) {
@@ -302,6 +324,12 @@ func (dt DateTime) After(dt2 DateTime) bool {
302324
return dt2.Before(dt)
303325
}
304326

327+
// Compare compares dt and dt2. If dt is before dt2, it returns -1;
328+
// if dt is after dt2, it returns +1; otherwise it returns 0.
329+
func (dt DateTime) Compare(dt2 DateTime) int {
330+
return dt.In(time.UTC).Compare(dt2.In(time.UTC))
331+
}
332+
305333
// IsZero reports whether datetime fields are set to their default value.
306334
func (dt DateTime) IsZero() bool {
307335
return dt.Date.IsZero() && dt.Time.IsZero()

civil/civil_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,21 @@ func TestDateAfter(t *testing.T) {
193193
}
194194
}
195195

196+
func TestDateCompare(t *testing.T) {
197+
for _, test := range []struct {
198+
d1, d2 Date
199+
want int
200+
}{
201+
{Date{2016, 12, 31}, Date{2017, 1, 1}, -1},
202+
{Date{2016, 1, 1}, Date{2016, 1, 1}, 0},
203+
{Date{2016, 12, 31}, Date{2016, 12, 30}, +1},
204+
} {
205+
if got := test.d1.Compare(test.d2); got != test.want {
206+
t.Errorf("%v.Compare(%v): got %d, want %d", test.d1, test.d2, got, test.want)
207+
}
208+
}
209+
}
210+
196211
func TestDateIsZero(t *testing.T) {
197212
for _, test := range []struct {
198213
date Date
@@ -330,6 +345,27 @@ func TestTimeAfter(t *testing.T) {
330345
}
331346
}
332347

348+
func TestTimeCompare(t *testing.T) {
349+
for _, test := range []struct {
350+
t1, t2 Time
351+
want int
352+
}{
353+
{Time{12, 0, 0, 0}, Time{14, 0, 0, 0}, -1},
354+
{Time{12, 20, 0, 0}, Time{12, 30, 0, 0}, -1},
355+
{Time{12, 20, 10, 0}, Time{12, 20, 20, 0}, -1},
356+
{Time{12, 20, 10, 5}, Time{12, 20, 10, 10}, -1},
357+
{Time{14, 0, 0, 0}, Time{12, 0, 0, 0}, +1},
358+
{Time{12, 30, 0, 0}, Time{12, 20, 0, 0}, +1},
359+
{Time{12, 20, 20, 0}, Time{12, 20, 10, 0}, +1},
360+
{Time{12, 20, 10, 10}, Time{12, 20, 10, 5}, +1},
361+
{Time{12, 20, 10, 5}, Time{12, 20, 10, 5}, 0},
362+
} {
363+
if got := test.t1.Compare(test.t2); got != test.want {
364+
t.Errorf("%v.Compare(%v): got %d, want %d", test.t1, test.t2, got, test.want)
365+
}
366+
}
367+
}
368+
333369
func TestDateTimeToString(t *testing.T) {
334370
for _, test := range []struct {
335371
str string
@@ -453,6 +489,27 @@ func TestDateTimeAfter(t *testing.T) {
453489
}
454490
}
455491

492+
func TestDateTimeCompare(t *testing.T) {
493+
d1 := Date{2016, 12, 31}
494+
d2 := Date{2017, 1, 1}
495+
t1 := Time{5, 6, 7, 8}
496+
t2 := Time{5, 6, 7, 9}
497+
for _, test := range []struct {
498+
dt1, dt2 DateTime
499+
want int
500+
}{
501+
{DateTime{d1, t1}, DateTime{d2, t1}, -1},
502+
{DateTime{d1, t1}, DateTime{d1, t2}, -1},
503+
{DateTime{d2, t1}, DateTime{d1, t1}, +1},
504+
{DateTime{d1, t2}, DateTime{d1, t1}, +1},
505+
{DateTime{d2, t1}, DateTime{d2, t1}, 0},
506+
} {
507+
if got := test.dt1.Compare(test.dt2); got != test.want {
508+
t.Errorf("%v.Compare(%v): got %d, want %d", test.dt1, test.dt2, got, test.want)
509+
}
510+
}
511+
}
512+
456513
func TestDateTimeIsZero(t *testing.T) {
457514
for _, test := range []struct {
458515
dt DateTime

0 commit comments

Comments
 (0)