From f2823014f2eed74444574ed45697bbf0c8bd45a4 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Tue, 18 Feb 2025 15:47:43 +0800 Subject: [PATCH] doc: add doc for AddDaySafe, AddMonthSafe, AddYearSafe --- cryptor/rsa_private_example.pem | 98 ++++++++++++------------ cryptor/rsa_public_example.pem | 24 +++--- docs/api/packages/datetime.md | 123 +++++++++++++++++++++++++++++++ docs/en/api/packages/datetime.md | 123 +++++++++++++++++++++++++++++++ 4 files changed, 307 insertions(+), 61 deletions(-) diff --git a/cryptor/rsa_private_example.pem b/cryptor/rsa_private_example.pem index b635332..081084c 100644 --- a/cryptor/rsa_private_example.pem +++ b/cryptor/rsa_private_example.pem @@ -1,51 +1,51 @@ -----BEGIN rsa private key----- -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 -----END rsa private key----- diff --git a/cryptor/rsa_public_example.pem b/cryptor/rsa_public_example.pem index 2180493..b0dcb81 100644 --- a/cryptor/rsa_public_example.pem +++ b/cryptor/rsa_public_example.pem @@ -1,14 +1,14 @@ -----BEGIN rsa public key----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAydCMlSbzx3yb6o3T/CUp -fxRHSl45LjyqhEQiMHkGPcL9d81NlxVHvvy/V/mY5wtarYRlifsk2OOVJ2LyfagX -KM5k16LEEq2PsPcKVM4Vp6gLCIB2aX88hfJkYfTRGW2RX9aVCJaK1Ak2nXInuNEG -9T/ykelH57gHjH2k9NuDBifcIm3fIKNKYqK4WvDQMob8KyKJdiKPsKll4Z5ZKGt/ -gqpMt0gWx1fZ/njUnGATUoXMH7/JXdPQH+VVYt5HFq8JqffkiiIW0zzdNmA0dSGx -c96i8dCNdIB79iQAJ/X0c5fk5/8b/fkLUHY/BvBMhFtLp7/TCnbzn5Rmp8IJtWKe -xaQ00AqzRNGnd4LoJAiPWAipfsUeYXW517lBllKz9wiKo7AmkB0h8fig5ZEK5btS -BqNRgdnMjBxrm/QFgWdqsxmzcjrXD3iV+ZNOE8s47jkdhjoPRpqqyMSUawmJs1uy -SrVpgaldIJrBzNOATReHFQ+mSlHi7D1BcrOegCHasIqaQKv+w9ttR1P6bFcVezO/ -OQaTbdQviB+pHqYv7Ww9kVPko1c+X5SMUUXy0MwwjLRl2TcEA0BzUf3Qdq5TA7x2 -Q4Eak2oBsuuEZrCPSTDRXjwUxd+Cz82SZMKg6fDe409dPR0S8w1xp4gdknvoQIyN -pNrY6I6/UyDieOAImOLSrMECAwEAAQ== +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkyNIU0a9CCzY+Mf6/jwT +eoxhY5NGGQ+/1pYcJk+8aZXvFcRoewwjs5NQ2Oyfc4cCGpU7EVfh3LrEZxuMIx3g +ZyY6On0EH6tBjZaxpaAkjcMpkAAIwSOak8TeqIxjVQc5R0up3QVQudhGgdGwQS6P +sRmgJ42sKMCCWxCUOPZyIJkxex1HCPXVxOjDiNsd+EdswaXvCNxN0lpPosoEE4p0 +ObxQqFRb/PEDBchm7FHMKm7yLa1YpALM2PsTCr1RJZ3OixaX3TpbxVWm4i5VVXF7 +C3Xp1onEn2jz5D8p0vUMUFUKRcX7UHr73mBAtNQ+8yyi7NWZwbay0s7bKVO0gFcc +P/O9cSCW7g55qVh5x9T+pGJuK43U0VDKJhx3w2llHJpG14O/lOdBSpDZD+lRQq8i +/SemiCVNc4uz9wXBeQXxe6XNfW69wIfyRrIHObOY16UUwtTz8grxibiPiNxxAbwx +1cKij2thEr2kyF6YRNpQnAuwDM8wX0UXQDY3uZHoiFQBGW15Eprtb+6iRmlY47Z2 +n+LX27evoDoNuvTdlOpY5A+qDm3NjAsw18JCDMfqxpLOwQS1CAInLRRegw+pcL5J +NGl1th4sTXdZPVz/z0KVETbNbysrjHYPUiYnyiWe6EFkWgUQfiQJGulGAwxxav9w +pxWELFoQKx8TZND1jfBLbJkCAwEAAQ== -----END rsa public key----- diff --git a/docs/api/packages/datetime.md b/docs/api/packages/datetime.md index b666521..43b9e29 100644 --- a/docs/api/packages/datetime.md +++ b/docs/api/packages/datetime.md @@ -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() { } ``` +### AddDaySafe + +

增加/减少指定的天数,并确保日期是有效日期。

+ +函数签名: + +```go +func AddDaySafe(t time.Time, days int) time.Time +``` + +示例:[运行](todo) + +```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 +} +``` + +### AddMonthSafe + +

增加/减少指定的月份,并确保日期是有效日期。

+ +函数签名: + +```go +func AddMonthSafe(t time.Time, months int) time.Time +``` + +示例:[运行](todo) + +```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 +} +``` + +### AddYearSafe + +

增加/减少指定的年份,并确保日期是有效日期。

+ +函数签名: + +```go +func AddYearSafe(t time.Time, years int) time.Time +``` + +示例:[运行](todo) + +```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 +} +``` + ### BeginOfMinute

返回指定时间的分钟开始时间。

diff --git a/docs/en/api/packages/datetime.md b/docs/en/api/packages/datetime.md index a5c734f..0fc934d 100644 --- a/docs/en/api/packages/datetime.md +++ b/docs/en/api/packages/datetime.md @@ -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() { } ``` +### 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.

+ +Signature: + +```go +func AddDaySafe(t time.Time, days int) time.Time +``` + +Example:[Run](todo) + +```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 +} +``` + +### 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.

+ +Signature: + +```go +func AddMonthSafe(t time.Time, months int) time.Time +``` + +Example:[Run](todo) + +```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 +} +``` + +### 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.

+ +Signature: + +```go +func AddYearSafe(t time.Time, years int) time.Time +``` + +Example:[Run](todo) + +```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 +} +``` + ### BeginOfMinute

Return beginning minute time of day.