mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-10 15:52:27 +08:00
feat: add GenerateDatetimesBetween in datetime package
This commit is contained in:
@@ -420,3 +420,26 @@ func DaysBetween(start, end time.Time) int {
|
|||||||
|
|
||||||
return days
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -420,3 +420,20 @@ func ExampleDaysBetween() {
|
|||||||
// Output:
|
// Output:
|
||||||
// 9
|
// 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]
|
||||||
|
// <nil>
|
||||||
|
}
|
||||||
|
|||||||
@@ -462,3 +462,62 @@ func TestDaysBetween(t *testing.T) {
|
|||||||
assert.Equal(tt.expected, result)
|
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")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -1531,4 +1531,42 @@ func main() {
|
|||||||
// Output:
|
// Output:
|
||||||
// 9
|
// 9
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GenerateDatetimesBetween">GenerateDatetimesBetween</span>
|
||||||
|
|
||||||
|
<p>生成从start到end的所有日期时间的字符串列表。layout参数表示时间格式,例如"2006-01-02 15:04:05",interval参数表示时间间隔,例如"1h"表示1小时,"30m"表示30分钟。</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GenerateDatetimesBetween(start, end time.Time, layout string, interval string) ([]string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:<span style="float:right;display:inline-block;">[运行]()</span></b>
|
||||||
|
|
||||||
|
```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]
|
||||||
|
// <nil>
|
||||||
|
}
|
||||||
```
|
```
|
||||||
@@ -1530,4 +1530,42 @@ func main() {
|
|||||||
// Output:
|
// Output:
|
||||||
// 9
|
// 9
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="GenerateDatetimesBetween">GenerateDatetimesBetween</span>
|
||||||
|
|
||||||
|
<p>Returns a slice of strings between two times. `layout`: the format of the datetime string.`interval`: the interval between two datetimes.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GenerateDatetimesBetween(start, end time.Time, layout string, interval string) ([]string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:<span style="float:right;display:inline-block;">[Run]()</span></b>
|
||||||
|
|
||||||
|
```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]
|
||||||
|
// <nil>
|
||||||
|
}
|
||||||
```
|
```
|
||||||
Reference in New Issue
Block a user