feat: dateutils, maputils, sliceutils.

This commit is contained in:
tx7do
2023-11-06 13:54:50 +08:00
parent c37d726b4c
commit 83bb818ade
9 changed files with 1011 additions and 1 deletions

32
dateutils/dateutils.go Normal file
View File

@@ -0,0 +1,32 @@
package dateutils
import "time"
// Floor - takes a datetime and return a datetime from the same day at 00:00:00 (UTC).
func Floor(t time.Time) time.Time {
return t.UTC().Truncate(time.Hour * 24)
}
// Ceil - takes a datetime and return a datetime from the same day at 23:59:59 (UTC).
func Ceil(t time.Time) time.Time {
// add 24 hours so that we are dealing with tomorrow's datetime
// Floor
// Substract one second and we have today at 23:59:59
return Floor(t.Add(time.Hour * 24)).Add(time.Second * -1)
}
func BeforeOrEqual(milestone time.Time, date time.Time) bool {
return date.UTC().Before(milestone) || date.UTC().Equal(milestone)
}
func AfterOrEqual(milestone time.Time, date time.Time) bool {
return date.UTC().After(milestone) || date.UTC().Equal(milestone)
}
// Overlap - returns true if two date intervals overlap.
func Overlap(start1 time.Time, end1 time.Time, start2 time.Time, end2 time.Time) bool {
return (AfterOrEqual(start2, start1) && BeforeOrEqual(end2, start1)) ||
(AfterOrEqual(start2, end1) && BeforeOrEqual(end2, end1)) ||
(AfterOrEqual(start1, start2) && BeforeOrEqual(end1, start2)) ||
(AfterOrEqual(start1, end2) && BeforeOrEqual(end1, end2))
}

View File

@@ -0,0 +1,66 @@
package dateutils_test
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/tx7do/go-utils/dateutils"
)
func TestFloor(t *testing.T) {
now := time.Now()
assert.Equal(t, "00:00:00", dateutils.Floor(now).Format("15:04:05"))
}
func TestCeil(t *testing.T) {
now := time.Now()
assert.Equal(t, "23:59:59", dateutils.Ceil(now).Format("15:04:05"))
}
func TestBeforeOrEqual(t *testing.T) {
milestone, _ := time.Parse("2006-01-02", "2023-01-01")
dBefore, _ := time.Parse("2006-01-02", "2022-12-31")
dEqual, _ := time.Parse("2006-01-02", "2023-01-01")
dAfter, _ := time.Parse("2006-01-02", "2023-01-31")
assert.Equal(t, true, dateutils.BeforeOrEqual(milestone, dBefore))
assert.Equal(t, true, dateutils.BeforeOrEqual(milestone, dEqual))
assert.Equal(t, false, dateutils.BeforeOrEqual(milestone, dAfter))
}
func TestAfterOrEqual(t *testing.T) {
milestone, _ := time.Parse("2006-01-02", "2023-01-01")
dBefore, _ := time.Parse("2006-01-02", "2022-12-31")
dEqual, _ := time.Parse("2006-01-02", "2023-01-01")
dAfter, _ := time.Parse("2006-01-02", "2023-01-31")
assert.Equal(t, false, dateutils.AfterOrEqual(milestone, dBefore))
assert.Equal(t, true, dateutils.AfterOrEqual(milestone, dEqual))
assert.Equal(t, true, dateutils.AfterOrEqual(milestone, dAfter))
}
func TestOverlap(t *testing.T) {
s1, _ := time.Parse("2006-01-02", "2022-12-28")
e1, _ := time.Parse("2006-01-02", "2022-12-31")
s2, _ := time.Parse("2006-01-02", "2022-12-30")
e2, _ := time.Parse("2006-01-02", "2023-01-01")
s3, _ := time.Parse("2006-01-02", "2023-01-02")
e3, _ := time.Parse("2006-01-02", "2023-01-04")
assert.Equal(t, true, dateutils.Overlap(s1, e1, s2, e2))
assert.Equal(t, false, dateutils.Overlap(s1, e1, s3, e3))
s4, _ := time.Parse("2006-01-02", "2023-07-13")
e4, _ := time.Parse("2006-01-02", "2023-07-14")
s5, _ := time.Parse("2006-01-02", "2023-07-10")
e5, _ := time.Parse("2006-01-02", "2023-07-17")
assert.Equal(t, true, dateutils.Overlap(s4, e4, s5, e5))
assert.Equal(t, true, dateutils.Overlap(s5, e5, s4, e4))
}