From da84d95aa3eee2795123268fe165fecb6caaf2b4 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Mon, 9 Sep 2024 11:35:17 +0800 Subject: [PATCH] feat: add GenerateDatetimesBetween in datetime package --- datetime/datetime.go | 23 ++++++++++++ datetime/datetime_example_test.go | 17 +++++++++ datetime/datetime_test.go | 59 +++++++++++++++++++++++++++++++ docs/api/packages/datetime.md | 38 ++++++++++++++++++++ docs/en/api/packages/datetime.md | 38 ++++++++++++++++++++ 5 files changed, 175 insertions(+) diff --git a/datetime/datetime.go b/datetime/datetime.go index 9db6d36..fe9d836 100644 --- a/datetime/datetime.go +++ b/datetime/datetime.go @@ -420,3 +420,26 @@ func DaysBetween(start, end time.Time) int { return days } + +// GenerateDatetimesBetween returns a slice of strings between two times. +// layout: the format of the datetime string +// interval: the interval between two datetimes +// Play: todo +func GenerateDatetimesBetween(start, end time.Time, layout string, interval string) ([]string, error) { + var result []string + + if start.After(end) { + start, end = end, start + } + + duration, err := time.ParseDuration(interval) + if err != nil { + return nil, err + } + + for current := start; !current.After(end); current = current.Add(duration) { + result = append(result, current.Format(layout)) + } + + return result, nil +} diff --git a/datetime/datetime_example_test.go b/datetime/datetime_example_test.go index 3abf5a0..99098bc 100644 --- a/datetime/datetime_example_test.go +++ b/datetime/datetime_example_test.go @@ -420,3 +420,20 @@ func ExampleDaysBetween() { // Output: // 9 } + +func ExampleGenerateDatetimesBetween() { + start := time.Date(2024, time.September, 1, 0, 0, 0, 0, time.UTC) + end := time.Date(2024, time.September, 1, 2, 0, 0, 0, time.UTC) + + layout := "2006-01-02 15:04:05" + interval := "1h" + + result, err := GenerateDatetimesBetween(start, end, layout, interval) + + fmt.Println(result) + fmt.Println(err) + + // Output: + // [2024-09-01 00:00:00 2024-09-01 01:00:00 2024-09-01 02:00:00] + // +} diff --git a/datetime/datetime_test.go b/datetime/datetime_test.go index 9b54661..ee90ff9 100644 --- a/datetime/datetime_test.go +++ b/datetime/datetime_test.go @@ -462,3 +462,62 @@ func TestDaysBetween(t *testing.T) { assert.Equal(tt.expected, result) } } + +func TestGenerateDatetimesBetween(t *testing.T) { + t.Parallel() + + assert := internal.NewAssert(t, "TestGenerateDatetimesBetween") + + tests := []struct { + start time.Time + end time.Time + layout string + interval string + expected []string + }{ + { + start: time.Date(2024, time.September, 1, 0, 0, 0, 0, time.UTC), + end: time.Date(2024, time.September, 1, 2, 0, 0, 0, time.UTC), + layout: "2006-01-02 15:04:05", + interval: "30m", + expected: []string{ + "2024-09-01 00:00:00", + "2024-09-01 00:30:00", + "2024-09-01 01:00:00", + "2024-09-01 01:30:00", + "2024-09-01 02:00:00", + }, + }, + { + start: time.Date(2024, time.September, 1, 0, 0, 0, 0, time.UTC), + end: time.Date(2024, time.September, 1, 0, 0, 0, 0, time.UTC), + layout: "2006-01-02 15:04:05", + interval: "1h", + expected: []string{"2024-09-01 00:00:00"}, + }, + { + start: time.Date(2024, time.September, 1, 0, 0, 0, 0, time.UTC), + end: time.Date(2024, time.September, 1, 3, 0, 0, 0, time.UTC), + layout: "2006-01-02 15:04:05", + interval: "2h", + expected: []string{ + "2024-09-01 00:00:00", + "2024-09-01 02:00:00", + }, + }, + } + + for _, tt := range tests { + result, err := GenerateDatetimesBetween(tt.start, tt.end, tt.layout, tt.interval) + + assert.Equal(tt.expected, result) + assert.IsNil(err) + } + + t.Run("Invalid interval", func(t *testing.T) { + _, err := GenerateDatetimesBetween(time.Now(), time.Now(), "2006-01-02 15:04:05", "invalid") + if err == nil { + t.Fatal("Expected error, got nil") + } + }) +} diff --git a/docs/api/packages/datetime.md b/docs/api/packages/datetime.md index 953d087..c224fac 100644 --- a/docs/api/packages/datetime.md +++ b/docs/api/packages/datetime.md @@ -1531,4 +1531,42 @@ func main() { // Output: // 9 } +``` + +### GenerateDatetimesBetween + +

生成从start到end的所有日期时间的字符串列表。layout参数表示时间格式,例如"2006-01-02 15:04:05",interval参数表示时间间隔,例如"1h"表示1小时,"30m"表示30分钟。

+ +函数签名: + +```go +func GenerateDatetimesBetween(start, end time.Time, layout string, interval string) ([]string, error) +``` + +示例:[运行]() + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/datetime" +) + +func main() { + start := time.Date(2024, time.September, 1, 0, 0, 0, 0, time.UTC) + end := time.Date(2024, time.September, 1, 2, 0, 0, 0, time.UTC) + + layout := "2006-01-02 15:04:05" + interval := "1h" + + result, err := datetime.GenerateDatetimesBetween(start, end, layout, interval) + + fmt.Println(result) + fmt.Println(err) + + // Output: + // [2024-09-01 00:00:00 2024-09-01 01:00:00 2024-09-01 02:00:00] + // +} ``` \ No newline at end of file diff --git a/docs/en/api/packages/datetime.md b/docs/en/api/packages/datetime.md index a19fb92..9222db1 100644 --- a/docs/en/api/packages/datetime.md +++ b/docs/en/api/packages/datetime.md @@ -1530,4 +1530,42 @@ func main() { // Output: // 9 } +``` + +### GenerateDatetimesBetween + +

Returns a slice of strings between two times. `layout`: the format of the datetime string.`interval`: the interval between two datetimes.

+ +Signature: + +```go +func GenerateDatetimesBetween(start, end time.Time, layout string, interval string) ([]string, error) +``` + +Example:[Run]() + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/datetime" +) + +func main() { + start := time.Date(2024, time.September, 1, 0, 0, 0, 0, time.UTC) + end := time.Date(2024, time.September, 1, 2, 0, 0, 0, time.UTC) + + layout := "2006-01-02 15:04:05" + interval := "1h" + + result, err := datetime.GenerateDatetimesBetween(start, end, layout, interval) + + fmt.Println(result) + fmt.Println(err) + + // Output: + // [2024-09-01 00:00:00 2024-09-01 01:00:00 2024-09-01 02:00:00] + // +} ``` \ No newline at end of file