1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-11 16:22:26 +08:00

doc: add doc for AddDaySafe, AddMonthSafe, AddYearSafe

This commit is contained in:
dudaodong
2025-02-18 15:47:43 +08:00
parent 4181c42805
commit f2823014f2
4 changed files with 307 additions and 61 deletions

View File

@@ -1,51 +1,51 @@
-----BEGIN rsa private key----- -----BEGIN rsa private key-----
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
-----END rsa private key----- -----END rsa private key-----

View File

@@ -1,14 +1,14 @@
-----BEGIN rsa public key----- -----BEGIN rsa public key-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAydCMlSbzx3yb6o3T/CUp MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkyNIU0a9CCzY+Mf6/jwT
fxRHSl45LjyqhEQiMHkGPcL9d81NlxVHvvy/V/mY5wtarYRlifsk2OOVJ2LyfagX eoxhY5NGGQ+/1pYcJk+8aZXvFcRoewwjs5NQ2Oyfc4cCGpU7EVfh3LrEZxuMIx3g
KM5k16LEEq2PsPcKVM4Vp6gLCIB2aX88hfJkYfTRGW2RX9aVCJaK1Ak2nXInuNEG ZyY6On0EH6tBjZaxpaAkjcMpkAAIwSOak8TeqIxjVQc5R0up3QVQudhGgdGwQS6P
9T/ykelH57gHjH2k9NuDBifcIm3fIKNKYqK4WvDQMob8KyKJdiKPsKll4Z5ZKGt/ sRmgJ42sKMCCWxCUOPZyIJkxex1HCPXVxOjDiNsd+EdswaXvCNxN0lpPosoEE4p0
gqpMt0gWx1fZ/njUnGATUoXMH7/JXdPQH+VVYt5HFq8JqffkiiIW0zzdNmA0dSGx ObxQqFRb/PEDBchm7FHMKm7yLa1YpALM2PsTCr1RJZ3OixaX3TpbxVWm4i5VVXF7
c96i8dCNdIB79iQAJ/X0c5fk5/8b/fkLUHY/BvBMhFtLp7/TCnbzn5Rmp8IJtWKe C3Xp1onEn2jz5D8p0vUMUFUKRcX7UHr73mBAtNQ+8yyi7NWZwbay0s7bKVO0gFcc
xaQ00AqzRNGnd4LoJAiPWAipfsUeYXW517lBllKz9wiKo7AmkB0h8fig5ZEK5btS P/O9cSCW7g55qVh5x9T+pGJuK43U0VDKJhx3w2llHJpG14O/lOdBSpDZD+lRQq8i
BqNRgdnMjBxrm/QFgWdqsxmzcjrXD3iV+ZNOE8s47jkdhjoPRpqqyMSUawmJs1uy /SemiCVNc4uz9wXBeQXxe6XNfW69wIfyRrIHObOY16UUwtTz8grxibiPiNxxAbwx
SrVpgaldIJrBzNOATReHFQ+mSlHi7D1BcrOegCHasIqaQKv+w9ttR1P6bFcVezO/ 1cKij2thEr2kyF6YRNpQnAuwDM8wX0UXQDY3uZHoiFQBGW15Eprtb+6iRmlY47Z2
OQaTbdQviB+pHqYv7Ww9kVPko1c+X5SMUUXy0MwwjLRl2TcEA0BzUf3Qdq5TA7x2 n+LX27evoDoNuvTdlOpY5A+qDm3NjAsw18JCDMfqxpLOwQS1CAInLRRegw+pcL5J
Q4Eak2oBsuuEZrCPSTDRXjwUxd+Cz82SZMKg6fDe409dPR0S8w1xp4gdknvoQIyN NGl1th4sTXdZPVz/z0KVETbNbysrjHYPUiYnyiWe6EFkWgUQfiQJGulGAwxxav9w
pNrY6I6/UyDieOAImOLSrMECAwEAAQ== pxWELFoQKx8TZND1jfBLbJkCAwEAAQ==
-----END rsa public key----- -----END rsa public key-----

View File

@@ -28,6 +28,9 @@ import (
- [AddHour](#AddHour) - [AddHour](#AddHour)
- [AddMinute](#AddMinute) - [AddMinute](#AddMinute)
- [AddYear](#AddYear) - [AddYear](#AddYear)
- [AddDaySafe](#AddDaySafe)
- [AddMonthSafe](#AddMonthSafe)
- [AddYearSafe](#AddYearSafe)
- [BeginOfMinute](#BeginOfMinute) - [BeginOfMinute](#BeginOfMinute)
- [BeginOfHour](#BeginOfHour) - [BeginOfHour](#BeginOfHour)
- [BeginOfDay](#BeginOfDay) - [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> ### <span id="BeginOfMinute">BeginOfMinute</span>
<p>返回指定时间的分钟开始时间。</p> <p>返回指定时间的分钟开始时间。</p>

View File

@@ -29,6 +29,9 @@ import (
- [AddHour](#AddHour) - [AddHour](#AddHour)
- [AddMinute](#AddMinute) - [AddMinute](#AddMinute)
- [AddYear](#AddYear) - [AddYear](#AddYear)
- [AddDaySafe](#AddDaySafe)
- [AddMonthSafe](#AddMonthSafe)
- [AddYearSafe](#AddYearSafe)
- [BeginOfMinute](#BeginOfMinute) - [BeginOfMinute](#BeginOfMinute)
- [BeginOfHour](#BeginOfHour) - [BeginOfHour](#BeginOfHour)
- [BeginOfDay](#BeginOfDay) - [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> ### <span id="BeginOfMinute">BeginOfMinute</span>
<p>Return beginning minute time of day.</p> <p>Return beginning minute time of day.</p>