mirror of
https://github.com/duke-git/lancet.git
synced 2026-03-01 00:35:28 +08:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7b28ee864 | ||
|
|
f2823014f2 | ||
|
|
4181c42805 |
@@ -1,51 +1,51 @@
|
||||
-----BEGIN rsa private key-----
|
||||
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
|
||||
-----END rsa private key-----
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
-----BEGIN rsa public key-----
|
||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5bsUtFZmae/9D6ncFO62
|
||||
EaaGxoc0+/ZXqi2OtHZYpaDV0/bLV0gegTIQ5+kUJr0VQ/9GMEnALdGNBT9bJ0Mv
|
||||
7VWZijYoyUOQ4fB4k8vaytFcug/kMYkvE+pvXg6JMbp9rZXXiz5djabAKv9ZrClU
|
||||
ugnK8KPtn+6SnCC4oKVhMRj2G+5LAxYhiidSrnK8xkgts4OwLTzqWw9N2QMvdkXj
|
||||
wwaIG5UeDqeal0/hna402j6/QbANq/brR2eXHfxVrX9eMKBdA6OmVPeFUVb+JR/p
|
||||
2TvNEEXRM/DmPP70HXg08L1XIjvaZm7MNbcqS+6AUciwWNshm8o4vFkyjN1E3U5s
|
||||
yYptCEtDYA/+GPFzbzCzSyaTxBpdxSI6wB9Vt+Hk/DzS3RBoxj4xYk2LmPDX6i86
|
||||
skBTQ9X3sUdWUoelyAko8JW+sXlXMQP05yNyBY+fayzhHfYYsi+4jpV4uLMY7bXe
|
||||
ySffROdiEQ9xXCf3trq2isKReHhYhmu7mnjIn+CcJZ909XzMJmN6zEeSTeXZMDqP
|
||||
K1dv3Yom6n/oRpR+rfx8JYCKTFR/+QYPGR1kc+LUyqgFcWwTexf3CfL3ck0H0iG7
|
||||
ivGV6wm9xvpOxbQb+4/79jQLtoBC8goU9KXuxYEs2aE4/LM8zY4QpHDIZYLoHnz2
|
||||
xSgm+rlh6E4p0t5mik3wOAUCAwEAAQ==
|
||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA77XqVTCS3dmAd5FnAvrT
|
||||
PcXrVetPzJeksmqqu4EjFv6Fe4NFdZQIWtkjgJQ4v27KpZXUL2ExkJhodrfRegHF
|
||||
gq9xiy822umUu6bCyBva1YxFQPevKqgPLY7n6wB3PJRnwnSszQCsUDyBC8JnqbeL
|
||||
41qcRiBAjXSh0BFMERSl3F0AViGkVCRCmKuc9612Gi6iuw11cFbLUPqLL+YNk+NI
|
||||
gW398nYUUNeacMG12h02n3YJ8HD5Q16PhdJ7Z93aAsDgKzl7dT5tyyv3w2p2wOse
|
||||
1GPMfQffZQA+gXmw7+GJImJu3DtWKY0cQqzO1Wsa5t+YxMf0A12AYGJa+Y0aPgr8
|
||||
Vl8LY++NdujnazwsgzTJm94uuqHZiv+mtsYIpkLbuMWmBce05G8MtS0O9IabgBLx
|
||||
rbUQvYk9Myv/ff4BgWkO06SAUq7GGUn0cI+EglyYYJCgeeBSQid7daQ8M4Idb9ve
|
||||
Go2f7KJqHecRf3fzRwlbMMjoo0Nw19FAx/tQm1LTg1NxCaheAFI1UzUTCUAZE/X9
|
||||
QwviTuHXTnfjd0wfxeVaJRMyK9efOJuALAit9rtxyfm1fPRztvPwIrpy/wMUQ+7i
|
||||
8xAEPWa+kXFtVLTqEwGnX3QYZf/NGJ/9RZmtpcxgpHIJ6OEyqVUYKKeU7R3uW7i3
|
||||
pv3au9lZ5Id1AvAqQWG8TvkCAwEAAQ==
|
||||
-----END rsa public key-----
|
||||
|
||||
@@ -100,6 +100,61 @@ func AddYear(t time.Time, year int64) time.Time {
|
||||
return t.AddDate(int(year), 0, 0)
|
||||
}
|
||||
|
||||
// AddDaySafe add or sub days to the time and ensure that the returned date does not exceed the valid date of the target year and month.
|
||||
// Play: todo
|
||||
func AddDaySafe(t time.Time, days int) time.Time {
|
||||
t = t.AddDate(0, 0, days)
|
||||
year, month, day := t.Date()
|
||||
|
||||
lastDayOfMonth := time.Date(year, month+1, 0, 0, 0, 0, 0, t.Location()).Day()
|
||||
|
||||
if day > lastDayOfMonth {
|
||||
t = time.Date(year, month, lastDayOfMonth, t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location())
|
||||
}
|
||||
|
||||
return t
|
||||
}
|
||||
|
||||
// AddMonthSafe add or sub months to the time and ensure that the returned date does not exceed the valid date of the target year and month.
|
||||
// Play: todo
|
||||
func AddMonthSafe(t time.Time, months int) time.Time {
|
||||
year := t.Year()
|
||||
month := int(t.Month()) + months
|
||||
|
||||
for month > 12 {
|
||||
month -= 12
|
||||
year++
|
||||
}
|
||||
for month < 1 {
|
||||
month += 12
|
||||
year--
|
||||
}
|
||||
|
||||
daysInMonth := time.Date(year, time.Month(month+1), 0, 0, 0, 0, 0, time.UTC).Day()
|
||||
|
||||
day := t.Day()
|
||||
if day > daysInMonth {
|
||||
day = daysInMonth
|
||||
}
|
||||
|
||||
return time.Date(year, time.Month(month), day, t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location())
|
||||
}
|
||||
|
||||
// AddYearSafe add or sub years to the time and ensure that the returned date does not exceed the valid date of the target year and month.
|
||||
// Play: todo
|
||||
func AddYearSafe(t time.Time, years int) time.Time {
|
||||
year, month, day := t.Date()
|
||||
year += years
|
||||
|
||||
if month == time.February && day == 29 {
|
||||
if !IsLeapYear(year) {
|
||||
day = 28
|
||||
}
|
||||
}
|
||||
|
||||
return time.Date(year, month, day, t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location())
|
||||
}
|
||||
|
||||
// GetNowDate return format yyyy-mm-dd of current date.
|
||||
// Play: https://go.dev/play/p/PvfkPpcpBBf
|
||||
func GetNowDate() string {
|
||||
|
||||
@@ -90,6 +90,60 @@ func ExampleAddYear() {
|
||||
// 2019-01-01
|
||||
}
|
||||
|
||||
func ExampleAddDaySafe() {
|
||||
leapYearDate1, _ := time.Parse("2006-01-02", "2024-02-29")
|
||||
result1 := AddDaySafe(leapYearDate1, 1)
|
||||
|
||||
leapYearDate2, _ := time.Parse("2006-01-02", "2024-03-01")
|
||||
result2 := AddDaySafe(leapYearDate2, -1)
|
||||
|
||||
nonLeapYearDate1, _ := time.Parse("2006-01-02", "2025-02-28")
|
||||
result3 := AddDaySafe(nonLeapYearDate1, 1)
|
||||
|
||||
nonLeaYearDate2, _ := time.Parse("2006-01-02", "2025-03-01")
|
||||
result4 := AddDaySafe(nonLeaYearDate2, -1)
|
||||
|
||||
fmt.Println(result1.Format("2006-01-02"))
|
||||
fmt.Println(result2.Format("2006-01-02"))
|
||||
fmt.Println(result3.Format("2006-01-02"))
|
||||
fmt.Println(result4.Format("2006-01-02"))
|
||||
|
||||
// Output:
|
||||
// 2024-03-01
|
||||
// 2024-02-29
|
||||
// 2025-03-01
|
||||
// 2025-02-28
|
||||
}
|
||||
|
||||
func ExampleAddMonthSafe() {
|
||||
date1, _ := time.Parse("2006-01-02", "2025-01-31")
|
||||
result1 := AddMonthSafe(date1, 1)
|
||||
|
||||
date2, _ := time.Parse("2006-01-02", "2024-02-29")
|
||||
result2 := AddMonthSafe(date2, -1)
|
||||
|
||||
fmt.Println(result1.Format("2006-01-02"))
|
||||
fmt.Println(result2.Format("2006-01-02"))
|
||||
|
||||
// Output:
|
||||
// 2025-02-28
|
||||
// 2024-01-29
|
||||
}
|
||||
|
||||
func ExampleAddYearSafe() {
|
||||
date, _ := time.Parse("2006-01-02", "2020-02-29")
|
||||
|
||||
result1 := AddYearSafe(date, 1)
|
||||
result2 := AddYearSafe(date, -1)
|
||||
|
||||
fmt.Println(result1.Format("2006-01-02"))
|
||||
fmt.Println(result2.Format("2006-01-02"))
|
||||
|
||||
// Output:
|
||||
// 2021-02-28
|
||||
// 2019-02-28
|
||||
}
|
||||
|
||||
func ExampleGetNowDate() {
|
||||
result := GetNowDate()
|
||||
|
||||
|
||||
@@ -309,6 +309,129 @@ func TestAddMonth(t *testing.T) {
|
||||
|
||||
}
|
||||
|
||||
func TestAddDaySafe(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
assert := internal.NewAssert(t, "TestAddDaySafe")
|
||||
|
||||
tests := []struct {
|
||||
inputDate string
|
||||
days int
|
||||
expected string
|
||||
}{
|
||||
{"2025-01-31", 10, "2025-02-10"},
|
||||
{"2025-01-01", 30, "2025-01-31"},
|
||||
{"2025-01-31", 1, "2025-02-01"},
|
||||
{"2025-02-28", 1, "2025-03-01"},
|
||||
{"2024-02-29", 1, "2024-03-01"},
|
||||
{"2024-02-29", 365, "2025-02-28"},
|
||||
|
||||
{"2025-01-31", -10, "2025-01-21"},
|
||||
{"2025-01-01", -30, "2024-12-02"},
|
||||
{"2025-02-01", -1, "2025-01-31"},
|
||||
{"2025-03-01", -1, "2025-02-28"},
|
||||
{"2024-03-01", -1, "2024-02-29"},
|
||||
|
||||
{"2025-01-31", -31, "2024-12-31"},
|
||||
{"2025-12-31", 1, "2026-01-01"},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
date, _ := time.Parse("2006-01-02", tt.inputDate)
|
||||
result := AddDaySafe(date, tt.days)
|
||||
assert.Equal(tt.expected, result.Format("2006-01-02"))
|
||||
}
|
||||
}
|
||||
|
||||
func TestAddMonthSafe(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
assert := internal.NewAssert(t, "TestAddMonthSafe")
|
||||
|
||||
tests := []struct {
|
||||
inputDate string
|
||||
months int
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
inputDate: "2025-01-31",
|
||||
months: 1,
|
||||
expected: "2025-02-28",
|
||||
},
|
||||
{
|
||||
inputDate: "2025-01-31",
|
||||
months: -1,
|
||||
expected: "2024-12-31",
|
||||
},
|
||||
{
|
||||
inputDate: "2025-12-31",
|
||||
months: 1,
|
||||
expected: "2026-01-31",
|
||||
},
|
||||
{
|
||||
inputDate: "2025-01-31",
|
||||
months: -1,
|
||||
expected: "2024-12-31",
|
||||
},
|
||||
{
|
||||
inputDate: "2024-02-29",
|
||||
months: 1,
|
||||
expected: "2024-03-29",
|
||||
},
|
||||
{
|
||||
inputDate: "2024-02-29",
|
||||
months: -1,
|
||||
expected: "2024-01-29",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
date, _ := time.Parse("2006-01-02", tt.inputDate)
|
||||
result := AddMonthSafe(date, tt.months)
|
||||
assert.Equal(tt.expected, result.Format("2006-01-02"))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestAddYearSafe(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
assert := internal.NewAssert(t, "TestAddYearSafe")
|
||||
|
||||
tests := []struct {
|
||||
inputDate string
|
||||
years int
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
inputDate: "2020-02-29",
|
||||
years: 1,
|
||||
expected: "2021-02-28",
|
||||
},
|
||||
{
|
||||
inputDate: "2020-02-29",
|
||||
years: 2,
|
||||
expected: "2022-02-28",
|
||||
},
|
||||
{
|
||||
inputDate: "2020-02-29",
|
||||
years: -1,
|
||||
expected: "2019-02-28",
|
||||
},
|
||||
{
|
||||
inputDate: "2020-02-29",
|
||||
years: -2,
|
||||
expected: "2018-02-28",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
date, _ := time.Parse("2006-01-02", tt.inputDate)
|
||||
result := AddYearSafe(date, tt.years)
|
||||
assert.Equal(tt.expected, result.Format("2006-01-02"))
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetNowDate(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
@@ -28,6 +28,9 @@ import (
|
||||
- [AddHour](#AddHour)
|
||||
- [AddMinute](#AddMinute)
|
||||
- [AddYear](#AddYear)
|
||||
- [AddDaySafe](#AddDaySafe)
|
||||
- [AddMonthSafe](#AddMonthSafe)
|
||||
- [AddYearSafe](#AddYearSafe)
|
||||
- [BeginOfMinute](#BeginOfMinute)
|
||||
- [BeginOfHour](#BeginOfHour)
|
||||
- [BeginOfDay](#BeginOfDay)
|
||||
@@ -320,6 +323,126 @@ func main() {
|
||||
}
|
||||
```
|
||||
|
||||
### <span id="AddDaySafe">AddDaySafe</span>
|
||||
|
||||
<p>增加/减少指定的天数,并确保日期是有效日期。</p>
|
||||
|
||||
<b>函数签名:</b>
|
||||
|
||||
```go
|
||||
func AddDaySafe(t time.Time, days int) time.Time
|
||||
```
|
||||
|
||||
<b>示例:<span style="float:right;display:inline-block;">[运行](todo)</span></b>
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
"github.com/duke-git/lancet/v2/datetime"
|
||||
)
|
||||
|
||||
func main() {
|
||||
leapYearDate1, _ := time.Parse("2006-01-02", "2024-02-29")
|
||||
result1 := datetime.AddDaySafe(leapYearDate1, 1)
|
||||
|
||||
leapYearDate2, _ := time.Parse("2006-01-02", "2024-03-01")
|
||||
result2 := datetime.AddDaySafe(leapYearDate2, -1)
|
||||
|
||||
nonLeapYearDate1, _ := time.Parse("2006-01-02", "2025-02-28")
|
||||
result3 := datetime.AddDaySafe(nonLeapYearDate1, 1)
|
||||
|
||||
nonLeaYearDate2, _ := time.Parse("2006-01-02", "2025-03-01")
|
||||
result4 := datetime.AddDaySafe(nonLeaYearDate2, -1)
|
||||
|
||||
fmt.Println(result1.Format("2006-01-02"))
|
||||
fmt.Println(result2.Format("2006-01-02"))
|
||||
fmt.Println(result3.Format("2006-01-02"))
|
||||
fmt.Println(result4.Format("2006-01-02"))
|
||||
|
||||
// Output:
|
||||
// 2024-03-01
|
||||
// 2024-02-29
|
||||
// 2025-03-01
|
||||
// 2025-02-28
|
||||
}
|
||||
```
|
||||
|
||||
### <span id="AddMonthSafe">AddMonthSafe</span>
|
||||
|
||||
<p>增加/减少指定的月份,并确保日期是有效日期。</p>
|
||||
|
||||
<b>函数签名:</b>
|
||||
|
||||
```go
|
||||
func AddMonthSafe(t time.Time, months int) time.Time
|
||||
```
|
||||
|
||||
<b>示例:<span style="float:right;display:inline-block;">[运行](todo)</span></b>
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
"github.com/duke-git/lancet/v2/datetime"
|
||||
)
|
||||
|
||||
func main() {
|
||||
date1, _ := time.Parse("2006-01-02", "2025-01-31")
|
||||
result1 := datetime.AddMonthSafe(date1, 1)
|
||||
|
||||
date2, _ := time.Parse("2006-01-02", "2024-02-29")
|
||||
result2 := datetime.AddMonthSafe(date2, -1)
|
||||
|
||||
fmt.Println(result1.Format("2006-01-02"))
|
||||
fmt.Println(result2.Format("2006-01-02"))
|
||||
|
||||
// Output:
|
||||
// 2025-02-28
|
||||
// 2024-01-29
|
||||
}
|
||||
```
|
||||
|
||||
### <span id="AddYearSafe">AddYearSafe</span>
|
||||
|
||||
<p>增加/减少指定的年份,并确保日期是有效日期。</p>
|
||||
|
||||
<b>函数签名:</b>
|
||||
|
||||
```go
|
||||
func AddYearSafe(t time.Time, years int) time.Time
|
||||
```
|
||||
|
||||
<b>示例:<span style="float:right;display:inline-block;">[运行](todo)</span></b>
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
"github.com/duke-git/lancet/v2/datetime"
|
||||
)
|
||||
|
||||
func main() {
|
||||
date, _ := time.Parse("2006-01-02", "2020-02-29")
|
||||
|
||||
result1 := datetime.AddYearSafe(date, 1)
|
||||
result2 := datetime.AddYearSafe(date, -1)
|
||||
|
||||
fmt.Println(result1.Format("2006-01-02"))
|
||||
fmt.Println(result2.Format("2006-01-02"))
|
||||
|
||||
// Output:
|
||||
// 2021-02-28
|
||||
// 2019-02-28
|
||||
}
|
||||
```
|
||||
|
||||
### <span id="BeginOfMinute">BeginOfMinute</span>
|
||||
|
||||
<p>返回指定时间的分钟开始时间。</p>
|
||||
|
||||
@@ -29,6 +29,9 @@ import (
|
||||
- [AddHour](#AddHour)
|
||||
- [AddMinute](#AddMinute)
|
||||
- [AddYear](#AddYear)
|
||||
- [AddDaySafe](#AddDaySafe)
|
||||
- [AddMonthSafe](#AddMonthSafe)
|
||||
- [AddYearSafe](#AddYearSafe)
|
||||
- [BeginOfMinute](#BeginOfMinute)
|
||||
- [BeginOfHour](#BeginOfHour)
|
||||
- [BeginOfDay](#BeginOfDay)
|
||||
@@ -322,6 +325,126 @@ func main() {
|
||||
}
|
||||
```
|
||||
|
||||
### <span id="AddDaySafe">AddDaySafe</span>
|
||||
|
||||
<p>Add or sub days to the time and ensure that the returned date does not exceed the valid date of the target year and month.</p>
|
||||
|
||||
<b>Signature:</b>
|
||||
|
||||
```go
|
||||
func AddDaySafe(t time.Time, days int) time.Time
|
||||
```
|
||||
|
||||
<b>Example:<span style="float:right;display:inline-block;">[Run](todo)</span></b>
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
"github.com/duke-git/lancet/v2/datetime"
|
||||
)
|
||||
|
||||
func main() {
|
||||
leapYearDate1, _ := time.Parse("2006-01-02", "2024-02-29")
|
||||
result1 := datetime.AddDaySafe(leapYearDate1, 1)
|
||||
|
||||
leapYearDate2, _ := time.Parse("2006-01-02", "2024-03-01")
|
||||
result2 := datetime.AddDaySafe(leapYearDate2, -1)
|
||||
|
||||
nonLeapYearDate1, _ := time.Parse("2006-01-02", "2025-02-28")
|
||||
result3 := datetime.AddDaySafe(nonLeapYearDate1, 1)
|
||||
|
||||
nonLeaYearDate2, _ := time.Parse("2006-01-02", "2025-03-01")
|
||||
result4 := datetime.AddDaySafe(nonLeaYearDate2, -1)
|
||||
|
||||
fmt.Println(result1.Format("2006-01-02"))
|
||||
fmt.Println(result2.Format("2006-01-02"))
|
||||
fmt.Println(result3.Format("2006-01-02"))
|
||||
fmt.Println(result4.Format("2006-01-02"))
|
||||
|
||||
// Output:
|
||||
// 2024-03-01
|
||||
// 2024-02-29
|
||||
// 2025-03-01
|
||||
// 2025-02-28
|
||||
}
|
||||
```
|
||||
|
||||
### <span id="AddMonthSafe">AddMonthSafe</span>
|
||||
|
||||
<p>Add or sub months to the time and ensure that the returned date does not exceed the valid date of the target year and month.</p>
|
||||
|
||||
<b>Signature:</b>
|
||||
|
||||
```go
|
||||
func AddMonthSafe(t time.Time, months int) time.Time
|
||||
```
|
||||
|
||||
<b>Example:<span style="float:right;display:inline-block;">[Run](todo)</span></b>
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
"github.com/duke-git/lancet/v2/datetime"
|
||||
)
|
||||
|
||||
func main() {
|
||||
date1, _ := time.Parse("2006-01-02", "2025-01-31")
|
||||
result1 := datetime.AddMonthSafe(date1, 1)
|
||||
|
||||
date2, _ := time.Parse("2006-01-02", "2024-02-29")
|
||||
result2 := datetime.AddMonthSafe(date2, -1)
|
||||
|
||||
fmt.Println(result1.Format("2006-01-02"))
|
||||
fmt.Println(result2.Format("2006-01-02"))
|
||||
|
||||
// Output:
|
||||
// 2025-02-28
|
||||
// 2024-01-29
|
||||
}
|
||||
```
|
||||
|
||||
### <span id="AddYearSafe">AddYearSafe</span>
|
||||
|
||||
<p>Add or sub years to the time and ensure that the returned date does not exceed the valid date of the target year and month.</p>
|
||||
|
||||
<b>Signature:</b>
|
||||
|
||||
```go
|
||||
func AddYearSafe(t time.Time, years int) time.Time
|
||||
```
|
||||
|
||||
<b>Example:<span style="float:right;display:inline-block;">[Run](todo)</span></b>
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
"github.com/duke-git/lancet/v2/datetime"
|
||||
)
|
||||
|
||||
func main() {
|
||||
date, _ := time.Parse("2006-01-02", "2020-02-29")
|
||||
|
||||
result1 := datetime.AddYearSafe(date, 1)
|
||||
result2 := datetime.AddYearSafe(date, -1)
|
||||
|
||||
fmt.Println(result1.Format("2006-01-02"))
|
||||
fmt.Println(result2.Format("2006-01-02"))
|
||||
|
||||
// Output:
|
||||
// 2021-02-28
|
||||
// 2019-02-28
|
||||
}
|
||||
```
|
||||
|
||||
### <span id="BeginOfMinute">BeginOfMinute</span>
|
||||
|
||||
<p>Return beginning minute time of day.</p>
|
||||
|
||||
Reference in New Issue
Block a user