diff --git a/go.mod b/go.mod
index b07c80aa..fe270e6a 100644
--- a/go.mod
+++ b/go.mod
@@ -17,7 +17,7 @@ require (
github.com/docker/docker v27.3.1+incompatible
github.com/docker/go-connections v0.5.0
github.com/docker/go-units v0.5.0
- github.com/dromara/carbon/v2 v2.5.2
+ github.com/dromara/carbon/v2 v2.6.8
github.com/eclipse/paho.mqtt.golang v1.5.0
github.com/go-gomail/gomail v0.0.0-20160411212932-81ebce5c23df
github.com/go-playground/validator/v10 v10.26.0
diff --git a/go.sum b/go.sum
index d4c24ca0..f9fa812f 100644
--- a/go.sum
+++ b/go.sum
@@ -96,8 +96,8 @@ github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQ
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/dromara/carbon/v2 v2.5.2 h1:GquNyA9Imda+LwS9FIzHhKg+foU2QPstH+S3idBRjKg=
-github.com/dromara/carbon/v2 v2.5.2/go.mod h1:zyPlND2o27sKKkRmdgLbk/qYxkmmH6Z4eE8OoM0w3DM=
+github.com/dromara/carbon/v2 v2.6.8 h1:2iWFoekr7p5WAWb5NK7Edf4Co8GQKSinh24+osgGt2Y=
+github.com/dromara/carbon/v2 v2.6.8/go.mod h1:7GXqCUplwN1s1b4whGk2zX4+g4CMCoDIZzmjlyt0vLY=
github.com/eclipse/paho.mqtt.golang v1.5.0 h1:EH+bUVJNgttidWFkLLVKaQPGmkTUfQQqjOsyvMGvD6o=
github.com/eclipse/paho.mqtt.golang v1.5.0/go.mod h1:du/2qNQVqJf/Sqs4MEL77kR8QTqANF7XU7Fk0aOTAgk=
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
diff --git a/vendor/github.com/dromara/carbon/v2/.editorconfig b/vendor/github.com/dromara/carbon/v2/.editorconfig
index 355fcba2..07f2dafb 100644
--- a/vendor/github.com/dromara/carbon/v2/.editorconfig
+++ b/vendor/github.com/dromara/carbon/v2/.editorconfig
@@ -2,13 +2,11 @@
root = true
[*]
-indent_style = tab
+indent_style = space
+indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
+insert_final_newline = true
[*.md]
-indent_size = 4
-trim_trailing_whitespace = false
-
-[lang/*.json]
-indent_size = 4
+trim_trailing_whitespace = false
\ No newline at end of file
diff --git a/vendor/github.com/dromara/carbon/v2/.gitignore b/vendor/github.com/dromara/carbon/v2/.gitignore
new file mode 100644
index 00000000..b38118ad
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/.gitignore
@@ -0,0 +1,5 @@
+# IntelliJ project files
+.idea
+*.iml
+out
+gen
diff --git a/vendor/github.com/dromara/carbon/v2/.golangci.yml b/vendor/github.com/dromara/carbon/v2/.golangci.yml
new file mode 100644
index 00000000..05fe1ce7
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/.golangci.yml
@@ -0,0 +1,177 @@
+---
+# golangci-lint configuration file made by @ccoVeille
+# Source: https://github.com/ccoVeille/golangci-lint-config-examples/
+# Author: @ccoVeille
+# License: MIT
+# Variant: 03-safe
+# Version: v1.2.0
+#
+linters:
+ # some linters are enabled by default
+ # https://golangci-lint.run/usage/linters/
+ #
+ # enable some extra linters
+ enable:
+ # Errcheck is a program for checking for unchecked errors in Go code.
+ - errcheck
+
+ # Linter for Go source code that specializes in simplifying code.
+ - gosimple
+
+ # Vet examines Go source code and reports suspicious constructs.
+ - govet
+
+ # Detects when assignments to existing variables are not used.
+ - ineffassign
+
+ # It's a set of rules from staticcheck. See https://staticcheck.io/
+ - staticcheck
+
+ # Fast, configurable, extensible, flexible, and beautiful linter for Go.
+ # Drop-in replacement of golint.
+ - revive
+
+ # check imports order and makes it always deterministic.
+ - gci
+
+ # make sure to use t.Helper() when needed
+ - thelper
+
+ # mirror suggests rewrites to avoid unnecessary []byte/string conversion
+ - mirror
+
+ # detect the possibility to use variables/constants from the Go standard library.
+ - usestdlibvars
+
+ # Finds commonly misspelled English words.
+ - misspell
+
+ # Checks for duplicate words in the source code.
+ - dupword
+
+ # linter to detect errors invalid key values count
+ - loggercheck
+
+ # detects nested contexts in loops or function literals
+ - fatcontext
+
+ # Checks usage of github.com/stretchr/testify/require
+ - testifylint
+
+linters-settings:
+ gci: # define the section orders for imports
+ sections:
+ # Standard section: captures all standard packages.
+ - standard
+ # Default section: catchall that is not standard or custom
+ - default
+ # linters that related to local tool, so they should be separated
+ - localmodule
+
+ revive:
+ rules:
+ # Check for commonly mistaken usages of the sync/atomic package
+ - name: atomic
+
+ # Blank import should be only in a main or test package, or have a comment justifying it.
+ - name: blank-imports
+
+ # Spots comments not starting with a space
+ - name: comment-spacings
+
+ # context.Context() should be the first parameter of a function when provided as argument.
+ - name: context-as-argument
+ arguments:
+ - allowTypesBefore: "*testing.T"
+
+ # Basic types should not be used as a key in `context.WithValue`
+ - name: context-keys-type
+
+ # warns on some common mistakes when using defer statement.
+ - name: defer
+
+ # Importing with `.` makes the programs much harder to understand
+ - name: dot-imports
+
+ # suggest to simplify if-then-else constructions when possible
+ - name: early-return
+
+ # Empty blocks make code less readable and could be a symptom of a bug or unfinished refactoring.
+ - name: empty-block
+
+ # for better readability, variables of type `error` must be named with the prefix `err`.
+ - name: error-naming
+
+ # for better readability, the errors should be last in the list of returned values by a function.
+ - name: error-return
+
+ # for better readability, error messages should not be capitalized or end with punctuation or a newline.
+ - name: error-strings
+
+ # report when replacing `errors.New(fmt.Sprintf())` with `fmt.Errorf()` is possible
+ - name: errorf
+
+ # Checking if an error is nil to just after return the error or nil is redundant.
+ - name: if-return
+
+ # incrementing an integer variable by 1 is recommended to be done using the `++` operator
+ - name: increment-decrement
+
+ # highlights redundant else-blocks that can be eliminated from the code
+ - name: indent-error-flow
+
+ # This rule suggests a shorter way of writing ranges that do not use the second value.
+ - name: range
+
+ # receiver names in a method should reflect the struct name (p for Person, for example)
+ - name: receiver-naming
+
+ # redefining built in names (true, false, append, make) can lead to bugs very difficult to detect.
+ - name: redefines-builtin-id
+
+ # redundant else-blocks that can be eliminated from the code.
+ - name: superfluous-else
+
+ # prevent confusing name for variables when using `time` package
+ - name: time-naming
+
+ # warns when an exported function or method returns a value of an un-exported type.
+ - name: unexported-return
+
+ # spots and proposes to remove unreachable code. also helps to spot errors
+ - name: unreachable-code
+
+ # Functions or methods with unused parameters can be a symptom of an unfinished refactoring or a bug.
+ - name: unused-parameter
+
+ # warns on useless break statements in case clauses of switch and select statements
+ - name: useless-break
+
+ # report when a variable declaration can be simplified
+ - name: var-declaration
+
+ # warns when initialism, variable or package naming conventions are not followed.
+ - name: var-naming
+
+ dupword:
+ # Keywords used to ignore detection.
+ # Default: []
+ ignore:
+ # - "blah" # this will accept "blah blah …" as a valid duplicate word
+
+ misspell:
+ # Correct spellings using locale preferences for US or UK.
+ # Setting locale to US will correct the British spelling of 'colour' to 'color'.
+ # Default ("") is to use a neutral variety of English.
+ locale: US
+
+ # List of words to ignore
+ # among the one defined in https://github.com/golangci/misspell/blob/master/words.go
+ ignore-words:
+ # - valor
+ # - and
+
+ # Extra word corrections.
+ extra-words:
+ # - typo: "whattever"
+ # correction: "whatever"
diff --git a/vendor/github.com/dromara/carbon/v2/README.cn.md b/vendor/github.com/dromara/carbon/v2/README.cn.md
index 50172017..bed81227 100644
--- a/vendor/github.com/dromara/carbon/v2/README.cn.md
+++ b/vendor/github.com/dromara/carbon/v2/README.cn.md
@@ -5,15 +5,20 @@
[](https://goreportcard.com/report/github.com/dromara/carbon/v2)
[](https://codecov.io/gh/dromara/carbon)
[](https://pkg.go.dev/github.com/dromara/carbon/v2)
+
[](https://github.com/dromara/carbon/blob/master/LICENSE)
简体中文 | [English](README.md) | [日本語](README.jp.md)
-#### 项目简介
+## 项目简介
-一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用,已被 [awesome-go](https://github.com/yinggaozhen/awesome-go-cn#日期和时间 "awesome-go-cn") 收录,并获得 `gitee` 2024 年最有价值项目(`GVP`)和 `gitcode` 2024 年度开源摘星计划 (`G-Star`) 项目
+一个轻量级、语义化、对开发者友好的 `golang` 时间处理库,不依赖于 `任何` 第三方库, `100%` 单元测试覆盖率,已被 [awesome-go](https://github.com/yinggaozhen/awesome-go-cn#日期和时间 "awesome-go-cn") 和 [hello-github](https://hellogithub.com/repository/dromara/carbon "hello-github") 收录,并获得
+`gitee` 2024 年最有价值项目(`GVP`)和 `gitcode` 2024 年度开源摘星计划 (`G-Star`) 项目
-#### 仓库地址
+
+
+
+## 仓库地址
[github.com/dromara/carbon](https://github.com/dromara/carbon "github.com/dromara/carbon")
@@ -21,9 +26,11 @@
[gitcode.com/dromara/carbon](https://gitcode.com/dromara/carbon "gitcode.com/dromara/carbon")
-#### 安装使用
+## 快速开始
-##### go version >= 1.17
+### 安装使用
+
+> go version >= 1.21
```go
// 使用 github 库
@@ -39,1521 +46,48 @@ go get -u gitcode.com/dromara/carbon/v2
import "gitcode.com/dromara/carbon/v2"
```
-`Carbon` 已经捐赠给了 [dromara](https://dromara.org/ "dromara") 组织,仓库地址发生了改变,如果之前用的路径是 `golang-module/carbon`,请在 `go.mod` 里将原地址更换为新路径,或执行如下命令
+`Carbon` 已经捐赠给了 [dromara](https://dromara.org/ "dromara") 开源组织,仓库地址发生了改变,如果之前用的路径是
+`golang-module/carbon`,请在 `go.mod` 里将原地址更换为新路径,或执行如下命令
```go
-go mod edit -replace github.com/golang-module/carbon/v2=github.com/dromara/carbon/v2
+go mod edit -replace github.com/golang-module/carbon/v2 = github.com/dromara/carbon/v2
```
-#### 用法示例
+### 用法示例
-> 假设当前时间为 2020-08-05 13:14:15.999999999 +0800 CST
-
-##### 设置全局默认值
+默认时区是 `UTC`, 语言环境是 `英语`,一周开始日期是 `周一`,周末是 `周六`和 `周日`。
```go
-carbon.SetDefault(carbon.Default{
- Layout: carbon.DateTimeLayout,
- Timezone: carbon.PRC,
- WeekStartsAt: carbon.Sunday,
- Locale: "zh-CN", // 取值范围:lang 目录下翻译文件名,不包含文件后缀
-})
-```
-> 建议在入口文件如 `main.go` 中设置
+carbon.SetTestNow(carbon.Parse("2020-08-05 13:14:15.999999999"))
+carbon.IsTestNow() // true
-##### `Carbon` 和 `time.Time` 互转
+carbon.Now().ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
+carbon.Yesterday().ToString() // 2020-08-04 13:14:15.999999999 +0000 UTC
+carbon.Tomorrow().ToString() // 2020-08-06 13:14:15.999999999 +0000 UTC
-```go
-// 将标准 time.Time 转换成 Carbon
-carbon.CreateFromStdTime(time.Now())
-// 将 Carbon 转换成标准 time.Time
-carbon.Now().StdTime()
-```
+carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2022-03-08T03:01:14-07:00").ToString() // 2022-03-08 10:01:14 +0000 UTC
-##### 昨天、今天、明天
+carbon.ParseByLayout("It is 2020-08-05 13:14:15", "It is 2006-01-02 15:04:05").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").ToString() // 2020-08-05 13:14:15 +0000 UTC
-```go
-// 今天此刻
-fmt.Printf("%s", carbon.Now()) // 2020-08-05 13:14:15
-carbon.Now().String() // 2020-08-05 13:14:15
-carbon.Now().ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Now().ToDateTimeString() // 2020-08-05 13:14:15
-// 今天日期
-carbon.Now().ToDateString() // 2020-08-05
-// 今天时间
-carbon.Now().ToTimeString() // 13:14:15
-// 指定时区的今天此刻
-carbon.Now(Carbon.NewYork).ToDateTimeString() // 2020-08-05 14:14:15
-// 今天秒级时间戳
-carbon.Now().Timestamp() // 1596604455
-// 今天毫秒级时间戳
-carbon.Now().TimestampMilli() // 1596604455999
-// 今天微秒级时间戳
-carbon.Now().TimestampMicro() // 1596604455999999
-// 今天纳秒级时间戳
-carbon.Now().TimestampNano() // 1596604455999999999
+carbon.CreateFromDate(2020, 8, 5).ToString() // 2020-08-05 00:00:00 +0000 UTC
+carbon.CreateFromTime(13, 14, 15).ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.CreateFromTimestamp(1596633255).ToString() // 2020-08-05 13:14:15 +0000 UTC
-// 昨天此刻
-fmt.Printf("%s", carbon.Yesterday()) // 2020-08-04 13:14:15
-carbon.Yesterday().String() // 2020-08-04 13:14:15
-carbon.Yesterday().ToString() // 2020-08-04 13:14:15 +0800 CST
-carbon.Yesterday().ToDateTimeString() // 2020-08-04 13:14:15
-// 昨天日期
-carbon.Yesterday().ToDateString() // 2020-08-04
-// 昨天时间
-carbon.Yesterday().ToTimeString() // 13:14:15
-// 指定日期的昨天此刻
-carbon.Parse("2021-01-28 13:14:15").Yesterday().ToDateTimeString() // 2021-01-27 13:14:15
-// 指定时区的昨天此刻
-carbon.Yesterday(Carbon.NewYork).ToDateTimeString() // 2020-08-04 14:14:15
-// 昨天秒级时间戳
-carbon.Yesterday().Timestamp() // 1596518055
-// 昨天毫秒级时间戳
-carbon.Yesterday().TimestampMilli() // 1596518055999
-// 昨天微秒级时间戳
-carbon.Yesterday().TimestampMicro() // 1596518055999999
-// 昨天纳秒级时间戳
-carbon.Yesterday().TimestampNano() // 1596518055999999999
-
-// 明天此刻
-fmt.Printf("%s", carbon.Tomorrow()) // 2020-08-06 13:14:15
-carbon.Tomorrow().String() // 2020-08-06 13:14:15
-carbon.Tomorrow().ToString() // 2020-08-06 13:14:15 +0800 CST
-carbon.Tomorrow().ToDateTimeString() // 2020-08-06 13:14:15
-// 明天日期
-carbon.Tomorrow().ToDateString() // 2020-08-06
-// 明天时间
-carbon.Tomorrow().ToTimeString() // 13:14:15
-// 指定日期的明天此刻
-carbon.Parse("2021-01-28 13:14:15").Tomorrow().ToDateTimeString() // 2021-01-29 13:14:15
-// 指定时区的明天此刻
-carbon.Tomorrow(Carbon.NewYork).ToDateTimeString() // 2020-08-06 14:14:15
-// 明天秒级时间戳
-carbon.Tomorrow().Timestamp() // 1596690855
-// 明天毫秒级时间戳
-carbon.Tomorrow().TimestampMilli() // 1596690855999
-// 明天微秒级时间戳
-carbon.Tomorrow().TimestampMicro() // 1596690855999999
-// 明天纳秒级时间戳
-carbon.Tomorrow().TimestampNano() // 1596690855999999999
-```
-
-##### 创建 `Carbon` 实例
-
-```go
-// 从秒级时间戳创建 Carbon 实例
-carbon.CreateFromTimestamp(-1).ToString() // 1970-01-01 07:59:59 +0800 CST
-carbon.CreateFromTimestamp(0).ToString() // 1970-01-01 08:00:00 +0800 CST
-carbon.CreateFromTimestamp(1).ToString() // 1970-01-01 08:00:01 +0800 CST
-carbon.CreateFromTimestamp(1649735755).ToString() // 2022-04-12 11:55:55 +0800 CST
-// 从毫秒级时间戳创建 Carbon 实例
-carbon.CreateFromTimestampMilli(1649735755981).ToString() // 2022-04-12 11:55:55.981 +0800 CST
-// 从微秒级时间戳创建 Carbon 实例
-carbon.CreateFromTimestampMicro(1649735755981566).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
-// 从纳秒级时间戳创建 Carbon 实例
-carbon.CreateFromTimestampNano(1649735755981566000).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
-
-// 从年月日时分秒创建 Carbon 实例
-carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToString() // 2020-08-05 13:14:15 +0800 CST
-// 从年月日时分秒创建 Carbon 实例,包含毫秒
-carbon.CreateFromDateTimeMilli(2020, 8, 5, 13, 14, 15, 999).ToString() // 2020-08-05 13:14:15.999 +0800 CST
-// 从年月日时分秒创建 Carbon 实例,包含微秒
-carbon.CreateFromDateTimeMicro(2020, 8, 5, 13, 14, 15, 999999).ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-// 从年月日时分秒创建 Carbon 实例,包含纳秒
-carbon.CreateFromDateTimeNano(2020, 8, 5, 13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-
-// 从年月日创建 Carbon 实例
-carbon.CreateFromDate(2020, 8, 5).ToString() // 2020-08-05 00:00:00 +0800 CST
-// 从年月日创建 Carbon 实例,包含毫秒
-carbon.CreateFromDateMilli(2020, 8, 5, 999).ToString() // 2020-08-05 00:00:00.999 +0800 CST
-// 从年月日创建 Carbon 实例,包含微秒
-carbon.CreateFromDateMicro(2020, 8, 5, 999999).ToString() // 2020-08-05 00:00:00.999999 +0800 CST
-// 从年月日创建 Carbon 实例,包含纳秒
-carbon.CreateFromDateNano(2020, 8, 5, 999999999).ToString() // 2020-08-05 00:00:00.999999999 +0800 CST
-
-// 从时分秒创建 Carbon 实例(年月日默认为当前年月日)
-carbon.CreateFromTime(13, 14, 15).ToString() // 2020-08-05 13:14:15 +0800 CST
-// 从时分秒创建 Carbon 实例(年月日默认为当前年月日),包含毫秒
-carbon.CreateFromTimeMilli(13, 14, 15, 999).ToString() // 2020-08-05 13:14:15.999 +0800 CST
-// 从时分秒创建 Carbon 实例(年月日默认为当前年月日),包含微秒
-carbon.CreateFromTimeMicro(13, 14, 15, 999999).ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-// 从时分秒创建 Carbon 实例(年月日默认为当前年月日),包含纳秒
-carbon.CreateFromTimeNano(13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-```
-
-##### 将 `时间字符串` 解析成 `Carbon` 实例
-
-```go
-carbon.Parse("").ToDateTimeString() // 空字符串
-carbon.Parse("0").ToDateTimeString() // 空字符串
-carbon.Parse("00:00:00").ToDateTimeString() // 空字符串
-carbon.Parse("0000-00-00").ToDateTimeString() // 空字符串
-carbon.Parse("0000-00-00 00:00:00").ToDateTimeString() // 空字符串
-
-carbon.Parse("now").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("yesterday").ToString() // 2020-08-04 13:14:15 +0800 CST
-carbon.Parse("tomorrow").ToString() // 2020-08-06 13:14:15 +0800 CST
-
-carbon.Parse("2020").ToString() // 2020-01-01 00:00:00 +0800 CST
-carbon.Parse("2020-8").ToString() // 2020-08-01 00:00:00 +0800 CST
-carbon.Parse("2020-08").ToString() // 2020-08-01 00:00:00 +0800 CST
-carbon.Parse("2020-8-5").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("2020-8-05").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("2020-08-05").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("2020-08-05.999").ToString() // 2020-08-05 00:00:00.999 +0800 CST
-carbon.Parse("2020-08-05.999999").ToString() // 2020-08-05 00:00:00.999999 +0800 CST
-carbon.Parse("2020-08-05.999999999").ToString() // 2020-08-05 00:00:00.999999999 +0800 CST
-
-carbon.Parse("2020-8-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-8-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05 13:14:15.999").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("2020-08-05 13:14:15.999999").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("2020-08-05 13:14:15.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-
-carbon.Parse("2020-8-5T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-8-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05T13:14:15.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("2020-08-05T13:14:15.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-
-carbon.Parse("20200805").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("20200805131415").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("20200805131415.999").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("20200805131415.999999").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("20200805131415.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-carbon.Parse("20200805131415.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("20200805131415.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("20200805131415.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-
-```
-
-##### 通过 `格式模板` 将时间字符串解析成 `Carbon` 实例
-
-> 如果使用的字母与格式模板冲突时,请使用转义符转义该字母
-
-```go
-carbon.ParseByFormat("2020|08|05 13|14|15", "Y|m|d H|i|s").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByFormat("今天是 2020年08月05日13时14分15秒", "今天是 Y年m月d日H时i分s秒").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByFormat("2020-08-05 13:14:15", "Y-m-d H:i:s", carbon.Tokyo).ToDateTimeString() // 2020-08-05 14:14:15
-```
-
-##### 通过 `布局模板` 将时间字符串解析成 `Carbon` 实例
-
-```go
-carbon.ParseByLayout("2020|08|05 13|14|15", "2006|01|02 15|04|05").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByLayout("It is 2020-08-05 13:14:15", "It is 2006-01-02 15:04:05").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByLayout("今天是 2020年08月05日13时14分15秒", "今天是 2006年01月02日15时04分05秒").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByLayout("2020-08-05 13:14:15", "2006-01-02 15:04:05", carbon.Tokyo).ToDateTimeString() // 2020-08-05 14:14:15
-```
-
-##### 时间边界
-
-```go
-// 本世纪开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfCentury().ToDateTimeString() // 2000-01-01 00:00:00
-// 本世纪结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfCentury().ToDateTimeString() // 2999-12-31 23:59:59
-
-// 本年代开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfDecade().ToDateTimeString() // 2020-01-01 00:00:00
-carbon.Parse("2021-08-05 13:14:15").StartOfDecade().ToDateTimeString() // 2020-01-01 00:00:00
-carbon.Parse("2029-08-05 13:14:15").StartOfDecade().ToDateTimeString() // 2020-01-01 00:00:00
-// 本年代结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfDecade().ToDateTimeString() // 2029-12-31 23:59:59
-carbon.Parse("2021-08-05 13:14:15").EndOfDecade().ToDateTimeString() // 2029-12-31 23:59:59
-carbon.Parse("2029-08-05 13:14:15").EndOfDecade().ToDateTimeString() // 2029-12-31 23:59:59
-
-// 本年开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfYear().ToDateTimeString() // 2020-01-01 00:00:00
-// 本年结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfYear().ToDateTimeString() // 2020-12-31 23:59:59
-
-// 本季度开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfQuarter().ToDateTimeString() // 2020-07-01 00:00:00
-// 本季度结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfQuarter().ToDateTimeString() // 2020-09-30 23:59:59
-
-// 本月开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfMonth().ToDateTimeString() // 2020-08-01 00:00:00
-// 本月结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfMonth().ToDateTimeString() // 2020-08-31 23:59:59
-
-// 本周开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfWeek().ToDateTimeString() // 2020-08-02 00:00:00
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Sunday).StartOfWeek().ToDateTimeString() // 2020-08-02 00:00:00
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Monday).StartOfWeek().ToDateTimeString() // 2020-08-03 00:00:00
-// 本周结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfWeek().ToDateTimeString() // 2020-08-08 23:59:59
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Sunday).EndOfWeek().ToDateTimeString() // 2020-08-08 23:59:59
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Monday).EndOfWeek().ToDateTimeString() // 2020-08-09 23:59:59
-
-// 本日开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfDay().ToDateTimeString() // 2020-08-05 00:00:00
-// 本日结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfDay().ToDateTimeString() // 2020-08-05 23:59:59
-
-// 本小时开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfHour().ToDateTimeString() // 2020-08-05 13:00:00
-// 本小时结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfHour().ToDateTimeString() // 2020-08-05 13:59:59
-
-// 本分钟开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfMinute().ToDateTimeString() // 2020-08-05 13:14:00
-// 本分钟结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfMinute().ToDateTimeString() // 2020-08-05 13:14:59
-
-// 本秒开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfSecond().ToString() // 2020-08-05 13:14:15 +0800 CST
-// 本秒结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfSecond().ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-```
-
-##### 时间旅行
-
-```go
-// 三个世纪后
-carbon.Parse("2020-02-29 13:14:15").AddCenturies(3).ToDateTimeString() // 2320-02-29 13:14:15
-// 三个世纪后(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").AddCenturiesNoOverflow(3).ToDateTimeString() // 2320-02-29 13:14:15
-// 一个世纪后
-carbon.Parse("2020-02-29 13:14:15").AddCentury().ToDateTimeString() // 2120-02-29 13:14:15
-// 一个世纪后(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").AddCenturyNoOverflow().ToDateTimeString() // 2120-02-29 13:14:15
-// 三个世纪前
-carbon.Parse("2020-02-29 13:14:15").SubCenturies(3).ToDateTimeString() // 1720-02-29 13:14:15
-// 三个世纪前(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").SubCenturiesNoOverflow(3).ToDateTimeString() // 1720-02-29 13:14:15
-// 一个世纪前
-carbon.Parse("2020-02-29 13:14:15").SubCentury().ToDateTimeString() // 1920-02-29 13:14:15
-// 一世纪前(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").SubCenturyNoOverflow().ToDateTimeString() // 1920-02-29 13:14:15
-
-// 三个年代后
-carbon.Parse("2020-02-29 13:14:15").AddDecades(3).ToDateTimeString() // 2050-03-01 13:14:15
-// 三个年代后(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").AddDecadesNoOverflow(3).ToDateTimeString() // 2050-02-28 13:14:15
-// 一个年代后
-carbon.Parse("2020-02-29 13:14:15").AddDecade().ToDateTimeString() // 2030-03-01 13:14:15
-// 一个年代后(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").AddDecadeNoOverflow().ToDateTimeString() // 2030-02-28 13:14:15
-// 三个年代前
-carbon.Parse("2020-02-29 13:14:15").SubDecades(3).ToDateTimeString() // 1990-03-01 13:14:15
-// 三个年代前(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").SubDecadesNoOverflow(3).ToDateTimeString() // 1990-02-28 13:14:15
-// 一个年代前
-carbon.Parse("2020-02-29 13:14:15").SubDecade().ToDateTimeString() // 2010-03-01 13:14:15
-// 一个年代前(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").SubDecadeNoOverflow().ToDateTimeString() // 2010-02-28 13:14:15
-
-// 三年后
-carbon.Parse("2020-02-29 13:14:15").AddYears(3).ToDateTimeString() // 2023-03-01 13:14:15
-// 三年后(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").AddYearsNoOverflow(3).ToDateTimeString() // 2023-02-28 13:14:15
-// 一年后
-carbon.Parse("2020-02-29 13:14:15").AddYear().ToDateTimeString() // 2021-03-01 13:14:15
-// 一年后(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").AddYearNoOverflow().ToDateTimeString() // 2021-02-28 13:14:15
-// 三年前
-carbon.Parse("2020-02-29 13:14:15").SubYears(3).ToDateTimeString() // 2017-03-01 13:14:15
-// 三年前(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").SubYearsNoOverflow(3).ToDateTimeString() // 2017-02-28 13:14:15
-// 一年前
-carbon.Parse("2020-02-29 13:14:15").SubYear().ToDateTimeString() // 2019-03-01 13:14:15
-// 一年前(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").SubYearNoOverflow().ToDateTimeString() // 2019-02-28 13:14:15
-
-// 三个季度后
-carbon.Parse("2019-05-31 13:14:15").AddQuarters(3).ToDateTimeString() // 2020-03-02 13:14:15
-// 三个季度后(月份不溢出)
-carbon.Parse("2019-05-31 13:14:15").AddQuartersNoOverflow(3).ToDateTimeString() // 2020-02-29 13:14:15
-// 一个季度后
-carbon.Parse("2019-11-30 13:14:15").AddQuarter().ToDateTimeString() // 2020-03-01 13:14:15
-// 一个季度后(月份不溢出)
-carbon.Parse("2019-11-30 13:14:15").AddQuarterNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-// 三个季度前
-carbon.Parse("2019-08-31 13:14:15").SubQuarters(3).ToDateTimeString() // 2019-03-03 13:14:15
-// 三个季度前(月份不溢出)
-carbon.Parse("2019-08-31 13:14:15").SubQuartersNoOverflow(3).ToDateTimeString() // 2019-02-28 13:14:15
-// 一个季度前
-carbon.Parse("2020-05-31 13:14:15").SubQuarter().ToDateTimeString() // 2020-03-02 13:14:15
-// 一个季度前(月份不溢出)
-carbon.Parse("2020-05-31 13:14:15").SubQuarterNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-
-// 三个月后
-carbon.Parse("2020-02-29 13:14:15").AddMonths(3).ToDateTimeString() // 2020-05-29 13:14:15
-// 三个月后(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").AddMonthsNoOverflow(3).ToDateTimeString() // 2020-05-29 13:14:15
-// 一个月后
-carbon.Parse("2020-01-31 13:14:15").AddMonth().ToDateTimeString() // 2020-03-02 13:14:15
-// 一个月后(月份不溢出)
-carbon.Parse("2020-01-31 13:14:15").AddMonthNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-// 三个月前
-carbon.Parse("2020-02-29 13:14:15").SubMonths(3).ToDateTimeString() // 2019-11-29 13:14:15
-// 三个月前(月份不溢出)
-carbon.Parse("2020-02-29 13:14:15").SubMonthsNoOverflow(3).ToDateTimeString() // 2019-11-29 13:14:15
-// 一个月前
-carbon.Parse("2020-03-31 13:14:15").SubMonth().ToDateTimeString() // 2020-03-02 13:14:15
-// 一个月前(月份不溢出)
-carbon.Parse("2020-03-31 13:14:15").SubMonthNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-
-// 三周后
-carbon.Parse("2020-02-29 13:14:15").AddWeeks(3).ToDateTimeString() // 2020-03-21 13:14:15
-// 一周后
-carbon.Parse("2020-02-29 13:14:15").AddWeek().ToDateTimeString() // 2020-03-07 13:14:15
-// 三周前
-carbon.Parse("2020-02-29 13:14:15").SubWeeks(3).ToDateTimeString() // 2020-02-08 13:14:15
-// 一周前
-carbon.Parse("2020-02-29 13:14:15").SubWeek().ToDateTimeString() // 2020-02-22 13:14:15
-
-// 三天后
-carbon.Parse("2020-08-05 13:14:15").AddDays(3).ToDateTimeString() // 2020-08-08 13:14:15
-// 一天后
-carbon.Parse("2020-08-05 13:14:15").AddDay().ToDateTimeString() // 2020-08-05 13:14:15
-// 三天前
-carbon.Parse("2020-08-05 13:14:15").SubDays(3).ToDateTimeString() // 2020-08-02 13:14:15
-// 一天前
-carbon.Parse("2020-08-05 13:14:15").SubDay().ToDateTimeString() // 2020-08-04 13:14:15
-
-// 三小时后
-carbon.Parse("2020-08-05 13:14:15").AddHours(3).ToDateTimeString() // 2020-08-05 16:14:15
-// 二小时半后
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5h").ToDateTimeString() // 2020-08-05 15:44:15
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2h30m").ToDateTimeString() // 2020-08-05 15:44:15
-// 一小时后
-carbon.Parse("2020-08-05 13:14:15").AddHour().ToDateTimeString() // 2020-08-05 14:14:15
-// 三小时前
-carbon.Parse("2020-08-05 13:14:15").SubHours(3).ToDateTimeString() // 2020-08-05 10:14:15
-// 二小时半前
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5h").ToDateTimeString() // 2020-08-05 10:44:15
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2h30m").ToDateTimeString() // 2020-08-05 10:44:15
-// 一小时前
-carbon.Parse("2020-08-05 13:14:15").SubHour().ToDateTimeString() // 2020-08-05 12:14:15
-
-// 三分钟后
-carbon.Parse("2020-08-05 13:14:15").AddMinutes(3).ToDateTimeString() // 2020-08-05 13:17:15
-// 二分钟半后
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5m").ToDateTimeString() // 2020-08-05 13:16:45
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2m30s").ToDateTimeString() // 2020-08-05 13:16:45
-// 一分钟后
-carbon.Parse("2020-08-05 13:14:15").AddMinute().ToDateTimeString() // 2020-08-05 13:15:15
-// 三分钟前
-carbon.Parse("2020-08-05 13:14:15").SubMinutes(3).ToDateTimeString() // 2020-08-05 13:11:15
-// 二分钟半前
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5m").ToDateTimeString() // 2020-08-05 13:11:45
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2m30s").ToDateTimeString() // 2020-08-05 13:11:45
-// 一分钟前
-carbon.Parse("2020-08-05 13:14:15").SubMinute().ToDateTimeString() // 2020-08-05 13:13:15
-
-// 三秒钟后
-carbon.Parse("2020-08-05 13:14:15").AddSeconds(3).ToDateTimeString() // 2020-08-05 13:14:18
-// 二秒钟半后
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5s").ToDateTimeString() // 2020-08-05 13:14:17
-// 一秒钟后
-carbon.Parse("2020-08-05 13:14:15").AddSecond().ToDateTimeString() // 2020-08-05 13:14:16
-// 三秒钟前
-carbon.Parse("2020-08-05 13:14:15").SubSeconds(3).ToDateTimeString() // 2020-08-05 13:14:12
-// 二秒钟半前
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5s").ToDateTimeString() // 2020-08-05 13:14:12
-// 一秒钟前
-carbon.Parse("2020-08-05 13:14:15").SubSecond().ToDateTimeString() // 2020-08-05 13:14:14
-
-// 三毫秒后
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMilliseconds(3).ToString() // 2020-08-05 13:14:15.225222222 +0800 CST
-// 一毫秒后
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMillisecond().ToString() // 2020-08-05 13:14:15.223222222 +0800 CST
-// 三毫秒前
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMilliseconds(3).ToString() // 2020-08-05 13:14:15.219222222 +0800 CST
-// 一毫秒前
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMillisecond().ToString() // 2020-08-05 13:14:15.221222222 +0800 CST
-
-// 三微秒后
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMicroseconds(3).ToString() // 2020-08-05 13:14:15.222225222 +0800 CST
-// 一微秒后
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMicrosecond().ToString() // 2020-08-05 13:14:15.222223222 +0800 CST
-// 三微秒前
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMicroseconds(3).ToString() // 2020-08-05 13:14:15.222219222 +0800 CST
-// 一微秒前
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMicrosecond().ToString() // 2020-08-05 13:14:15.222221222 +0800 CST
-
-// 三纳秒后
-carbon.Parse("2020-08-05 13:14:15.222222222").AddNanoseconds(3).ToString() // 2020-08-05 13:14:15.222222225 +0800 CST
-// 一纳秒后
-carbon.Parse("2020-08-05 13:14:15.222222222").AddNanossecond().ToString() // 2020-08-05 13:14:15.222222223 +0800 CST
-// 三纳秒前
-carbon.Parse("2020-08-05 13:14:15.222222222").SubNanosseconds(3).ToString() // 2020-08-05 13:14:15.222222219 +0800 CST
-// 一纳秒前
-carbon.Parse("2020-08-05 13:14:15.222222222").SubNanossecond().ToString() // 2020-08-05 13:14:15.222222221 +0800 CST
-```
-
-##### 时间差值
-
-```go
-// 相差多少年
-carbon.Parse("2021-08-05 13:14:15").DiffInYears(carbon.Parse("2020-08-05 13:14:15")) // -1
-// 相差多少年(绝对值)
-carbon.Parse("2021-08-05 13:14:15").DiffAbsInYears(carbon.Parse("2020-08-05 13:14:15")) // 1
-
-// 相差多少月
-carbon.Parse("2020-08-05 13:14:15").DiffInMonths(carbon.Parse("2020-07-05 13:14:15")) // -1
-// 相差多少月(绝对值)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInMonths(carbon.Parse("2020-07-05 13:14:15")) // 1
-
-// 相差多少周
-carbon.Parse("2020-08-05 13:14:15").DiffInWeeks(carbon.Parse("2020-07-28 13:14:15")) // -1
-// 相差多少周(绝对值)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInWeeks(carbon.Parse("2020-07-28 13:14:15")) // 1
-
-// 相差多少天
-carbon.Parse("2020-08-05 13:14:15").DiffInDays(carbon.Parse("2020-08-04 13:14:15")) // -1
-// 相差多少天(绝对值)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInDays(carbon.Parse("2020-08-04 13:14:15")) // 1
-
-// 相差多少小时
-carbon.Parse("2020-08-05 13:14:15").DiffInHours(carbon.Parse("2020-08-05 12:14:15")) // -1
-// 相差多少小时(绝对值)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInHours(carbon.Parse("2020-08-05 12:14:15")) // 1
-
-// 相差多少分
-carbon.Parse("2020-08-05 13:14:15").DiffInMinutes(carbon.Parse("2020-08-05 13:13:15")) // -1
-// 相差多少分(绝对值)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInMinutes(carbon.Parse("2020-08-05 13:13:15")) // 1
-
-// 相差多少秒
-carbon.Parse("2020-08-05 13:14:15").DiffInSeconds(carbon.Parse("2020-08-05 13:14:14")) // -1
-// 相差多少秒(绝对值)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInSeconds(carbon.Parse("2020-08-05 13:14:14")) // 1
-
-// 相差字符串
-carbon.Now().DiffInString() // just now
-carbon.Now().AddYearsNoOverflow(1).DiffInString() // -1 year
-carbon.Now().SubYearsNoOverflow(1).DiffInString() // 1 year
-// 相差字符串(绝对值)
-carbon.Now().DiffAbsInString(carbon.Now()) // just now
-carbon.Now().AddYearsNoOverflow(1).DiffAbsInString(carbon.Now()) // 1 year
-carbon.Now().SubYearsNoOverflow(1).DiffAbsInString(carbon.Now()) // 1 year
-
-// 相差时长
-now := carbon.Now()
-now.DiffInDuration(now).String() // 0s
-now.AddHour().DiffInDuration(now).String() // 1h0m0s
-now.SubHour().DiffInDuration(now).String() // -1h0m0s
-// 相差时长(绝对值)
-now.DiffAbsInDuration(now).String() // 0s
-now.AddHour().DiffAbsInDuration(now).String() // 1h0m0s
-now.SubHour().DiffAbsInDuration(now).String() // 1h0m0s
-
-// 对人类友好的可读格式时间差
-carbon.Parse("2020-08-05 13:14:15").DiffForHumans() // just now
-carbon.Parse("2019-08-05 13:14:15").DiffForHumans() // 1 year ago
-carbon.Parse("2018-08-05 13:14:15").DiffForHumans() // 2 years ago
-carbon.Parse("2021-08-05 13:14:15").DiffForHumans() // 1 year from now
-carbon.Parse("2022-08-05 13:14:15").DiffForHumans() // 2 years from now
-
-carbon.Parse("2020-08-05 13:14:15").DiffForHumans(carbon.Now()) // 1 year before
-carbon.Parse("2019-08-05 13:14:15").DiffForHumans(carbon.Now()) // 2 years before
-carbon.Parse("2018-08-05 13:14:15").DiffForHumans(carbon.Now()) // 1 year after
-carbon.Parse("2022-08-05 13:14:15").DiffForHumans(carbon.Now()) // 2 years after
-```
-
-##### 时间极值
-
-```go
-c0 := carbon.Parse("2023-04-01")
-c1 := carbon.Parse("2023-03-28")
-c2 := carbon.Parse("2023-04-16")
-// 返回最近的 Carbon 实例
-c0.Closest(c1, c2) // c1
-// 返回最远的 Carbon 实例
-c0.Farthest(c1, c2) // c2
-
-yesterday := carbon.Yesterday()
-today := carbon.Now()
-tomorrow := carbon.Tomorrow()
-// 返回最大的 Carbon 实例
-carbon.Max(yesterday, today, tomorrow) // tomorrow
-// 返回最小的 Carbon 实例
-carbon.Min(yesterday, today, tomorrow) // yesterday
-
-// 返回 Carbon 的最大值
-carbon.MaxValue().ToString() // 9999-12-31 23:59:59.999999999 +0000 UTC
-// 返回 Carbon 的最小值
-carbon.MinValue().ToString() // -9998-01-01 00:00:00 +0000 UTC
-```
-
-##### 时间判断
-
-```go
-// 是否是夏令时
-carbon.Parse("").IsDST() // false
-carbon.Parse("0").IsDST() // false
-carbon.Parse("0000-00-00 00:00:00").IsDST() // false
-carbon.Parse("0000-00-00").IsDST() // false
-carbon.Parse("00:00:00").IsDST() // false
-carbon.Parse("2023-01-01", "Australia/Brisbane").IsDST() // false
-carbon.Parse("2023-01-01", "Australia/Sydney").IsDST() // true
-
-// 是否是零值时间(0001-01-01 00:00:00 +0000 UTC)
-carbon.Parse("").IsZero() // true
-carbon.Parse("0").IsZero() // true
-carbon.Parse("0000-00-00 00:00:00").IsZero() // true
-carbon.Parse("0000-00-00").IsZero() // true
-carbon.Parse("00:00:00").IsZero() // true
-carbon.Parse("2020-08-05 00:00:00").IsZero() // false
-carbon.Parse("2020-08-05").IsZero() // false
-carbon.Parse("2020-08-05").SetTimezone("xxx").IsZero() // false
-
-// 是否是有效时间
-carbon.Parse("").IsValid() // false
-carbon.Parse("0").IsValid() // false
-carbon.Parse("0000-00-00 00:00:00").IsValid() // false
-carbon.Parse("0000-00-00").IsValid() // false
-carbon.Parse("00:00:00").IsValid() // false
-carbon.Parse("2020-08-05 00:00:00").IsValid() // true
-carbon.Parse("2020-08-05").IsValid() // true
-carbon.Parse("2020-08-05").SetTimezone("xxx").IsValid() // false
-
-// 是否是无效时间
-carbon.Parse("").IsInvalid() // true
-carbon.Parse("0").IsInvalid() // true
-carbon.Parse("0000-00-00 00:00:00").IsInvalid() // true
-carbon.Parse("0000-00-00").IsInvalid() // true
-carbon.Parse("00:00:00").IsInvalid() // true
-carbon.Parse("2020-08-05 00:00:00").IsInvalid() // false
-carbon.Parse("2020-08-05").IsInvalid() // false
-carbon.Parse("2020-08-05").SetTimezone("xxx").IsInvalid() // true
-
-// 是否是上午
-carbon.Parse("2020-08-05 00:00:00").IsAM() // true
-carbon.Parse("2020-08-05 08:00:00").IsAM() // true
-carbon.Parse("2020-08-05 12:00:00").IsAM() // false
-carbon.Parse("2020-08-05 13:00:00").IsAM() // false
-// 是否是下午
-carbon.Parse("2020-08-05 00:00:00").IsPM() // false
-carbon.Parse("2020-08-05 08:00:00").IsPM() // false
-carbon.Parse("2020-08-05 12:00:00").IsPM() // true
-carbon.Parse("2020-08-05 13:00:00").IsPM() // true
-
-// 是否是当前时间
-carbon.Now().IsNow() // true
-// 是否是未来时间
-carbon.Tomorrow().IsFuture() // true
-// 是否是过去时间
-carbon.Yesterday().IsPast() // true
-
-// 是否是闰年
-carbon.Parse("2020-08-05 13:14:15").IsLeapYear() // true
-// 是否是长年
-carbon.Parse("2020-08-05 13:14:15").IsLongYear() // true
-
-// 是否是一月
-carbon.Parse("2020-08-05 13:14:15").IsJanuary() // false
-// 是否是二月
-carbon.Parse("2020-08-05 13:14:15").IsFebruary() // false
-// 是否是三月
-carbon.Parse("2020-08-05 13:14:15").IsMarch() // false
-// 是否是四月
-carbon.Parse("2020-08-05 13:14:15").IsApril() // false
-// 是否是五月
-carbon.Parse("2020-08-05 13:14:15").IsMay() // false
-// 是否是六月
-carbon.Parse("2020-08-05 13:14:15").IsJune() // false
-// 是否是七月
-carbon.Parse("2020-08-05 13:14:15").IsJuly() // false
-// 是否是八月
-carbon.Parse("2020-08-05 13:14:15").IsAugust() // false
-// 是否是九月
-carbon.Parse("2020-08-05 13:14:15").IsSeptember() // true
-// 是否是十月
-carbon.Parse("2020-08-05 13:14:15").IsOctober() // false
-// 是否是十一月
-carbon.Parse("2020-08-05 13:14:15").IsNovember() // false
-// 是否是十二月
-carbon.Parse("2020-08-05 13:14:15").IsDecember() // false
-
-// 是否是周一
-carbon.Parse("2020-08-05 13:14:15").IsMonday() // false
-// 是否是周二
-carbon.Parse("2020-08-05 13:14:15").IsTuesday() // true
-// 是否是周三
-carbon.Parse("2020-08-05 13:14:15").IsWednesday() // false
-// 是否是周四
-carbon.Parse("2020-08-05 13:14:15").IsThursday() // false
-// 是否是周五
-carbon.Parse("2020-08-05 13:14:15").IsFriday() // false
-// 是否是周六
-carbon.Parse("2020-08-05 13:14:15").IsSaturday() // false
-// 是否是周日
-carbon.Parse("2020-08-05 13:14:15").IsSunday() // false
-
-// 是否是工作日
-carbon.Parse("2020-08-05 13:14:15").IsWeekday() // false
-// 是否是周末
-carbon.Parse("2020-08-05 13:14:15").IsWeekend() // true
-
-// 是否是昨天
-carbon.Parse("2020-08-04 13:14:15").IsYesterday() // true
-carbon.Parse("2020-08-04 00:00:00").IsYesterday() // true
-carbon.Parse("2020-08-04").IsYesterday() // true
-// 是否是今天
-carbon.Parse("2020-08-05 13:14:15").IsToday() // true
-carbon.Parse("2020-08-05 00:00:00").IsToday() // true
-carbon.Parse("2020-08-05").IsToday() // true
-// 是否是明天
-carbon.Parse("2020-08-06 13:14:15").IsTomorrow() // true
-carbon.Parse("2020-08-06 00:00:00").IsTomorrow() // true
-carbon.Parse("2020-08-06").IsTomorrow() // true
-
-// 是否是同一世纪
-carbon.Parse("2020-08-05 13:14:15").IsSameCentury(carbon.Parse("3020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").IsSameCentury(carbon.Parse("2099-08-05 13:14:15")) // true
-// 是否是同一年代
-carbon.Parse("2020-08-05 13:14:15").IsSameDecade(carbon.Parse("2030-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").IsSameDecade(carbon.Parse("2120-08-05 13:14:15")) // true
-// 是否是同一年
-carbon.Parse("2020-08-05 00:00:00").IsSameYear(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-01-01 00:00:00").IsSameYear(carbon.Parse("2020-12-31 13:14:15")) // true
-// 是否是同一季节
-carbon.Parse("2020-08-05 00:00:00").IsSameQuarter(carbon.Parse("2020-09-05 13:14:15")) // false
-carbon.Parse("2020-01-01 00:00:00").IsSameQuarter(carbon.Parse("2021-01-31 13:14:15")) // true
-// 是否是同一月
-carbon.Parse("2020-01-01 00:00:00").IsSameMonth(carbon.Parse("2021-01-31 13:14:15")) // false
-carbon.Parse("2020-01-01 00:00:00").IsSameMonth(carbon.Parse("2020-01-31 13:14:15")) // true
-// 是否是同一天
-carbon.Parse("2020-08-05 13:14:15").IsSameDay(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 00:00:00").IsSameDay(carbon.Parse("2020-08-05 13:14:15")) // true
-// 是否是同一小时
-carbon.Parse("2020-08-05 13:14:15").IsSameHour(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:00:00").IsSameHour(carbon.Parse("2020-08-05 13:14:15")) // true
-// 是否是同一分钟
-carbon.Parse("2020-08-05 13:14:15").IsSameMinute(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:00").IsSameMinute(carbon.Parse("2020-08-05 13:14:15")) // true
-// 是否是同一秒
-carbon.Parse("2020-08-05 13:14:15").IsSameSecond(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").IsSameSecond(carbon.Parse("2020-08-05 13:14:15")) // true
-
-// 是否大于
-carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-05 13:14:15")) // false
-
-// 是否小于
-carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-05 13:14:15")) // false
-
-// 是否等于
-carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:00")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:00")) // false
-
-// 是否不等于
-carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare("!=", carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<>", carbon.Parse("2020-08-05 13:14:15")) // false
-
-// 是否大于等于
-carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-05 13:14:15")) // true
-
-// 是否小于等于
-carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<=", carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<=", carbon.Parse("2020-08-05 13:14:15")) // true
-
-// 是否在两个时间之间(不包括这两个时间)
-carbon.Parse("2020-08-05 13:14:15").Between(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Between(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-
-// 是否在两个时间之间(包括开始时间)
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedStart(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedStart(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-
-// 是否在两个时间之间(包括结束时间)
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedEnd(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedEnd(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-
-// 是否在两个时间之间(包括这两个时间)
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-05 13:14:15")) // true
-```
-
-> 关于长年(LongYear)的定义, 请查看 https://en.wikipedia.org/wiki/ISO_8601#Week_dates
-
-##### 时间设置
-
-```go
-// 设置时区
-carbon.SetTimezone(carbon.PRC).Now().ToDateTimeString() // 2020-08-05 13:14:15
-carbon.SetTimezone(carbon.Tokyo).Now().ToDateTimeString() // 2020-08-05 14:14:15
-carbon.SetTimezone(carbon.Tokyo).Now().SetTimezone(carbon.PRC).ToDateTimeString() // 2020-08-05 12:14:15
-
-// 设置地区
-utc, _ := time.LoadLocation(carbon.UTC)
-carbon.SetLocation(utc).Now().ToDateTimeString() // 2022-06-28 09:25:38
-tokyo, _ := time.LoadLocation(carbon.Tokyo)
-carbon.SetLocation(tokyo).Now().ToDateTimeString() // 2022-06-28 18:25:38
-
-// 设置区域
-carbon.Parse("2020-07-05 13:14:15").SetLocale("en").DiffForHumans() // 1 month ago
+carbon.Parse("2020-07-05 13:14:15").DiffForHumans() // 1 month before
carbon.Parse("2020-07-05 13:14:15").SetLocale("zh-CN").DiffForHumans() // 1 月前
-// 设置年月日时分秒
-carbon.Parse("2020-01-01").SetDateTime(2019, 2, 2, 13, 14, 15).ToString() // 2019-02-02 13:14:15 +0800 CST
-carbon.Parse("2020-01-01").SetDateTime(2019, 2, 31, 13, 14, 15).ToString() // 2019-03-03 13:14:15 +0800 CST
-// 设置年月日时分秒毫秒
-carbon.Parse("2020-01-01").SetDateTimeMilli(2019, 2, 2, 13, 14, 15, 999).ToString() // 2019-02-02 13:14:15.999 +0800 CST
-carbon.Parse("2020-01-01").SetDateTimeMilli(2019, 2, 31, 13, 14, 15, 999).ToString() // 2019-03-03 13:14:15.999 +0800 CST
-// 设置年月日时分秒微秒
-carbon.Parse("2020-01-01").SetDateTimeMicro(2019, 2, 2, 13, 14, 15, 999999).ToString() // 2019-02-02 13:14:15.999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateTimeMicro(2019, 2, 31, 13, 14, 15, 999999).ToString() // 2019-03-03 13:14:15.999999 +0800 CST
-// 设置年月日时分秒纳秒
-carbon.Parse("2020-01-01").SetDateTimeNano(2019, 2, 2, 13, 14, 15, 999999999).ToString() // 2019-02-02 13:14:15.999999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateTimeNano(2019, 2, 31, 13, 14, 15, 999999999).ToString() // 2019-03-03 13:14:15.999999999 +0800 CST
-
-// 设置年月日
-carbon.Parse("2020-01-01").SetDate(2019, 2, 2).ToString() // 2019-02-02 00:00:00 +0800 CST
-carbon.Parse("2020-01-01").SetDate(2019, 2, 31).ToString() // 2019-03-03 00:00:00 +0800 CST
-// 设置年月日毫秒
-carbon.Parse("2020-01-01").SetDateMilli(2019, 2, 2, 999).ToString() // 2019-02-02 00:00:00.999 +0800 CST
-carbon.Parse("2020-01-01").SetDateMilli(2019, 2, 31, 999).ToString() // 2019-03-03 00:00:00.999 +0800 CST
-// 设置年月日微秒
-carbon.Parse("2020-01-01").SetDateMicro(2019, 2, 2, 999999).ToString() // 2019-02-02 00:00:00.999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateMicro(2019, 2, 31, 999999).ToString() // 2019-03-03 00:00:00.999999 +0800 CST
-// 设置年月日纳秒
-carbon.Parse("2020-01-01").SetDateNano(2019, 2, 2, 999999999).ToString() // 2019-02-02 00:00:00.999999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateNano(2019, 2, 31, 999999999).ToString() // 2019-03-03 00:00:00.999999999 +0800 CST
-
-// 设置时分秒
-carbon.Parse("2020-01-01").SetTime(13, 14, 15).ToString() // 2020-01-01 13:14:15 +0800 CST
-carbon.Parse("2020-01-01").SetTime(13, 14, 90).ToString() // 2020-01-01 13:15:30 +0800 CST
-// 设置时分秒毫秒
-carbon.Parse("2020-01-01").SetTimeMilli(13, 14, 15, 999).ToString() // 2020-01-01 13:14:15.999 +0800 CST
-carbon.Parse("2020-01-01").SetTimeMilli(13, 14, 90, 999).ToString() // 2020-01-01 13:15:30.999 +0800 CST
-// 设置时分秒微秒
-carbon.Parse("2020-01-01").SetTimeMicro(13, 14, 15, 999999).ToString() // 2020-01-01 13:14:15.999999 +0800 CST
-carbon.Parse("2020-01-01").SetTimeMicro(13, 14, 90, 999999).ToString() // 2020-01-01 13:15:30.999999 +0800 CST
-// 设置时分秒纳秒
-carbon.Parse("2020-01-01").SetTimeNano(13, 14, 15, 999999999).ToString() // 2020-01-01 13:14:15.999999999 +0800 CST
-carbon.Parse("2020-01-01").SetTimeNano(13, 14, 90, 999999999).ToString() // 2020-01-01 13:15:30.999999999 +0800 CST
-
-// 设置年份
-carbon.Parse("2020-02-29").SetYear(2021).ToDateString() // 2021-03-01
-// 设置年份(月份不溢出)
-carbon.Parse("2020-02-29").SetYearNoOverflow(2021).ToDateString() // 2021-02-28
-
-// 设置月份
-carbon.Parse("2020-01-31").SetMonth(2).ToDateString() // 2020-03-02
-// 设置月份(月份不溢出)
-carbon.Parse("2020-01-31").SetMonthNoOverflow(2).ToDateString() // 2020-02-29
-
-// 设置一周的开始日期
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Monday).Week() // 6
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Sunday).Week() // 0
-
-// 设置日期
-carbon.Parse("2019-08-05").SetDay(31).ToDateString() // 2020-08-31
-carbon.Parse("2020-02-01").SetDay(31).ToDateString() // 2020-03-02
-
-// 设置小时
-carbon.Parse("2020-08-05 13:14:15").SetHour(10).ToDateTimeString() // 2020-08-05 10:14:15
-carbon.Parse("2020-08-05 13:14:15").SetHour(24).ToDateTimeString() // 2020-08-06 00:14:15
-
-// 设置分钟
-carbon.Parse("2020-08-05 13:14:15").SetMinute(10).ToDateTimeString() // 2020-08-05 13:10:15
-carbon.Parse("2020-08-05 13:14:15").SetMinute(60).ToDateTimeString() // 2020-08-05 14:00:15
-
-// 设置秒
-carbon.Parse("2020-08-05 13:14:15").SetSecond(10).ToDateTimeString() // 2020-08-05 13:14:10
-carbon.Parse("2020-08-05 13:14:15").SetSecond(60).ToDateTimeString() // 2020-08-05 13:15:00
-
-// 设置毫秒
-carbon.Parse("2020-08-05 13:14:15").SetMillisecond(100).Millisecond() // 100
-carbon.Parse("2020-08-05 13:14:15").SetMillisecond(999).Millisecond() // 999
-
-// 设置微妙
-carbon.Parse("2020-08-05 13:14:15").SetMicrosecond(100000).Microsecond() // 100000
-carbon.Parse("2020-08-05 13:14:15").SetMicrosecond(999999).Microsecond() // 999999
-
-// 设置纳秒
-carbon.Parse("2020-08-05 13:14:15").SetNanosecond(100000000).Nanosecond() // 100000000
-carbon.Parse("2020-08-05 13:14:15").SetNanosecond(999999999).Nanosecond() // 999999999
+carbon.ClearTestNow()
+carbon.IsTestNow() // false
```
-##### 时间获取
+## 文档
-```go
-// 获取本年总天数
-carbon.Parse("2019-08-05 13:14:15").DaysInYear() // 365
-carbon.Parse("2020-08-05 13:14:15").DaysInYear() // 366
-// 获取本月总天数
-carbon.Parse("2020-02-01 13:14:15").DaysInMonth() // 29
-carbon.Parse("2020-04-01 13:14:15").DaysInMonth() // 30
-carbon.Parse("2020-08-01 13:14:15").DaysInMonth() // 31
+请访问 [carbon.go-pkg.com](https://carbon.go-pkg.com) 查看完整文档
-// 获取本年第几天
-carbon.Parse("2020-08-05 13:14:15").DayOfYear() // 218
-// 获取本年第几周
-carbon.Parse("2019-12-31 13:14:15").WeekOfYear() // 1
-carbon.Parse("2020-08-05 13:14:15").WeekOfYear() // 32
-// 获取本月第几天
-carbon.Parse("2020-08-05 13:14:15").DayOfMonth() // 5
-// 获取本月第几周
-carbon.Parse("2020-08-05 13:14:15").WeekOfMonth() // 1
-// 获取本周第几天
-carbon.Parse("2020-08-05 13:14:15").DayOfWeek() // 3
-
-// 获取当前年月日时分秒
-carbon.Parse("2020-08-05 13:14:15").DateTime() // 2020,8,5,13,14,15
-// 获取当前年月日时分秒毫秒
-carbon.Parse("2020-08-05 13:14:15").DateTimeMilli() // 2020,8,5,13,14,15,999
-// 获取当前年月日时分秒微秒
-carbon.Parse("2020-08-05 13:14:15").DateTimeMicro() // 2020,8,5,13,14,15,999999
-// 获取当前年月日时分秒纳秒
-carbon.Parse("2020-08-05 13:14:15").DateTimeNano() // 2020,8,5,13,14,15,999999999
-
-// 获取当前年月日
-carbon.Parse("2020-08-05 13:14:15.999999999").Date() // 2020,8,5
-// 获取当前年月日毫秒
-carbon.Parse("2020-08-05 13:14:15.999999999").DateMilli() // 2020,8,5,999
-// 获取当前年月日微秒
-carbon.Parse("2020-08-05 13:14:15.999999999").DateMicro() // 2020,8,5,999999
-// 获取当前年月日纳秒
-carbon.Parse("2020-08-05 13:14:15.999999999").DateNano() // 2020,8,5,999999999
-
-// 获取当前时分秒
-carbon.Parse("2020-08-05 13:14:15.999999999").Time() // 13,14,15
-// 获取当前时分秒毫秒
-carbon.Parse("2020-08-05 13:14:15.999999999").TimeMilli() // 13,14,15,999
-// 获取当前时分秒微秒
-carbon.Parse("2020-08-05 13:14:15.999999999").TimeMicro() // 13,14,15,999999
-// 获取当前时分秒纳秒
-carbon.Parse("2020-08-05 13:14:15.999999999").TimeNano() // 13,14,15,999999999
-
-// 获取当前世纪
-carbon.Parse("2020-08-05 13:14:15").Century() // 21
-// 获取当前年代
-carbon.Parse("2019-08-05 13:14:15").Decade() // 10
-carbon.Parse("2021-08-05 13:14:15").Decade() // 20
-// 获取当前年份
-carbon.Parse("2020-08-05 13:14:15").Year() // 2020
-// 获取当前季度
-carbon.Parse("2020-08-05 13:14:15").Quarter() // 3
-// 获取当前月份
-carbon.Parse("2020-08-05 13:14:15").Month() // 8
-// 获取当前周(从0开始)
-carbon.Parse("2020-08-02 13:14:15").Week() // 0
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Sunday).Week() // 0
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Monday).Week() // 6
-// 获取当前天数
-carbon.Parse("2020-08-05 13:14:15").Day() // 5
-// 获取当前小时
-carbon.Parse("2020-08-05 13:14:15").Hour() // 13
-// 获取当前分钟
-carbon.Parse("2020-08-05 13:14:15").Minute() // 14
-// 获取当前秒钟
-carbon.Parse("2020-08-05 13:14:15").Second() // 15
-// 获取当前毫秒
-carbon.Parse("2020-08-05 13:14:15.999").Millisecond() // 999
-// 获取当前微秒
-carbon.Parse("2020-08-05 13:14:15.999").Microsecond() // 999000
-// 获取当前纳秒
-carbon.Parse("2020-08-05 13:14:15.999").Nanosecond() // 999000000
-
-// 获取秒级时间戳
-carbon.Parse("2020-08-05 13:14:15").Timestamp() // 1596604455
-// 获取毫秒级时间戳
-carbon.Parse("2020-08-05 13:14:15").TimestampMilli() // 1596604455000
-// 获取微秒级时间戳
-carbon.Parse("2020-08-05 13:14:15").TimestampMicro() // 1596604455000000
-// 获取纳秒级时间戳
-carbon.Parse("2020-08-05 13:14:15").TimestampNano() // 1596604455000000000
-
-// 获取时区
-carbon.SetTimezone(carbon.PRC).Timezone() // CST
-carbon.SetTimezone(carbon.Tokyo).Timezone() // JST
-
-// 获取位置
-carbon.SetTimezone(carbon.PRC).Location() // PRC
-carbon.SetTimezone(carbon.Tokyo).Location() // Asia/Tokyo
-
-// 获取距离UTC时区的偏移量,单位秒
-carbon.SetTimezone(carbon.PRC).Offset() // 28800
-carbon.SetTimezone(carbon.Tokyo).Offset() // 32400
-
-// 获取当前区域
-carbon.Now().Locale() // en
-carbon.Now().SetLocale("zh-CN").Locale() // zh-CN
-
-// 获取当前星座
-carbon.Now().Constellation() // Leo
-carbon.Now().SetLocale("en").Constellation() // Leo
-carbon.Now().SetLocale("zh-CN").Constellation() // 狮子座
-
-// 获取当前季节
-carbon.Now().Season() // Summer
-carbon.Now().SetLocale("en").Season() // Summer
-carbon.Now().SetLocale("zh-CN").Season() // 夏季
-
-// 获取年龄
-carbon.Parse("2002-01-01 13:14:15").Age() // 17
-carbon.Parse("2002-12-31 13:14:15").Age() // 18
-```
-
-##### 时间输出
-
-```go
-// 输出日期时间字符串
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeString() // 2020-08-05 13:14:15
-// 输出日期时间字符串,包含毫秒
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeMilliString() // 2020-08-05 13:14:15.999
-// 输出日期时间字符串,包含微秒
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeMicroString() // 2020-08-05 13:14:15.999999
-// 输出日期时间字符串,包含纳秒
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeNanoString() // 2020-08-05 13:14:15.999999999
-
-// 输出简写日期时间字符串
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeString() // 20200805131415
-// 输出简写日期时间字符串,包含毫秒
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeMilliString() // 20200805131415.999
-// 输出简写日期时间字符串,包含微秒
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeMicroString() // 20200805131415.999999
-// 输出简写日期时间字符串,包含纳秒
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeNanoString() // 20200805131415.999999999
-
-// 输出日期字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateString() // 2020-08-05
-// 输出日期字符串,包含毫秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateMilliString() // 2020-08-05.999
-// 输出日期字符串,包含微秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateMicroString() // 2020-08-05.999999
-// 输出日期字符串,包含纳秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateNanoString() // 2020-08-05.999999999
-
-// 输出简写日期字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateString() // 20200805
-// 输出简写日期字符串,包含毫秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateMilliString() // 20200805.999
-// 输出简写日期字符串,包含微秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateMicroString() // 20200805.999999
-// 输出简写日期字符串,包含纳秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateNanoString() // 20200805.999999999
-
-// 输出时间字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeString() // 13:14:15
-// 输出时间字符串,包含毫秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeMilliString() // 13:14:15.999
-// 输出时间字符串,包含微秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeMicroString() // 13:14:15.999999
-// 输出时间字符串,包含纳秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeNanoString() // 13:14:15.999999999
-
-// 输出简写时间字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeString() // 131415
-// 输出简写时间字符串,包含毫秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeMilliString() // 131415.999
-// 输出简写时间字符串,包含微秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeMicroString() // 131415.999999
-// 输出简写时间字符串,包含纳秒
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeNanoString() // 131415.999999999
-
-// 输出 Ansic 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToAnsicString() // Wed Aug 5 13:14:15 2020
-// 输出 Atom 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToAtomString() // 2020-08-05T13:14:15+08:00
-// 输出 UnixDate 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToUnixDateString() // Wed Aug 5 13:14:15 CST 2020
-// 输出 RubyDate 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRubyDateString() // Wed Aug 05 13:14:15 +0800 2020
-// 输出 Kitchen 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToKitchenString() // 1:14PM
-// 输出 Cookie 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToCookieString() // Wednesday, 05-Aug-2020 13:14:15 CST
-// 输出 DayDateTime 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToDayDateTimeString() // Wed, Aug 5, 2020 1:14 PM
-// 输出 RSS 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRssString() // Wed, 05 Aug 2020 13:14:15 +0800
-// 输出 W3C 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToW3cString() // 2020-08-05T13:14:15+08:00
-
-// 输出 ISO8601 格式字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601String() // 2020-08-05T13:14:15+08:00
-// 输出 ISO8601Milli 格式字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MilliString() // 2020-08-05T13:14:15.999+08:00
-// 输出 ISO8601Micro 格式字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MicroString() // 2020-08-05T13:14:15.999999+08:00
-// 输出 ISO8601Nano 格式字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601NanoString() // 2020-08-05T13:14:15.999999999+08:00
-// 输出 ISO8601Zulu 格式字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluString() // 2020-08-05T13:14:15Z
-// 输出 ISO8601ZuluMilli 格式字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluMilliString() // 2020-08-05T13:14:15.999Z
-// 输出 ISO8601ZuluMicro 格式字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluMicroString() // 2020-08-05T13:14:15.999999Z
-// 输出 ISO8601ZuluNano 格式字符串
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluNanoString() // 2020-08-05T13:14:15.999999999Z
-
-// 输出 RFC822 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRfc822String() // 05 Aug 20 13:14 CST
-// 输出 RFC822Z 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRfc822zString() // 05 Aug 20 13:14 +0800
-// 输出 RFC850 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRfc850String() // Wednesday, 05-Aug-20 13:14:15 CST
-// 输出 RFC1036 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRfc1036String() // Wed, 05 Aug 20 13:14:15 +0800
-// 输出 RFC1123 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123String() // Wed, 05 Aug 2020 13:14:15 CST
-// 输出 RFC1123Z 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123zString() // Wed, 05 Aug 2020 13:14:15 +0800
-// 输出 RFC2822 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRfc2822String() // Wed, 05 Aug 2020 13:14:15 +0800
-// 输出 RFC7231 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToRfc7231String() // Wed, 05 Aug 2020 13:14:15 GMT
-
-// 输出 RFC3339 格式字符串
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339String() // 2020-08-05T13:14:15+08:00
-// 输出 RFC3339Milli 格式字符串
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MilliString() // 2020-08-05T13:14:15.999+08:00
-// 输出 RFC3339Micro 格式字符串
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MicroString() // 2020-08-05T13:14:15.999999+08:00
-// 输出 RFC3339Nano 格式字符串
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339NanoString() // 2020-08-05T13:14:15.999999999+08:00
-
-// 输出日期时间字符串
-fmt.Printf("%s", carbon.Parse("2020-08-05 13:14:15")) // 2020-08-05 13:14:15
-
-// 输出"2006-01-02 15:04:05.999999999 -0700 MST"格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-
-// 输出 "Jan 2, 2006" 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToFormattedDateString() // Aug 5, 2020
-// 输出 "Mon, Jan 2, 2006" 格式字符串
-carbon.Parse("2020-08-05 13:14:15").ToFormattedDayDateString() // Wed, Aug 5, 2020
-
-// 输出指定布局的字符串
-carbon.Parse("2020-08-05 13:14:15").Layout(carbon.ISO8601Layout) // 2020-08-05T13:14:15+08:00
-carbon.Parse("2020-08-05 13:14:15").Layout("20060102150405") // 20200805131415
-carbon.Parse("2020-08-05 13:14:15").Layout("2006年01月02日 15时04分05秒") // 2020年08月05日 13时14分15秒
-carbon.Parse("2020-08-05 13:14:15").Layout("It is 2006-01-02 15:04:05") // It is 2020-08-05 13:14:15
-
-// 输出指定格式的字符串(如果使用的字母与格式化字符冲突时,请使用\符号转义该字符)
-carbon.Parse("2020-08-05 13:14:15").Format("YmdHis") // 20200805131415
-carbon.Parse("2020-08-05 13:14:15").Format("Y年m月d日 H时i分s秒") // 2020年08月05日 13时14分15秒
-carbon.Parse("2020-08-05 13:14:15").Format("l jS \\o\\f F Y h:i:s A") // Wednesday 5th of August 2020 01:14:15 PM
-carbon.Parse("2020-08-05 13:14:15").Format("\\I\\t \\i\\s Y-m-d H:i:s") // It is 2020-08-05 13:14:15
-```
-
-> 更多格式化输出符号请查看附录 格式化符号表
-
-##### 星座
-
-```go
-// 获取星座
-carbon.Parse("2020-08-05 13:14:15").Constellation() // Leo
-
-// 是否是白羊座
-carbon.Parse("2020-08-05 13:14:15").IsAries() // false
-// 是否是金牛座
-carbon.Parse("2020-08-05 13:14:15").IsTaurus() // false
-// 是否是双子座
-carbon.Parse("2020-08-05 13:14:15").IsGemini() // false
-// 是否是巨蟹座
-carbon.Parse("2020-08-05 13:14:15").IsCancer() // false
-// 是否是狮子座
-carbon.Parse("2020-08-05 13:14:15").IsLeo() // true
-// 是否是处女座
-carbon.Parse("2020-08-05 13:14:15").IsVirgo() // false
-// 是否是天秤座
-carbon.Parse("2020-08-05 13:14:15").IsLibra() // false
-// 是否是天蝎座
-carbon.Parse("2020-08-05 13:14:15").IsScorpio() // false
-// 是否是射手座
-carbon.Parse("2020-08-05 13:14:15").IsSagittarius() // false
-// 是否是摩羯座
-carbon.Parse("2020-08-05 13:14:15").IsCapricorn() // false
-// 是否是水瓶座
-carbon.Parse("2020-08-05 13:14:15").IsAquarius() // false
-// 是否是双鱼座
-carbon.Parse("2020-08-05 13:14:15").IsPisces() // false
-```
-
-##### 季节
-
-> 按照气象划分,即3-5月为春季,6-8月为夏季,9-11月为秋季,12-2月为冬季
-
-```go
-// 获取季节
-carbon.Parse("2020-08-05 13:14:15").Season() // Summer
-
-// 本季节开始时间
-carbon.Parse("2020-08-05 13:14:15").StartOfSeason().ToDateTimeString() // 2020-06-01 00:00:00
-// 本季节结束时间
-carbon.Parse("2020-08-05 13:14:15").EndOfSeason().ToDateTimeString() // 2020-08-31 23:59:59
-
-// 是否是春季
-carbon.Parse("2020-08-05 13:14:15").IsSpring() // false
-// 是否是夏季
-carbon.Parse("2020-08-05 13:14:15").IsSummer() // true
-// 是否是秋季
-carbon.Parse("2020-08-05 13:14:15").IsAutumn() // false
-// 是否是冬季
-carbon.Parse("2020-08-05 13:14:15").IsWinter() // false
-```
-
-##### JSON
-```go
-type Person struct {
- Name string `json:"name"`
- Age int `json:"age"`
- Birthday0 carbon.Carbon `json:"birthday0"`
- Birthday1 carbon.DateTime `json:"birthday1"`
- Birthday2 carbon.DateTimeMilli `json:"birthday2"`
- Birthday3 carbon.DateTimeMicro `json:"birthday3"`
- Birthday4 carbon.DateTimeNano `json:"birthday4"`
- GraduatedAt1 carbon.Date `json:"graduated_at1"`
- GraduatedAt2 carbon.DateMilli `json:"graduated_at2"`
- GraduatedAt3 carbon.DateMicro `json:"graduated_at3"`
- GraduatedAt4 carbon.DateNano `json:"graduated_at4"`
- OperatedAt1 carbon.Time `json:"operated_at1"`
- OperatedAt2 carbon.TimeMilli `json:"operated_at2"`
- OperatedAt3 carbon.TimeMicro `json:"operated_at3"`
- OperatedAt4 carbon.TimeNano `json:"operated_at4"`
- CreatedAt1 carbon.Timestamp `json:"created_at1"`
- CreatedAt2 carbon.TimestampMilli `json:"created_at2"`
- CreatedAt3 carbon.TimestampMicro `json:"created_at3"`
- CreatedAt4 carbon.TimestampNano `json:"created_at4"`
-}
-
-person := Person {
- Name: "gouguoyin",
- Age: 18,
- Birthday0: carbon.Now().SubYears(18),
- Birthday1: carbon.NewDateTime(carbon.Now().SubYears(18)),
- Birthday2: carbon.NewDateTimeMilli(carbon.Now().SubYears(18)),
- Birthday3: carbon.NewDateTimeMicro(carbon.Now().SubYears(18)),
- Birthday4: carbon.NewDateTimeNano(carbon.Now().SubYears(18)),
- GraduatedAt1: carbon.NewDate(carbon.Now()),
- GraduatedAt2: carbon.NewDateMilli(carbon.Now()),
- GraduatedAt3: carbon.NewDateMicro(carbon.Now()),
- GraduatedAt4: carbon.NewDateNano(carbon.Now()),
- OperatedAt1: carbon.NewTime(carbon.Now()),
- OperatedAt2: carbon.NewTimeMilli(carbon.Now()),
- OperatedAt3: carbon.NewTimeMicro(carbon.Now()),
- OperatedAt4: carbon.NewTimeNano(carbon.Now()),
- CreatedAt1: carbon.NewTimestamp(carbon.Now()),
- CreatedAt2: carbon.NewTimestampMilli(carbon.Now()),
- CreatedAt3: carbon.NewTimestampMicro(carbon.Now()),
- CreatedAt4: carbon.NewTimestampNano(carbon.Now()),
-}
-
-data, err := json.Marshal(&person)
-if err != nil {
- // 错误处理
- log.Fatal(err)
-}
-fmt.Printf("%s", data)
-// 输出
-{
- "name": "gouguoyin",
- "age": 18,
- "birthday0": "2003-07-16 13:14:15",
- "birthday1": "2003-07-16 13:14:15",
- "birthday2": "2003-07-16 13:14:15.999",
- "birthday3": "2003-07-16 13:14:15.999999",
- "birthday4": "2003-07-16 13:14:15.999999999",
- "graduated_at1": "2020-08-05",
- "graduated_at2": "2020-08-05.999",
- "graduated_at3": "2020-08-05.999999",
- "graduated_at4": "2020-08-05.999999999",
- "operated_at1": "13:14:15",
- "operated_at2": "13:14:15.999",
- "operated_at3": "13:14:15.999999",
- "operated_at4": "13:14:15.999999999",
- "created_at1": 1596604455,
- "created_at2": 1596604455999,
- "created_at3": 1596604455999999,
- "created_at4": 1596604455999999999
-}
-
-err := json.Unmarshal([]byte(data), &person)
-if err != nil {
- // 错误处理
- log.Fatal(err)
-}
-
-person.Birthday0.String() // 2003-07-16 13:14:15
-person.Birthday1.String() // 2003-07-16 13:14:15
-person.Birthday2.String() // 2003-07-16 13:14:15.999
-person.Birthday3.String() // 2003-07-16 13:14:15.999999
-person.Birthday4.String() // 2003-07-16 13:14:15.999999999
-
-person.GraduatedAt1.String() // 2020-08-05
-person.GraduatedAt2.String() // 2020-08-05.999
-person.GraduatedAt3.String() // 2020-08-05.999999
-person.GraduatedAt4.String() // 2020-08-05.999999999
-
-person.OperatedAt1.String() // 13:14:15
-person.OperatedAt2.String() // 13:14:15.999
-person.OperatedAt3.String() // 13:14:15.999999
-person.OperatedAt4.String() // 13:14:15.999999999
-
-person.CreatedAt1.String() // "1596604455"
-person.CreatedAt2.String() // "1596604455999"
-person.CreatedAt3.String() // "1596604455999999"
-person.CreatedAt4.String() // "1596604455999999999"
-
-person.CreatedAt1.Int64() // 1596604455
-person.CreatedAt2.Int64() // 1596604455999
-person.CreatedAt3.Int64() // 1596604455999999
-person.CreatedAt4.Int64() // 1596604455999999999
-```
-
-##### 日历
-
-目前支持的日历有
-
-* [儒略日/简化儒略日](./calendar/julian/README.cn.md "儒略日/简化儒略日")
-* [中国农历](./calendar/lunar/README.cn.md "中国农历")
-* [波斯历/伊朗历](./calendar/persian/README.cn.md "波斯历/伊朗历")
-
-##### 国际化
-
-目前支持的语言有
-
-* [简体中文(zh-CN)](./lang/zh-CN.json "简体中文"): 由 [gouguoyin](https://github.com/gouguoyin "gouguoyin") 翻译
-* [繁体中文(zh-TW)](./lang/zh-TW.json "繁体中文"): 由 [gouguoyin](https://github.com/gouguoyin "gouguoyin") 翻译
-* [英语(en)](./lang/en.json "英语"): 由 [gouguoyin](https://github.com/gouguoyin "gouguoyin") 翻译
-* [日语(jp)](./lang/jp.json "日语"): 由 [gouguoyin](https://github.com/gouguoyin "gouguoyin") 翻译
-* [韩语(kr)](./lang/kr.json "韩语"): 由 [nannul](https://github.com/nannul "nannul") 翻译
-* [德语(de)](./lang/de.json "德语"): 由 [benzammour](https://github.com/benzammour "benzammour") 翻译
-* [西班牙语(es)](./lang/es.json "西班牙语"): 由 [hgisinger](https://github.com/hgisinger "hgisinger") 翻译
-* [土耳其语(tr)](./lang/tr.json "土耳其语"): 由 [emresenyuva](https://github.com/emresenyuva "emresenyuva") 翻译
-* [葡萄牙语(pt)](./lang/pt.json "葡萄牙语"): 由 [felipear89](https://github.com/felipear89 "felipear89") 翻译
-* [俄罗斯语(ru)](./lang/ru.json "俄罗斯语"): 由 [zemlyak](https://github.com/zemlyak "zemlyak") 翻译
-* [乌克兰语(uk)](./lang/uk.json "乌克兰语"): 由 [open-git](https://github.com/open-git "open-git") 翻译
-* [罗马尼亚语(ro)](./lang/ro.json "罗马尼亚语"): 由 [DrOctavius](https://github.com/DrOctavius "DrOctavius") 翻译
-* [印度尼西亚语(id)](./lang/id.json "印度尼西亚语"): 由 [justpoypoy](https://github.com/justpoypoy "justpoypoy") 翻译
-* [意大利语(it)](./lang/it.json "意大利语"): 由 [nicoloHevelop](https://github.com/justpoypoy "nicoloHevelop") 翻译
-* [马来西亚巴哈马语(ms-MY)](./lang/ms-MY.json "马来西亚巴哈马语"): 由 [hollowaykeanho](https://github.com/hollowaykeanho "hollowaykeanho") 翻译
-* [法语(fr)](./lang/fr.json "法语"): 由 [hollowaykeanho](https://github.com/hollowaykeanho "hollowaykeanho") 翻译
-* [泰语(th)](./lang/th.json "泰语"): 由 [izcream](https://github.com/izcream "izcream") 翻译
-* [瑞典语(se)](./lang/se.json "瑞典语"): 由 [jwanglof](https://github.com/jwanglof "jwanglof") 翻译
-* [波斯语(fa)](./lang/fa.json "波斯语"): 由 [erfanMomeniii](https://github.com/ErfanMomeniii "ErfanMomeniii") 翻译
-* [波兰语(nl)](./lang/nl.json "波兰语"): 由 [RemcoE33](https://github.com/RemcoE33 "RemcoE33") 翻译
-* [越南语(vi)](./lang/vi.json "越南语"): 由 [culy247](https://github.com/culy247 "culy247") 翻译
-* [印地语(hi)](./lang/hi.json "印地语"): 由 [chauhan17nitin](https://github.com/chauhan17nitin "chauhan17nitin") 翻译
-* [波兰语(pl)](./lang/pl.json "波兰语"): 由 [gouguoyin](https://github.com/gouguoyin "gouguoyin") 翻译
-* [保加利亚语(bg)](./lang/bg.json "保加利亚语"): 由 [yuksbg](https://github.com/yuksbg "yuksbg") 翻译
-* [阿拉伯语(ar)](./lang/bg.json "阿拉伯语"): 由 [zumoshi](https://github.com/yuksbg "zumoshi") 翻译
-* [匈牙利语(hu)](./lang/hu.json "匈牙利语"): 由 [kenlas](https://github.com/kenlas "kenlas") 翻译
-* [丹麦语(dk)](./lang/dk.json "丹麦语"): 由 [Munk91](https://github.com/Munk91 "Munk91") 翻译
-
-目前支持的方法有
-
-* `Constellation()`:获取星座,如 `白羊座`
-* `Season()`:获取季节,如 `夏季`
-* `DiffForHumans()`:获取对人类友好的可读格式时间差,如 `一小时前`
-* `ToMonthString()`:输出完整月份字符串,如 `一月`
-* `ToShortMonthString()`:输出缩写月份字符串,如 `1月`
-* `ToWeekString()`:输出完整星期字符串,如 `星期一`
-* `ToShortWeekString()`:输出缩写星期字符串,如 `周一`
-
-###### 设置区域
-
-```go
-lang := carbon.NewLanguage()
-lang.SetLocale("zh-CN")
-
-c := carbon.SetLanguage(lang)
-if c.Error != nil {
- // 错误处理
- log.Fatal(c.Error)
-}
-
-c.Now().AddHours(1).DiffForHumans() // 1 小时后
-c.Now().AddHours(1).ToMonthString() // 八月
-c.Now().AddHours(1).ToShortMonthString() // 8月
-c.Now().AddHours(1).ToWeekString() // 星期二
-c.Now().AddHours(1).ToShortWeekString() // 周二
-c.Now().AddHours(1).Constellation() // 狮子座
-c.Now().AddHours(1).Season() // 夏季
-```
-
-###### 重写部分翻译资源(其余仍然按照指定的 `locale` 文件内容翻译)
-
-```go
-lang := carbon.NewLanguage()
-
-resources := map[string]string {
- "hour": "%dh",
-}
-lang.SetLocale("en").SetResources(resources)
-
-c := carbon.SetLanguage(lang)
-if c.Error != nil {
- // 错误处理
- log.Fatal(c.Error)
-}
-
-c.Now().AddYears(1).DiffForHumans() // 1 year from now
-c.Now().AddHours(1).DiffForHumans() // 1h from now
-c.Now().ToMonthString() // August
-c.Now().ToShortMonthString() // Aug
-c.Now().ToWeekString() // Tuesday
-c.Now().ToShortWeekString() // Tue
-c.Now().Constellation() // Leo
-c.Now().Season() // Summer
-```
-
-###### 重写全部翻译资源(无需指定 `locale`)
-
-```go
-lang := carbon.NewLanguage()
-resources := map[string]string {
- "months": "january|february|march|april|may|june|july|august|september|october|november|december",
- "short_months": "jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec",
- "weeks": "sunday|monday|tuesday|wednesday|thursday|friday|saturday",
- "short_weeks": "sun|mon|tue|wed|thu|fri|sat",
- "seasons": "spring|summer|autumn|winter",
- "constellations": "aries|taurus|gemini|cancer|leo|virgo|libra|scorpio|sagittarius|capricornus|aquarius|pisce",
- "year": "1 yr|%d yrs",
- "month": "1 mo|%d mos",
- "week": "%dw",
- "day": "%dd",
- "hour": "%dh",
- "minute": "%dm",
- "second": "%ds",
- "now": "just now",
- "ago": "%s ago",
- "from_now": "in %s",
- "before": "%s before",
- "after": "%s after",
-}
-lang.SetResources(resources)
-
-c := carbon.SetLanguage(lang)
-c.Now().AddYears(1).DiffForHumans() // in 1 yr
-c.Now().AddHours(1).DiffForHumans() // in 1h
-c.Now().ToMonthString() // august
-c.Now().ToShortMonthString() // aug
-c.Now().ToWeekString() // tuesday
-c.Now().ToShortWeekString() // tue
-c.Now().Constellation() // leo
-c.Now().Season() // summer
-```
-
-##### 模拟测试
-
-```go
-c := carbon.SetTimezone(carbon.UTC)
-
-c.Now().ToDateString() // 2023-12-27
-c.Now().IsSetTestNow() // false
-
-c.SetTestNow(carbon.Parse("2020-08-05"))
-c.Now().ToDateString() // 2020-08-05
-c.Now().IsSetTestNow() // true
-
-c.UnSetTestNow()
-c.Now().ToDateString() // 2023-12-27
-c.Now().IsSetTestNow() // false
-```
-
-##### 错误处理
-
-> 如果有多个错误发生,只返回第一个错误,前一个错误排除后才返回下一个错误
-
-```go
-c := carbon.SetTimezone("xxx").Parse("2020-08-05")
-if c.Error != nil {
- // 错误处理
- log.Fatal(c.Error)
-}
-// 输出
-invalid timezone "xxx", please see the file "$GOROOT/lib/time/zoneinfo.zip" for all valid timezones
-```
-
-#### 附录
-
-##### 格式化符号表
-
-| 符号 | 描述 | 长度 | 范围 | 示例 |
-| :------------: | :------------: |:--------------:|:----------------:| :------------: |
-| d | 月份中的第几天,有前导零 | 2 | 01-31 | 02 |
-| D | 缩写单词表示的周几 | 3 | Mon-Sun | Mon |
-| j | 月份中的第几天,没有前导零 | - | 1-31 | 2 |
-| S | 第几天的英文缩写后缀,一般和j配合使用 | 2 | st/nd/rd/th | th |
-| l | 完整单词表示的周几 | - | Monday-Sunday | Monday |
-| F | 完整单词表示的月份 | - | January-December | January |
-| m | 数字表示的月份,有前导零 | 2 | 01-12 | 01 |
-| M | 缩写单词表示的月份 | 3 | Jan-Dec | Jan |
-| n | 数字表示的月份,没有前导零 | - | 1-12 | 1 |
-| Y | 4 位数字完整表示的年份 | 4 | 0000-9999 | 2006 |
-| y | 2 位数字表示的年份 | 2 | 00-99 | 06 |
-| a | 小写的上午和下午标识 | 2 | am/pm | pm |
-| A | 大写的上午和下午标识 | 2 | AM/PM | PM |
-| g | 小时,12 小时格式 | - | 1-12 | 3 |
-| G | 小时,24 小时格式 | - | 0-23 | 15 |
-| h | 小时,12 小时格式 | 2 | 00-11 | 03 |
-| H | 小时,24 小时格式 | 2 | 00-23 | 15 |
-| i | 分钟 | 2 | 01-59 | 04 |
-| s | 秒数 | 2 | 01-59 | 05 |
-| O | 与格林威治时间相差的小时数 | - | - | -0700 |
-| P | 与格林威治时间相差的小时数,小时和分钟之间有冒号分隔 | - | - | -07:00 |
-| T | 时区缩写 | - | - | MST |
-| W | ISO8601 格式数字表示的年份中的第几周 | 2 | 01-52 | 01 |
-| N | ISO8601 格式数字表示的星期中的第几天 | 2 | 01-07 | 02 |
-| L | 是否为闰年,如果是闰年为 1,否则为 0 | 1 | 0-1 | 0 |
-| U | 秒级时间戳 | - | - | 1596604455 |
-| V | 毫级时间戳 | - | - | 1596604455666 |
-| X | 微级时间戳 | - | - | 1596604455666666 |
-| Z | 纳级时间戳 | - | - | 1596604455666666666 |
-| v | 毫秒 | - | 1-999 | 999 |
-| u | 微秒 | - | 1-999999 | 999999 |
-| x | 纳秒 | - | 1-999999999 | 999999999 |
-| w | 数字表示的周几 | 1 | 0-6 | 1 |
-| t | 月份中的总天数 | 2 | 28-31 | 31 |
-| z | 年份中的第几天 | - | 1-365 | 2 |
-| e | 当前位置 | - | - | America/New_York |
-| Q | 当前季节 | 1 | 1-4 | 1 |
-| C | 当前世纪数 | - | 0-99 | 21 |
-
-#### 常见问题
-
-1、v1 和 v2 版本有什么区别?
-> v1 和 v2 版本的 API 没有任何区别,只是 `language.go` 里翻译资源文件内嵌的实现方式不同,v1 版本是由第三方扩展库 [packr](https://github.com/gobuffalo/packr)
-> 实现的,
-> v2 版本是由 `golang1.16` 后内置标准库 [embed](https://pkg.go.dev/embed) 实现的。如果你的 go 版本大于 1.16推荐使用 v2 版本,否则必须使用 v1 版本。
-
-2、window 系统下部署二进制文件时区报错
-
-> window 系统如果没有安装 golang 环境,部署时会报 `GOROOT/lib/time/zoneinfo.zip: no such file or directory` 异常,原因是由于 window
-> 系统没有内置时区文件,只需要手动下载并指定 `zoneinfo.zip` 路径即可,如 `go/lib/time/zoneinfo.zip`
-
-```go
-os.Setenv("ZONEINFO", "./go/lib/time/zoneinfo.zip")
-```
-
-3、docker 容器部署二进制文件时区报错
-
-> docker 容器如果没有安装 golang 环境,部署时会报 `open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory`
-> 异常,只需要把 `zoneinfo.zip` 复制到容器中即可,即在 Dockerfile 中加入
-
-```go
-COPY ./zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
-```
-
-#### 参考项目
+## 参考项目
* [briannesbitt/carbon](https://github.com/briannesbitt/Carbon)
* [nodatime/nodatime](https://github.com/nodatime/nodatime)
@@ -1564,17 +98,23 @@ COPY ./zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
* [moment/moment](https://github.com/moment/moment)
* [iamkun/dayjs](https://github.com/iamkun/dayjs)
-#### 贡献者
+## 贡献者
+
感谢以下所有为 `Carbon` 做出贡献的人:
-#### 赞助
+## 赞助
-`Carbon` 是一个非商业开源项目, 如果你想支持 `Carbon`, 你可以为开发者 [购买一杯咖啡](https://www.gouguoyin.com/zanzhu.html)
+`Carbon` 是一个非商业开源项目, 如果你想支持 `Carbon`,
+你可以为开发者 [购买一杯咖啡](https://www.gouguoyin.com/zanzhu.html)
-#### 致谢
+## 致谢
`Carbon`已获取免费的 JetBrains 开源许可证,在此表示感谢
+
+## 开源协议
+
+`Carbon` 遵循 `MIT` 开源协议, 请参阅 [LICENSE](./LICENSE) 查看详细信息。
diff --git a/vendor/github.com/dromara/carbon/v2/README.jp.md b/vendor/github.com/dromara/carbon/v2/README.jp.md
index 9300c1ad..ad558128 100644
--- a/vendor/github.com/dromara/carbon/v2/README.jp.md
+++ b/vendor/github.com/dromara/carbon/v2/README.jp.md
@@ -5,17 +5,16 @@
[](https://goreportcard.com/report/github.com/dromara/carbon/v2)
[](https://codecov.io/gh/dromara/carbon)
[](https://pkg.go.dev/github.com/dromara/carbon/v2)
+
[](https://github.com/dromara/carbon/blob/master/LICENSE)
日本語 | [English](README.md) | [简体中文](README.cn.md)
-#### イントロ
+## イントロ
-シンプルでセマンティックで開発者に優しい golang 時間処理ライブラリ
+軽量、セマンティック、開発者に優しい `golang` 時間処理ライブラリ, `いかなる`第三者ライブラリにも依存せず、` 100%`ユニットテストカバレッジ率は、[awesome-go](https://github.com/avelino/awesome-go#date-and-time "awesome-go") と [hello-github](https://hellogithub.com/en/repository/dromara/carbon "hello-github") 収録
-Carbon は [awesome-go](https://github.com/avelino/awesome-go#date-and-time "awesome-go") に含まれています
-
-#### リポジトリ
+## リポジトリ
[github.com/dromara/carbon](https://github.com/dromara/carbon "github.com/dromara/carbon")
@@ -23,9 +22,10 @@ Carbon は [awesome-go](https://github.com/avelino/awesome-go#date-and-time "awe
[gitcode.com/dromara/carbon](https://gitcode.com/dromara/carbon "gitcode.com/dromara/carbon")
-#### インストール
+## クイックスタート
-##### go version >= 1.17
+### インストール
+> go version >= 1.21
```go
// github から使う
@@ -47,1495 +47,36 @@ import "gitcode.com/dromara/carbon/v2"
go mod edit -replace github.com/golang-module/carbon/v2=github.com/dromara/carbon/v2
```
-#### 使い方と例
-
-> 現在時刻が 2020-08-05 13:14:15.999999999 +0800 CST であると仮定します。
-
-##### グローバルのデフォルト値設定
+### 使い方と例
+デフォルトのタイムゾーンは` UTC `、ロケールは`英語`、週の開始日は`月曜日`、週末は`土曜日`、`日曜日`。
```go
-carbon.SetDefault(carbon.Default{
- Layout: carbon.DateTimeLayout,
- Timezone: carbon.Japan,
- WeekStartsAt: carbon.Sunday,
- Locale: "jp", // 値の範囲: langディレクトリ下の翻訳ファイル名でファイル拡張子は含まない
-})
-```
+carbon.SetTestNow(carbon.Parse("2020-08-05 13:14:15.999999999"))
+carbon.IsTestNow() // true
->エントリファイル(` main.go `など)に設定することをお勧めします
+carbon.Now().ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
+carbon.Yesterday().ToString() // 2020-08-04 13:14:15.999999999 +0000 UTC
+carbon.Tomorrow().ToString() // 2020-08-06 13:14:15.999999999 +0000 UTC
-##### Carbon と time.Time 間の変換
+carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2022-03-08T03:01:14-07:00").ToString() // 2022-03-08 10:01:14 +0000 UTC
-```go
-// time.Time を Carbon に変換
-carbon.CreateFromStdTime(time.Now())
-// Carbon を time.Time に変換
-carbon.Now().StdTime()
-```
+carbon.ParseByLayout("It is 2020-08-05 13:14:15", "It is 2006-01-02 15:04:05").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").ToString() // 2020-08-05 13:14:15 +0000 UTC
-##### 昨日、現在、明日
+carbon.CreateFromDate(2020, 8, 5).ToString() // 2020-08-05 00:00:00 +0000 UTC
+carbon.CreateFromTime(13, 14, 15).ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.CreateFromTimestamp(1596633255).ToString() // 2020-08-05 13:14:15 +0000 UTC
-```go
-// 現在時刻
-fmt.Printf("%s", carbon.Now()) // 2020-08-05 13:14:15
-carbon.Now().String() // 2020-08-05 13:14:15
-carbon.Now().ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Now().ToDateTimeString() // 2020-08-05 13:14:15
-// 現在の日付
-carbon.Now().ToDateString() // 2020-08-05
-// 現在の時間
-carbon.Now().ToTimeString() // 13:14:15
-// タイムゾーン指定の現在
-carbon.Now(Carbon.NewYork).ToDateTimeString() // 2020-08-05 14:14:15
-// 現在の秒タイムスタンプ
-carbon.Now().Timestamp() // 1596604455
-// 現在のミリ秒タイムスタンプ
-carbon.Now().TimestampMilli() // 1596604455999
-// 現在のマイクロ秒タイムスタンプ
-carbon.Now().TimestampMicro() // 1596604455999999
-// 現在のナノ秒タイムスタンプ
-carbon.Now().TimestampNano() // 1596604455999999999
-
-// 昨日の現在時刻
-fmt.Printf("%s", carbon.Yesterday()) // 2020-08-04 13:14:15
-carbon.Yesterday().String() // 2020-08-04 13:14:15
-carbon.Yesterday().ToString() // 2020-08-04 13:14:15 +0800 CST
-carbon.Yesterday().ToDateTimeString() // 2020-08-04 13:14:15
-// 昨日の日付
-carbon.Yesterday().ToDateString() // 2020-08-04
-// 昨日の時間
-carbon.Yesterday().ToTimeString() // 13:14:15
-// 日付指定の昨日
-carbon.Parse("2021-01-28 13:14:15").Yesterday().ToDateTimeString() // 2021-01-27 13:14:15
-// タイムゾーン指定の昨日
-carbon.Yesterday(Carbon.NewYork).ToDateTimeString() // 2020-08-04 14:14:15
-// 昨日の秒タイムスタンプ
-carbon.Yesterday().Timestamp() // 1596518055
-// 昨日のミリ秒タイムスタンプ
-carbon.Yesterday().TimestampMilli() // 1596518055999
-// 昨日のマイクロ秒タイムスタンプ
-carbon.Yesterday().TimestampMicro() // 1596518055999999
-// 昨日のナノ秒タイムスタンプ
-carbon.Yesterday().TimestampNano() // 1596518055999999999
-
-// 明日の現在時刻
-fmt.Printf("%s", carbon.Tomorrow()) // 2020-08-06 13:14:15
-carbon.Tomorrow().String() // 2020-08-06 13:14:15
-carbon.Tomorrow().ToString() // 2020-08-06 13:14:15 +0800 CST
-carbon.Tomorrow().ToDateTimeString() // 2020-08-06 13:14:15
-// 明日の日付
-carbon.Tomorrow().ToDateString() // 2020-08-06
-// 明日の時間
-carbon.Tomorrow().ToTimeString() // 13:14:15
-// 日付指定の明日
-carbon.Parse("2021-01-28 13:14:15").Tomorrow().ToDateTimeString() // 2021-01-29 13:14:15
-// タイムゾーン指定の明日
-carbon.Tomorrow(Carbon.NewYork).ToDateTimeString() // 2020-08-06 14:14:15
-// 明日の秒タイムスタンプ
-carbon.Tomorrow().Timestamp() // 1596690855
-// 明日のミリ秒タイムスタンプ
-carbon.Tomorrow().TimestampMilli() // 1596690855999
-// 明日のマイクロ秒タイムスタンプ
-carbon.Tomorrow().TimestampMicro() // 1596690855999999
-// 明日のナノ秒タイムスタンプ
-carbon.Tomorrow().TimestampNano() // 1596690855999999999
-```
-
-##### Carbon インスタンスを作成する
-
-```go
-// 秒タイムスタンプから Carbon インスタンスを作成します
-carbon.CreateFromTimestamp(-1).ToString() // 1970-01-01 07:59:59 +0800 CST
-carbon.CreateFromTimestamp(0).ToString() // 1970-01-01 08:00:00 +0800 CST
-carbon.CreateFromTimestamp(1).ToString() // 1970-01-01 08:00:01 +0800 CST
-carbon.CreateFromTimestamp(1649735755).ToString() // 2022-04-12 11:55:55 +0800 CST
-// ミリ秒のタイムスタンプから Carbon インスタンスを作成します
-carbon.CreateFromTimestampMilli(1649735755981).ToString() // 2022-04-12 11:55:55.981 +0800 CST
-// マイクロ秒タイムスタンプから Carbon インスタンスを作成します
-carbon.CreateFromTimestampMicro(1649735755981566).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
-// ナノタイムスタンプから Carbon インスタンスを作成します
-carbon.CreateFromTimestampNano(1649735755981566000).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
-
-// 日付と時間から Carbon インスタンスを作成します
-carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToDateTimeString() // 2020-08-05 13:14:15
-// 日付と時間、ミリ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateTimeMilli(2020, 1, 1, 13, 14, 15, 999).ToString() // 2020-01-01 13:14:15.999 +0800 CST
-// 日付と時間、マイクロ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateTimeMicro(2020, 1, 1, 13, 14, 15, 999999).ToString() // 2020-01-01 13:14:15.999999 +0800 CST
-// 日付と時間、ナノ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateTimeNano(2020, 1, 1, 13, 14, 15, 999999999).ToString() // 2020-01-01 13:14:15.999999999 +0800 CST
-
-// 日付から Carbon インスタンスを作成します
-carbon.CreateFromDate(2020, 8, 5).ToString() // 2020-08-05 00:00:00 +0800 CST
-// 日付とミリ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateMilli(2020, 8, 5, 999).ToString() // 2020-08-05 00:00:00.999 +0800 CST
-// 日付とマイクロ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateMicro(2020, 8, 5, 999999).ToString() // 2020-08-05 00:00:00.999999 +0800 CST
-// 日付とナノ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateNano(2020, 8, 5, 999999999).ToString() // 2020-08-05 00:00:00.999999999 +0800 CST
-
-// 時間から Carbon インスタンスを作成します(日付のデフォルトは現在の年月日です)
-carbon.CreateFromTime(13, 14, 15).ToString() // 2020-08-05 13:14:15 +0800 CST
-// 時間、ミリ秒から Carbon インスタンスを作成します(年月日のデフォルトは現在の年月日です)
-carbon.CreateFromTimeMilli(13, 14, 15, 999).ToString() // 2020-08-05 13:14:15.999 +0800 CST
-// 時間、マイクロ秒から Carbon インスタンスを作成します(年月日のデフォルトは現在の年月日です)
-carbon.CreateFromTimeMicro(13, 14, 15, 999999).ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-// 時間、ナノ秒から Carbon インスタンスを作成します(年月日のデフォルトは現在の年月日です)
-carbon.CreateFromTimeNano(13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-```
-
-##### 時間文字列を Carbon インスタンスにパース
-
-```go
-carbon.Parse("").ToDateTimeString() // 空の文字列
-carbon.Parse("0").ToDateTimeString() // 空の文字列
-carbon.Parse("00:00:00").ToDateTimeString() // 空の文字列
-carbon.Parse("0000-00-00").ToDateTimeString() // 空の文字列
-carbon.Parse("0000-00-00 00:00:00").ToDateTimeString() // 空の文字列
-
-carbon.Parse("now").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("yesterday").ToString() // 2020-08-04 13:14:15 +0800 CST
-carbon.Parse("tomorrow").ToString() // 2020-08-06 13:14:15 +0800 CST
-
-carbon.Parse("2020").ToString() // 2020-01-01 00:00:00 +0800 CST
-carbon.Parse("2020-8").ToString() // 2020-08-01 00:00:00 +0800 CST
-carbon.Parse("2020-08").ToString() // 2020-08-01 00:00:00 +0800 CST
-carbon.Parse("2020-8-5").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("2020-8-05").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("2020-08-05").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("2020-08-05.999").ToString() // 2020-08-05 00:00:00.999 +0800 CST
-carbon.Parse("2020-08-05.999999").ToString() // 2020-08-05 00:00:00.999999 +0800 CST
-carbon.Parse("2020-08-05.999999999").ToString() // 2020-08-05 00:00:00.999999999 +0800 CST
-
-carbon.Parse("2020-8-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-8-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05 13:14:15.999").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("2020-08-05 13:14:15.999999").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("2020-08-05 13:14:15.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-
-carbon.Parse("2020-8-5T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-8-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05T13:14:15.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("2020-08-05T13:14:15.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-
-carbon.Parse("20200805").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("20200805131415").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("20200805131415.999").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("20200805131415.999999").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("20200805131415.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-carbon.Parse("20200805131415.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("20200805131415.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("20200805131415.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-```
-
-##### フォーマットして文字列を Carbon インスタンスにパース
-
-```go
-carbon.ParseByFormat("2020|08|05 13|14|15", "Y|m|d H|i|s").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByFormat("今天是 2020年08月05日13时14分15秒", "今天是 Y年m月d日H时i分s秒").ToDateTimeString() // 2020-08-05 13:14:15
-```
-
-##### レイアウトし、文字列を Carbon インスタンスにパース
-
-```go
-carbon.ParseByLayout("2020|08|05 13|14|15", "2006|01|02 15|04|05").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByLayout("It is 2020-08-05 13:14:15", "It is 2006-01-02 15:04:05").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByLayout("今天是 2020年08月05日13时14分15秒", "今天是 2006年01月02日15时04分05秒").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByLayout("2020-08-05 13:14:15", "2006-01-02 15:04:05", carbon.Tokyo).ToDateTimeString() // 2020-08-05 14:14:15
-```
-
-##### 境界
-
-```go
-// 世紀始め
-carbon.Parse("2020-08-05 13:14:15").StartOfCentury().ToDateTimeString() // 2000-01-01 00:00:00
-// 世紀終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfCentury().ToDateTimeString() // 2999-12-31 23:59:59
-
-// 十年紀始め
-carbon.Parse("2020-08-05 13:14:15").StartOfDecade().ToDateTimeString() // 2020-01-01 00:00:00
-carbon.Parse("2021-08-05 13:14:15").StartOfDecade().ToDateTimeString() // 2020-01-01 00:00:00
-carbon.Parse("2029-08-05 13:14:15").StartOfDecade().ToDateTimeString() // 2020-01-01 00:00:00
-// 十年紀終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfDecade().ToDateTimeString() // 2029-12-31 23:59:59
-carbon.Parse("2021-08-05 13:14:15").EndOfDecade().ToDateTimeString() // 2029-12-31 23:59:59
-carbon.Parse("2029-08-05 13:14:15").EndOfDecade().ToDateTimeString() // 2029-12-31 23:59:59
-
-// 今年始め
-carbon.Parse("2020-08-05 13:14:15").StartOfYear().ToDateTimeString() // 2020-01-01 00:00:00
-// 今年終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfYear().ToDateTimeString() // 2020-12-31 23:59:59
-
-// 四半期始め
-carbon.Parse("2020-08-05 13:14:15").StartOfQuarter().ToDateTimeString() // 2020-07-01 00:00:00
-// 四半期終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfQuarter().ToDateTimeString() // 2020-09-30 23:59:59
-
-// 月始め
-carbon.Parse("2020-08-05 13:14:15").StartOfMonth().ToDateTimeString() // 2020-08-01 00:00:00
-// 月終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfMonth().ToDateTimeString() // 2020-08-31 23:59:59
-
-// 周始め
-carbon.Parse("2020-08-05 13:14:15").StartOfWeek().ToDateTimeString() // 2020-08-02 00:00:00
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Sunday).StartOfWeek().ToDateTimeString() // 2020-08-02 00:00:00
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Monday).StartOfWeek().ToDateTimeString() // 2020-08-03 00:00:00
-// 周終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfWeek().ToDateTimeString() // 2020-08-08 23:59:59
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Sunday).EndOfWeek().ToDateTimeString() // 2020-08-08 23:59:59
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Monday).EndOfWeek().ToDateTimeString() // 2020-08-09 23:59:59
-
-// 日始め
-carbon.Parse("2020-08-05 13:14:15").StartOfDay().ToDateTimeString() // 2020-08-05 00:00:00
-// 日終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfDay().ToDateTimeString() // 2020-08-05 23:59:59
-
-// 時間始め
-carbon.Parse("2020-08-05 13:14:15").StartOfHour().ToDateTimeString() // 2020-08-05 13:00:00
-// 時間終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfHour().ToDateTimeString() // 2020-08-05 13:59:59
-
-// 分始め
-carbon.Parse("2020-08-05 13:14:15").StartOfMinute().ToDateTimeString() // 2020-08-05 13:14:00
-// 分終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfMinute().ToDateTimeString() // 2020-08-05 13:14:59
-
-// 秒始め
-carbon.Parse("2020-08-05 13:14:15").StartOfSecond().ToString() // 2020-08-05 13:14:15 +0800 CST
-// 秒終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfSecond().ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-```
-
-##### 大きな時間更新
-
-```go
-// 3世紀追加
-carbon.Parse("2020-02-29 13:14:15").AddCenturies(3).ToDateTimeString() // 2320-02-29 13:14:15
-// 3世紀追加(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").AddCenturiesNoOverflow(3).ToDateTimeString() // 2320-02-29 13:14:15
-// 1世紀追加
-carbon.Parse("2020-02-29 13:14:15").AddCentury().ToDateTimeString() // 2120-02-29 13:14:15
-// 1世紀追加(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").AddCenturyNoOverflow().ToDateTimeString() // 2120-02-29 13:14:15
-// 3世紀減らす
-carbon.Parse("2020-02-29 13:14:15").SubCenturies(3).ToDateTimeString() // 1720-02-29 13:14:15
-// 3世紀減らす(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").SubCenturiesNoOverflow(3).ToDateTimeString() // 1720-02-29 13:14:15
-// 1世紀減らす
-carbon.Parse("2020-02-29 13:14:15").SubCentury().ToDateTimeString() // 1920-02-29 13:14:15
-// 1世紀減らす(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").SubCenturyNoOverflow().ToDateTimeString() // 1920-02-29 13:14:15
-
-// 30年紀追加
-carbon.Parse("2020-02-29 13:14:15").AddDecades(3).ToDateTimeString() // 2050-03-01 13:14:15
-// 30年紀追加(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").AddDecadesNoOverflow(3).ToDateTimeString() // 2050-02-28 13:14:15
-// 10年紀追加
-carbon.Parse("2020-02-29 13:14:15").AddDecade().ToDateTimeString() // 2030-03-01 13:14:15
-// 10年紀追加(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").AddDecadeNoOverflow().ToDateTimeString() // 2030-02-28 13:14:15
-// 30年紀減らす
-carbon.Parse("2020-02-29 13:14:15").SubDecades(3).ToDateTimeString() // 1990-03-01 13:14:15
-// 30年紀減らす(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").SubDecadesNoOverflow(3).ToDateTimeString() // 1990-02-28 13:14:15
-// 10年紀減らす
-carbon.Parse("2020-02-29 13:14:15").SubDecade().ToDateTimeString() // 2010-03-01 13:14:15
-// 10年紀減らす(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").SubDecadeNoOverflow().ToDateTimeString() // 2010-02-28 13:14:15
-
-// 3年追加
-carbon.Parse("2020-02-29 13:14:15").AddYears(3).ToDateTimeString() // 2023-03-01 13:14:15
-// 3年追加(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").AddYearsNoOverflow(3).ToDateTimeString() // 2023-02-28 13:14:15
-// 1年追加
-carbon.Parse("2020-02-29 13:14:15").AddYear().ToDateTimeString() // 2021-03-01 13:14:15
-// 1年追加追加(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").AddYearNoOverflow().ToDateTimeString() // 2021-02-28 13:14:15
-// 3年減らす
-carbon.Parse("2020-02-29 13:14:15").SubYears(3).ToDateTimeString() // 2017-03-01 13:14:15
-// 3年減らす(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").SubYearsNoOverflow(3).ToDateTimeString() // 2017-02-28 13:14:15
-// 1年減らす
-carbon.Parse("2020-02-29 13:14:15").SubYear().ToDateTimeString() // 2019-03-01 13:14:15
-// 1年減らす(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").SubYearNoOverflow().ToDateTimeString() // 2019-02-28 13:14:15
-
-// 3四半期追加
-carbon.Parse("2019-05-31 13:14:15").AddQuarters(3).ToDateTimeString() // 2020-03-02 13:14:15
-// 3四半期追加(オーバーフローなし)
-carbon.Parse("2019-05-31 13:14:15").AddQuartersNoOverflow(3).ToDateTimeString() // 2020-02-29 13:14:15
-// 1四半期追加
-carbon.Parse("2019-11-30 13:14:15").AddQuarter().ToDateTimeString() // 2020-03-01 13:14:15
-// 1四半期追加(オーバーフローなし)
-carbon.Parse("2019-11-30 13:14:15").AddQuarterNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-// 3四半期減らす
-carbon.Parse("2019-08-31 13:14:15").SubQuarters(3).ToDateTimeString() // 2019-03-03 13:14:15
-// 3四半期減らす(オーバーフローなし)
-carbon.Parse("2019-08-31 13:14:15").SubQuartersNoOverflow(3).ToDateTimeString() // 2019-02-28 13:14:15
-// 1四半期減らす
-carbon.Parse("2020-05-31 13:14:15").SubQuarter().ToDateTimeString() // 2020-03-02 13:14:15
-// 1四半期減らす(オーバーフローなし)
-carbon.Parse("2020-05-31 13:14:15").SubQuarterNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-
-// 3ヶ月追加
-carbon.Parse("2020-02-29 13:14:15").AddMonths(3).ToDateTimeString() // 2020-05-29 13:14:15
-// 3ヶ月追加(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").AddMonthsNoOverflow(3).ToDateTimeString() // 2020-05-29 13:14:15
-// 1ヶ月追加
-carbon.Parse("2020-01-31 13:14:15").AddMonth().ToDateTimeString() // 2020-03-02 13:14:15
-// 1ヶ月追加(オーバーフローなし)
-carbon.Parse("2020-01-31 13:14:15").AddMonthNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-// 3ヶ月減らす
-carbon.Parse("2020-02-29 13:14:15").SubMonths(3).ToDateTimeString() // 2019-11-29 13:14:15
-// 3ヶ月減らす(オーバーフローなし)
-carbon.Parse("2020-02-29 13:14:15").SubMonthsNoOverflow(3).ToDateTimeString() // 2019-11-29 13:14:15
-// 1ヶ月減らす
-carbon.Parse("2020-03-31 13:14:15").SubMonth().ToDateTimeString() // 2020-03-02 13:14:15
-// 1か月減らす(オーバーフローなし)
-carbon.Parse("2020-03-31 13:14:15").SubMonthNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-
-// 3週間追加
-carbon.Parse("2020-02-29 13:14:15").AddWeeks(3).ToDateTimeString() // 2020-03-21 13:14:15
-// 1週間追加
-carbon.Parse("2020-02-29 13:14:15").AddWeek().ToDateTimeString() // 2020-03-07 13:14:15
-// 3週間減らす
-carbon.Parse("2020-02-29 13:14:15").SubWeeks(3).ToDateTimeString() // 2020-02-08 13:14:15
-// 1週間減らす
-carbon.Parse("2020-02-29 13:14:15").SubWeek().ToDateTimeString() // 2020-02-22 13:14:15
-
-// 3日追加
-carbon.Parse("2020-08-05 13:14:15").AddDays(3).ToDateTimeString() // 2020-08-08 13:14:15
-// 1日追加
-carbon.Parse("2020-08-05 13:14:15").AddDay().ToDateTimeString() // 2020-08-05 13:14:15
-// 3日減らす
-carbon.Parse("2020-08-05 13:14:15").SubDays(3).ToDateTimeString() // 2020-08-02 13:14:15
-// 1日減らす
-carbon.Parse("2020-08-05 13:14:15").SubDay().ToDateTimeString() // 2020-08-04 13:14:15
-
-// 3時間追加
-carbon.Parse("2020-08-05 13:14:15").AddHours(3).ToDateTimeString() // 2020-08-05 16:14:15
-// 2時間半追加
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5h").ToDateTimeString() // 2020-08-05 15:44:15
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2h30m").ToDateTimeString() // 2020-08-05 15:44:15
-// 1時間追加
-carbon.Parse("2020-08-05 13:14:15").AddHour().ToDateTimeString() // 2020-08-05 14:14:15
-// 3時間減らす
-carbon.Parse("2020-08-05 13:14:15").SubHours(3).ToDateTimeString() // 2020-08-05 10:14:15
-// 2時間半減らす
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5h").ToDateTimeString() // 2020-08-05 10:44:15
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2h30m").ToDateTimeString() // 2020-08-05 10:44:15
-// 1時間減らす
-carbon.Parse("2020-08-05 13:14:15").SubHour().ToDateTimeString() // 2020-08-05 12:14:15
-
-// 3分追加
-carbon.Parse("2020-08-05 13:14:15").AddMinutes(3).ToDateTimeString() // 2020-08-05 13:17:15
-// 2分半追加
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5m").ToDateTimeString() // 2020-08-05 13:16:45
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2m30s").ToDateTimeString() // 2020-08-05 13:16:45
-// 1分追加
-carbon.Parse("2020-08-05 13:14:15").AddMinute().ToDateTimeString() // 2020-08-05 13:15:15
-// 3分減らす
-carbon.Parse("2020-08-05 13:14:15").SubMinutes(3).ToDateTimeString() // 2020-08-05 13:11:15
-// 2分半減らす
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5m").ToDateTimeString() // 2020-08-05 13:11:45
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2m30s").ToDateTimeString() // 2020-08-05 13:11:45
-// 1分減らす
-carbon.Parse("2020-08-05 13:14:15").SubMinute().ToDateTimeString() // 2020-08-05 13:13:15
-
-// 3秒追加
-carbon.Parse("2020-08-05 13:14:15").AddSeconds(3).ToDateTimeString() // 2020-08-05 13:14:18
-// 2秒半追加
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5s").ToDateTimeString() // 2020-08-05 13:14:17
-// 1秒追加
-carbon.Parse("2020-08-05 13:14:15").AddSecond().ToDateTimeString() // 2020-08-05 13:14:16
-// 3秒減らす
-carbon.Parse("2020-08-05 13:14:15").SubSeconds(3).ToDateTimeString() // 2020-08-05 13:14:12
-// 2秒半減らす
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5s").ToDateTimeString() // 2020-08-05 13:14:12
-// 1秒減らす
-carbon.Parse("2020-08-05 13:14:15").SubSecond().ToDateTimeString() // 2020-08-05 13:14:14
-
-// 3ミリ秒追加
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMilliseconds(3).ToString() // 2020-08-05 13:14:15.225222222 +0800 CST
-// 1ミリ秒追加
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMillisecond().ToString() // 2020-08-05 13:14:15.223222222 +0800 CST
-// 3ミリ秒減らす
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMilliseconds(3).ToString() // 2020-08-05 13:14:15.219222222 +0800 CST
-// 1ミリ秒減らす
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMillisecond().ToString() // 2020-08-05 13:14:15.221222222 +0800 CST
-
-// 3マイクロ秒追加
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMicroseconds(3).ToString() // 2020-08-05 13:14:15.222225222 +0800 CST
-// 1マイクロ秒追加
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMicrosecond().ToString() // 2020-08-05 13:14:15.222223222 +0800 CST
-// 3マイクロ秒減らす
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMicroseconds(3).ToString() // 2020-08-05 13:14:15.222219222 +0800 CST
-// 1マイクロ秒減らす
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMicrosecond().ToString() // 2020-08-05 13:14:15.222221222 +0800 CST
-
-// 3ナノ秒追加
-carbon.Parse("2020-08-05 13:14:15.222222222").AddNanoseconds(3).ToString() // 2020-08-05 13:14:15.222222225 +0800 CST
-// 1ナノ秒追加
-carbon.Parse("2020-08-05 13:14:15.222222222").AddNanossecond().ToString() // 2020-08-05 13:14:15.222222223 +0800 CST
-// 3ナノ秒減らす
-carbon.Parse("2020-08-05 13:14:15.222222222").SubNanosseconds(3).ToString() // 2020-08-05 13:14:15.222222219 +0800 CST
-// 1ナノ秒減らす
-carbon.Parse("2020-08-05 13:14:15.222222222").SubNanossecond().ToString() // 2020-08-05 13:14:15.222222221 +0800 CST
-```
-
-##### 時間差分
-
-```go
-// 年差
-carbon.Parse("2021-08-05 13:14:15").DiffInYears(carbon.Parse("2020-08-05 13:14:15")) // -1
-// 年差(絶対値)
-carbon.Parse("2021-08-05 13:14:15").DiffAbsInYears(carbon.Parse("2020-08-05 13:14:15")) // 1
-
-// 月差
-carbon.Parse("2020-08-05 13:14:15").DiffInMonths(carbon.Parse("2020-07-05 13:14:15")) // -1
-// 月差(絶対値)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInMonths(carbon.Parse("2020-07-05 13:14:15")) // 1
-
-// 週差
-carbon.Parse("2020-08-05 13:14:15").DiffInWeeks(carbon.Parse("2020-07-28 13:14:15")) // -1
-// 週差(絶対値)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInWeeks(carbon.Parse("2020-07-28 13:14:15")) // 1
-
-// 日差
-carbon.Parse("2020-08-05 13:14:15").DiffInDays(carbon.Parse("2020-08-04 13:14:15")) // -1
-// 日差(絶対値)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInDays(carbon.Parse("2020-08-04 13:14:15")) // 1
-
-// 時間差
-carbon.Parse("2020-08-05 13:14:15").DiffInHours(carbon.Parse("2020-08-05 12:14:15")) // -1
-// 時間差(絶対値)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInHours(carbon.Parse("2020-08-05 12:14:15")) // 1
-
-// 分差
-carbon.Parse("2020-08-05 13:14:15").DiffInMinutes(carbon.Parse("2020-08-05 13:13:15")) // -1
-// 分差(絶対値)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInMinutes(carbon.Parse("2020-08-05 13:13:15")) // 1
-
-// 秒差
-carbon.Parse("2020-08-05 13:14:15").DiffInSeconds(carbon.Parse("2020-08-05 13:14:14")) // -1
-// 秒差(絶対値)
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInSeconds(carbon.Parse("2020-08-05 13:14:14")) // 1
-
-// 時間差を文字列で返す
-carbon.Now().DiffInString() // just now
-carbon.Now().AddYearsNoOverflow(1).DiffInString() // -1 year
-carbon.Now().SubYearsNoOverflow(1).DiffInString() // 1 year
-// 時間差を文字列で返す(絶対値)
-carbon.Now().DiffAbsInString(carbon.Now()) // just now
-carbon.Now().AddYearsNoOverflow(1).DiffAbsInString(carbon.Now()) // 1 year
-carbon.Now().SubYearsNoOverflow(1).DiffAbsInString(carbon.Now()) // 1 year
-
-// 継続時間差
-now := carbon.Now()
-now.DiffInDuration(now).String() // 0s
-now.AddHour().DiffInDuration(now).String() // 1h0m0s
-now.SubHour().DiffInDuration(now).String() // -1h0m0s
-// 継続時間差(絶対値)
-now.DiffAbsInDuration(now).String() // 0s
-now.AddHour().DiffAbsInDuration(now).String() // 1h0m0s
-now.SubHour().DiffAbsInDuration(now).String() // 1h0m0s
-
-// 人が読みやすいフォーマットで時間差を取得
-carbon.Parse("2020-08-05 13:14:15").DiffForHumans() // just now
-carbon.Parse("2019-08-05 13:14:15").DiffForHumans() // 1 year ago
-carbon.Parse("2018-08-05 13:14:15").DiffForHumans() // 2 years ago
-carbon.Parse("2021-08-05 13:14:15").DiffForHumans() // 1 year from now
-carbon.Parse("2022-08-05 13:14:15").DiffForHumans() // 2 years from now
-
-carbon.Parse("2020-08-05 13:14:15").DiffForHumans(carbon.Now()) // 1 year before
-carbon.Parse("2019-08-05 13:14:15").DiffForHumans(carbon.Now()) // 2 years before
-carbon.Parse("2018-08-05 13:14:15").DiffForHumans(carbon.Now()) // 1 year after
-carbon.Parse("2022-08-05 13:14:15").DiffForHumans(carbon.Now()) // 2 years after
-```
-
-##### 極值
-
-```go
-c0 := carbon.Parse("2023-04-01")
-c1 := carbon.Parse("2023-03-28")
-c2 := carbon.Parse("2023-04-16")
-// 最近のCarbonインスタンスを返す
-c0.Closest(c1, c2) // c1
-// 遠いCarbonインスタンスを返す
-c0.Farthest(c1, c2) // c2
-
-yesterday := carbon.Yesterday()
-today := carbon.Now()
-tomorrow := carbon.Tomorrow()
-// 最大の Carbon インスタンスを返します
-carbon.Max(yesterday, today, tomorrow) // tomorrow
-// 最小の Carbon インスタンスを返します
-carbon.Min(yesterday, today, tomorrow) // yesterday
-
-// Carbonの最大値を戻す
-carbon.MaxCarbon().ToString() // 9999-12-31 23:59:59.999999999 +0000 UTC
-// Carbonの最小値を戻す
-carbon.MinCarbon().ToString() // -9998-01-01 00:00:00 +0000 UTC
-```
-
-##### 比較
-
-```go
-// 夏時間かどうか
-carbon.Parse("").IsDST() // false
-carbon.Parse("0").IsDST() // false
-carbon.Parse("0000-00-00 00:00:00").IsDST() // false
-carbon.Parse("0000-00-00").IsDST() // false
-carbon.Parse("00:00:00").IsDST() // false
-carbon.Parse("2023-01-01", "Australia/Brisbane").IsDST() // false
-carbon.Parse("2023-01-01", "Australia/Sydney").IsDST() // true
-
-// ゼロ値の時間かどうか(0001-01-01 00:00:00 +0000 UTC)
-carbon.Parse("").IsZero() // true
-carbon.Parse("0").IsZero() // true
-carbon.Parse("0000-00-00 00:00:00").IsZero() // true
-carbon.Parse("0000-00-00").IsZero() // true
-carbon.Parse("00:00:00").IsZero() // true
-carbon.Parse("2020-08-05 00:00:00").IsZero() // false
-carbon.Parse("2020-08-05").IsZero() // false
-carbon.Parse("2020-08-05").SetTimezone("xxx").IsZero() // false
-
-// 有効な時間かどうか
-carbon.Parse("").IsValid() // false
-carbon.Parse("0").IsValid() // false
-carbon.Parse("0000-00-00 00:00:00").IsValid() // false
-carbon.Parse("0000-00-00").IsValid() // false
-carbon.Parse("00:00:00").IsValid() // false
-carbon.Parse("2020-08-05 00:00:00").IsValid() // true
-carbon.Parse("2020-08-05").IsValid() // true
-carbon.Parse("2020-08-05").SetTimezone("xxx").IsValid() // false
-
-// 無効な時間かどうか
-carbon.Parse("").IsInvalid() // true
-carbon.Parse("0").IsInvalid() // true
-carbon.Parse("0000-00-00 00:00:00").IsInvalid() // true
-carbon.Parse("0000-00-00").IsInvalid() // true
-carbon.Parse("00:00:00").IsInvalid() // true
-carbon.Parse("2020-08-05 00:00:00").IsInvalid() // false
-carbon.Parse("2020-08-05").IsInvalid() // false
-carbon.Parse("2020-08-05").SetTimezone("xxx").IsInvalid() // true
-
-// 午前かどうか
-carbon.Parse("2020-08-05 00:00:00").IsAM() // true
-carbon.Parse("2020-08-05 08:00:00").IsAM() // true
-carbon.Parse("2020-08-05 12:00:00").IsAM() // false
-carbon.Parse("2020-08-05 13:00:00").IsAM() // false
-// 午後かどうか
-carbon.Parse("2020-08-05 00:00:00").IsPM() // false
-carbon.Parse("2020-08-05 08:00:00").IsPM() // false
-carbon.Parse("2020-08-05 12:00:00").IsPM() // true
-carbon.Parse("2020-08-05 13:00:00").IsPM() // true
-
-// 現在かどうか
-carbon.Now().IsNow() // true
-// 未来かどうか
-carbon.Tomorrow().IsFuture() // true
-// 過去かどうか
-carbon.Yesterday().IsPast() // true
-
-// 閏年かどうか
-carbon.Parse("2020-08-05 13:14:15").IsLeapYear() // true
-// ISO8601で定められたLong Yearかどうか
-carbon.Parse("2020-08-05 13:14:15").IsLongYear() // true
-
-// 1月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsJanuary() // false
-// 2月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsFebruary() // false
-// 3月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsMarch() // false
-// 4月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsApril() // false
-// 5月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsMay() // false
-// 6月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsJune() // false
-// 7月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsJuly() // false
-// 8月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsAugust() // false
-// 9月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSeptember() // true
-// 10月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsOctober() // false
-// 11月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsNovember() // false
-// 12月かどうか
-carbon.Parse("2020-08-05 13:14:15").IsDecember() // false
-
-// 月曜日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsMonday() // false
-// 火曜日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsTuesday() // true
-// 水曜日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsWednesday() // false
-// 木曜日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsThursday() // false
-// 金曜日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsFriday() // false
-// 土曜日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSaturday() // false
-// 日曜日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSunday() // false
-
-// 平日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsWeekday() // false
-// 週末かどうか
-carbon.Parse("2020-08-05 13:14:15").IsWeekend() // true
-
-// 昨日かどうか
-carbon.Parse("2020-08-04 13:14:15").IsYesterday() // true
-carbon.Parse("2020-08-04 00:00:00").IsYesterday() // true
-carbon.Parse("2020-08-04").IsYesterday() // true
-// 今日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsToday() // true
-carbon.Parse("2020-08-05 00:00:00").IsToday() // true
-carbon.Parse("2020-08-05").IsToday() // true
-// 明日かどうか
-carbon.Parse("2020-08-06 13:14:15").IsTomorrow() // true
-carbon.Parse("2020-08-06 00:00:00").IsTomorrow() // true
-carbon.Parse("2020-08-06").IsTomorrow() // true
-
-// 同世紀かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSameCentury(carbon.Parse("3020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").IsSameCentury(carbon.Parse("2099-08-05 13:14:15")) // true
-// 同十年紀かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSameDecade(carbon.Parse("2030-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").IsSameDecade(carbon.Parse("2120-08-05 13:14:15")) // true
-// 同年かどうか
-carbon.Parse("2020-08-05 00:00:00").IsSameYear(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-01-01 00:00:00").IsSameYear(carbon.Parse("2020-12-31 13:14:15")) // true
-// 同四半期かどうか
-carbon.Parse("2020-08-05 00:00:00").IsSameQuarter(carbon.Parse("2020-09-05 13:14:15")) // false
-carbon.Parse("2020-01-01 00:00:00").IsSameQuarter(carbon.Parse("2021-01-31 13:14:15")) // true
-// 同月かどうか
-carbon.Parse("2020-01-01 00:00:00").IsSameMonth(carbon.Parse("2021-01-31 13:14:15")) // false
-carbon.Parse("2020-01-01 00:00:00").IsSameMonth(carbon.Parse("2020-01-31 13:14:15")) // true
-// 同日かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSameDay(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 00:00:00").IsSameDay(carbon.Parse("2020-08-05 13:14:15")) // true
-// 同時間かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSameHour(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:00:00").IsSameHour(carbon.Parse("2020-08-05 13:14:15")) // true
-// 同分かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSameMinute(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:00").IsSameMinute(carbon.Parse("2020-08-05 13:14:15")) // true
-// 同秒かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSameSecond(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").IsSameSecond(carbon.Parse("2020-08-05 13:14:15")) // true
-
-// 超過かどうか
-carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-05 13:14:15")) // false
-
-// 未満かどうか
-carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-05 13:14:15")) // false
-
-// 等しいかどうか
-carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:00")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:00")) // false
-
-// と等しくないかどうか
-carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare("!=", carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<>", carbon.Parse("2020-08-05 13:14:15")) // false
-
-// 以上かどうか
-carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-05 13:14:15")) // true
-
-// 以下かどうか
-carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<=", carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<=", carbon.Parse("2020-08-05 13:14:15")) // true
-
-// 二つの Carbon インスタンスの間に含まれているか(開始時間、終了時間を含まない)
-carbon.Parse("2020-08-05 13:14:15").Between(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Between(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-
-// 二つの Carbon インスタンスの間に含まれているか(開始時間を含む)
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedStart(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedStart(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-
-// 二つの Carbon インスタンスの間に含まれているか(終了時間を含む)
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedEnd(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedEnd(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-
-// 二つの Carbon インスタンスの間に含まれているか(開始時間、終了時間を含む)
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-05 13:14:15")) // true
-```
-
-> 長年の定義については、読んでください https://en.wikipedia.org/wiki/ISO_8601#Week_dates
-
-##### 設定
-
-```go
-// タイムゾーンを設定
-carbon.SetTimezone(carbon.PRC).Now().ToDateTimeString() // 2020-08-05 13:14:15
-carbon.SetTimezone(carbon.Tokyo).Now().ToDateTimeString() // 2020-08-05 14:14:15
-carbon.SetTimezone(carbon.Tokyo).Now().SetTimezone(carbon.PRC).ToDateTimeString() // 2020-08-05 12:14:15
-
-// リージョンを設定
-utc, _ := time.LoadLocation(carbon.UTC)
-carbon.SetLocation(utc).Now().ToDateTimeString() // 2022-06-28 09:25:38
-tokyo, _ := time.LoadLocation(carbon.Tokyo)
-carbon.SetLocation(tokyo).Now().ToDateTimeString() // 2022-06-28 18:25:38
-
-// ロケールを設定
-carbon.Parse("2020-07-05 13:14:15").SetLocale("en").DiffForHumans()) // 1 month ago
+carbon.Parse("2020-07-05 13:14:15").DiffForHumans() // 1 month before
carbon.Parse("2020-07-05 13:14:15").SetLocale("jp").DiffForHumans() // 1 ヶ月前
-// 年月日時分秒を設定する
-carbon.Parse("2020-01-01").SetDateTime(2019, 2, 2, 13, 14, 15).ToString() // 2019-02-02 13:14:15 +0800 CST
-carbon.Parse("2020-01-01").SetDateTime(2019, 2, 31, 13, 14, 15).ToString() // 2019-03-03 13:14:15 +0800 CST
-// 年月日時分秒ミリ秒を設定する
-carbon.Parse("2020-01-01").SetDateTimeMilli(2019, 2, 2, 13, 14, 15, 999).ToString() // 2019-02-02 13:14:15.999 +0800 CST
-carbon.Parse("2020-01-01").SetDateTimeMilli(2019, 2, 31, 13, 14, 15, 999).ToString() // 2019-03-03 13:14:15.999 +0800 CST
-// 年月日時分秒微秒を設定する
-carbon.Parse("2020-01-01").SetDateTimeMicro(2019, 2, 2, 13, 14, 15, 999999).ToString() // 2019-02-02 13:14:15.999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateTimeMicro(2019, 2, 31, 13, 14, 15, 999999).ToString() // 2019-03-03 13:14:15.999999 +0800 CST
-// 年月日時分秒ナノ秒を設定する
-carbon.Parse("2020-01-01").SetDateTimeNano(2019, 2, 2, 13, 14, 15, 999999999).ToString() // 2019-02-02 13:14:15.999999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateTimeNano(2019, 2, 31, 13, 14, 15, 999999999).ToString() // 2019-03-03 13:14:15.999999999 +0800 CST
-
-// 年月日を設定する
-carbon.Parse("2020-01-01").SetDate(2019, 2, 2).ToString() // 2019-02-02 00:00:00 +0800 CST
-carbon.Parse("2020-01-01").SetDate(2019, 2, 31).ToString() // 2019-03-03 00:00:00 +0800 CST
-// 年月日ミリ秒を設定する
-carbon.Parse("2020-01-01").SetDateMilli(2019, 2, 2, 999).ToString() // 2019-02-02 00:00:00.999 +0800 CST
-carbon.Parse("2020-01-01").SetDateMilli(2019, 2, 31, 999).ToString() // 2019-03-03 00:00:00.999 +0800 CST
-// 年月日微秒を設定する
-carbon.Parse("2020-01-01").SetDateMicro(2019, 2, 2, 999999).ToString() // 2019-02-02 00:00:00.999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateMicro(2019, 2, 31, 999999).ToString() // 2019-03-03 00:00:00.999999 +0800 CST
-// 年月日ナノ秒を設定する
-carbon.Parse("2020-01-01").SetDateNano(2019, 2, 2, 999999999).ToString() // 2019-02-02 00:00:00.999999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateNano(2019, 2, 31, 999999999).ToString() // 2019-03-03 00:00:00.999999999 +0800 CST
-
-// 時分秒を設定する
-carbon.Parse("2020-01-01").SetTime(13, 14, 15).ToString() // 2020-01-01 13:14:15 +0800 CST
-carbon.Parse("2020-01-01").SetTime(13, 14, 90).ToString() // 2020-01-01 13:15:30 +0800 CST
-// 時分秒ミリ秒を設定する
-carbon.Parse("2020-01-01").SetTimeMilli(13, 14, 15, 999).ToString() // 2020-01-01 13:14:15.999 +0800 CST
-carbon.Parse("2020-01-01").SetTimeMilli(13, 14, 90, 999).ToString() // 2020-01-01 13:15:30.999 +0800 CST
-// 時分秒微秒を設定する
-carbon.Parse("2020-01-01").SetTimeMicro(13, 14, 15, 999999).ToString() // 2020-01-01 13:14:15.999999 +0800 CST
-carbon.Parse("2020-01-01").SetTimeMicro(13, 14, 90, 999999).ToString() // 2020-01-01 13:15:30.999999 +0800 CST
-// 時分秒ナノ秒を設定する
-carbon.Parse("2020-01-01").SetTimeNano(13, 14, 15, 999999999).ToString() // 2020-01-01 13:14:15.999999999 +0800 CST
-carbon.Parse("2020-01-01").SetTimeNano(13, 14, 90, 999999999).ToString() // 2020-01-01 13:15:30.999999999 +0800 CST
-
-// 年を設定する
-carbon.Parse("2020-02-29").SetYear(2021).ToDateString() // 2021-03-01
-// 年を設定する(オーバーフローなし)
-carbon.Parse("2020-02-29").SetYearNoOverflow(2021).ToDateString() // 2021-02-28
-
-// 月を設定する
-carbon.Parse("2020-01-31").SetMonth(2).ToDateString() // 2020-03-02
-// 月を設定する(オーバーフローなし)
-carbon.Parse("2020-01-31").SetMonthNoOverflow(2).ToDateString() // 2020-02-29
-
-// 週の開始日を設定する
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Sunday).Week() // 0
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Monday).Week() // 6
-
-// 日数を設定する
-carbon.Parse("2019-08-05").SetDay(31).ToDateString() // 2020-08-31
-carbon.Parse("2020-02-01").SetDay(31).ToDateString() // 2020-03-02
-
-// 時間を設定する
-carbon.Parse("2020-08-05 13:14:15").SetHour(10).ToDateTimeString() // 2020-08-05 10:14:15
-carbon.Parse("2020-08-05 13:14:15").SetHour(24).ToDateTimeString() // 2020-08-06 00:14:15
-
-// 分を設定する
-carbon.Parse("2020-08-05 13:14:15").SetMinute(10).ToDateTimeString() // 2020-08-05 13:10:15
-carbon.Parse("2020-08-05 13:14:15").SetMinute(60).ToDateTimeString() // 2020-08-05 14:00:15
-
-// 秒を設定する
-carbon.Parse("2020-08-05 13:14:15").SetSecond(10).ToDateTimeString() // 2020-08-05 13:14:10
-carbon.Parse("2020-08-05 13:14:15").SetSecond(60).ToDateTimeString() // 2020-08-05 13:15:00
-
-// ミリ秒を設定
-carbon.Parse("2020-08-05 13:14:15").SetMillisecond(100).Millisecond() // 100
-carbon.Parse("2020-08-05 13:14:15").SetMillisecond(999).Millisecond() // 999
-
-// 微妙に設定
-carbon.Parse("2020-08-05 13:14:15").SetMicrosecond(100000).Microsecond() // 100000
-carbon.Parse("2020-08-05 13:14:15").SetMicrosecond(999999).Microsecond() // 999999
-
-// ナノ秒を設定する
-carbon.Parse("2020-08-05 13:14:15").SetNanosecond(100000000).Nanosecond() // 100000000
-carbon.Parse("2020-08-05 13:14:15").SetNanosecond(999999999).Nanosecond() // 999999999
+carbon.ClearTestNow()
+carbon.IsTestNow() // false
```
-##### 取得
-
-```go
-// 年の総日数を取得
-carbon.Parse("2019-08-05 13:14:15").DaysInYear() // 365
-carbon.Parse("2020-08-05 13:14:15").DaysInYear() // 366
-// 月の総日数を取得
-carbon.Parse("2020-02-01 13:14:15").DaysInMonth() // 29
-carbon.Parse("2020-04-01 13:14:15").DaysInMonth() // 30
-carbon.Parse("2020-08-01 13:14:15").DaysInMonth() // 31
-
-// 年間積算日を取得
-carbon.Parse("2020-08-05 13:14:15").DayOfYear() // 218
-// 本年の何週目かを取得
-carbon.Parse("2019-12-31 13:14:15").WeekOfYear() // 1
-carbon.Parse("2020-08-05 13:14:15").WeekOfYear() // 32
-// 今月の何日目(1から)かを取得
-carbon.Parse("2020-08-05 13:14:15").DayOfMonth() // 5
-// 今月の何週目かを取得
-carbon.Parse("2020-08-05 13:14:15").WeekOfMonth() // 1
-// 今週の何日目かを取得(1が月曜日)
-carbon.Parse("2020-08-05 13:14:15").DayOfWeek() // 3
-
-// 現在の年月日時分秒を取得
-carbon.Parse("2020-08-05 13:14:15").DateTime() // 2020,8,5,13,14,15
-// 現在の年月日時分秒ミリ秒を取得
-carbon.Parse("2020-08-05 13:14:15").DateTimeMilli() // 2020,8,5,13,14,15,999
-// 現在の年月日時分秒マイクロ秒を取得
-carbon.Parse("2020-08-05 13:14:15").DateTimeMicro() // 2020,8,5,13,14,15,999999
-// 現在の年月日時分秒ナノ秒を取得
-carbon.Parse("2020-08-05 13:14:15").DateTimeNano() // 2020,8,5,13,14,15,999999999
-
-// 現在の年月日を取得
-carbon.Parse("2020-08-05 13:14:15.999999999").Date() // 2020,8,5
-// 現在の年月日ミリ秒を取得
-carbon.Parse("2020-08-05 13:14:15.999999999").DateMilli() // 2020,8,5,999
-// 現在の年月日マイクロ秒を取得
-carbon.Parse("2020-08-05 13:14:15.999999999").DateMicro() // 2020,8,5,999999
-// 現在の年月日ナノ秒を取得
-carbon.Parse("2020-08-05 13:14:15.999999999").DateNano() // 2020,8,5,999999999
-
-// 現在の時分秒を取得
-carbon.Parse("2020-08-05 13:14:15.999999999").Time() // 13,14,15
-// 現在の時分秒ミリ秒を取得
-carbon.Parse("2020-08-05 13:14:15.999999999").TimeMilli() // 13,14,15,999
-// 現在の時分秒マイクロ秒を取得
-carbon.Parse("2020-08-05 13:14:15.999999999").TimeMicro() // 13,14,15,999999
-// 現在の時分秒ナノ秒を取得
-carbon.Parse("2020-08-05 13:14:15.999999999").TimeNano() // 13,14,15,999999999
-
-// 現在の世紀を取得
-carbon.Parse("2020-08-05 13:14:15").Century() // 21
-// 現在の十年紀を取得
-carbon.Parse("2019-08-05 13:14:15").Decade() // 10
-carbon.Parse("2021-08-05 13:14:15").Decade() // 20
-// 現在の年を取得
-carbon.Parse("2020-08-05 13:14:15").Year() // 2020
-// 現在の四半期を取得
-carbon.Parse("2020-08-05 13:14:15").Quarter() // 3
-// 現在の月を取得
-carbon.Parse("2020-08-05 13:14:15").Month() // 8
-// 現在の週を取得(0から開始)
-carbon.Parse("2020-08-02 13:14:15").Week() // 0
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Sunday).Week() // 0
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Monday).Week() // 6
-// 現在の日数を取得
-carbon.Parse("2020-08-05 13:14:15").Day() // 5
-// 現在の時間を取得
-carbon.Parse("2020-08-05 13:14:15").Hour() // 13
-// 現在の分を取得
-carbon.Parse("2020-08-05 13:14:15").Minute() // 14
-// 現在の秒を取得
-carbon.Parse("2020-08-05 13:14:15").Second() // 15
-// 現在のミリ秒を取得
-carbon.Parse("2020-08-05 13:14:15.999").Millisecond() // 999
-// 現在のマイクロ秒を取得
-carbon.Parse("2020-08-05 13:14:15.999").Microsecond() // 999000
-// 現在のナノ秒を取得
-carbon.Parse("2020-08-05 13:14:15.999").Nanosecond() // 999000000
-
-// 秒タイムスタンプを取得
-carbon.Parse("2020-08-05 13:14:15").Timestamp() // 1596604455
-// ミリ秒のタイムスタンプを取得
-carbon.Parse("2020-08-05 13:14:15").TimestampMilli() // 1596604455000
-// マイクロ秒タイムスタンプを取得
-carbon.Parse("2020-08-05 13:14:15").TimestampMicro() // 1596604455000000
-// ナノ秒タイムスタンプを取得
-carbon.Parse("2020-08-05 13:14:15").TimestampNano() // 1596604455000000000
-
-// タイムゾーン名を取得
-carbon.SetTimezone(carbon.PRC).Timezone() // CST
-carbon.SetTimezone(carbon.Tokyo).Timezone() // JST
-
-// ロケーション名を取得
-carbon.SetTimezone(carbon.PRC).Location() // PRC
-carbon.SetTimezone(carbon.Tokyo).Location() // Asia/Tokyo
-
-// UTCタイムゾーンオフセットの秒を取得
-carbon.SetTimezone(carbon.PRC).Offset() // 28800
-carbon.SetTimezone(carbon.Tokyo).Offset() // 32400
-
-// ロケール名を取得
-carbon.Now().Locale() // en
-carbon.Now().SetLocale("zh-CN").Locale() // zh-CN
-
-// 星座を取得
-carbon.Now().Constellation() // Leo
-carbon.Now().SetLocale("en").Constellation() // Leo
-carbon.Now().SetLocale("jp").Constellation() // しし座
-
-// 季節を取得
-carbon.Now().Season() // Summer
-carbon.Now().SetLocale("en").Season() // Summer
-carbon.Now().SetLocale("jp").Season() // 夏
-
-// 年齢を取得
-carbon.Parse("2002-01-01 13:14:15").Age() // 17
-carbon.Parse("2002-12-31 13:14:15").Age() // 18
-```
-
-##### 出力
-
-```go
-// datetimeを文字列出力
-carbon.Parse("2020-08-05 13:14:15").ToDateTimeString() // 2020-08-05 13:14:15
-// ミリ秒を含むdatetimeを文字列出力
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeMilliString() // 2020-08-05 13:14:15.999
-// マイクロ秒を含むdatetimeを文字列出力
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeMicroString() // 2020-08-05 13:14:15.999999
-// ナノ秒を含むdatetimeを文字列出力
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeNanoString() // 2020-08-05 13:14:15.999999999
-
-// datetimeを略語形式の文字列出力
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeString() // 20200805131415
-// ミリ秒を含むdatetimeを略語形式の文字列出力
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeMilliString() // 20200805131415.999
-// マイクロ秒を含むdatetimeを略語形式の文字列出力
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeMicroString() // 20200805131415.999999
-// ナノ秒を含むdatetimeを略語形式の文字列出力
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeNanoString() // 20200805131415.999999999
-
-// dateを文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateString() // 2020-08-05
-// ミリ秒を含むdateを文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateMilliString() // 2020-08-05.999
-// マイクロ秒を含むdateを文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateMicroString() // 2020-08-05.999999
-// ナノ秒を含むdateを文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateNanoString() // 2020-08-05.999999999
-
-// dateを略語形式の文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateString() // 20200805
-// ミリ秒を含むdateを略語形式の文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateMilliString() // 20200805.999
-// マイクロ秒を含むdateを略語形式の文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateMicroString() // 20200805.999999
-// ナノ秒を含むdateを略語形式の文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateNanoString() // 20200805.999999999
-
-// 時間を文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeString() // 13:14:15
-// ミリ秒を含む時間を文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeMilliString() // 13:14:15.999
-// マイクロ秒を含む時間を文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeMicroString() // 13:14:15.999999
-// ナノ秒を含む時間を文字列出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeNanoString() // 13:14:15.999999999
-
-// 時間を略語形式の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeString() // 131415
-// ミリ秒を含む時間を略語形式の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeMilliString() // 131415.999
-// マイクロ秒を含む時間を略語形式の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeMicroString() // 131415.999999
-// ナノ秒を含む時間を略語形式の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeNanoString() // 131415.999999999
-
-// Ansic フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToAnsicString() // Wed Aug 5 13:14:15 2020
-// Atom フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToAtomString() // 2020-08-05T13:14:15+08:00
-// UnixDate フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToUnixDateString() // Wed Aug 5 13:14:15 CST 2020
-// RubyDate フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRubyDateString() // Wed Aug 05 13:14:15 +0800 2020
-// Kitchen フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToKitchenString() // 1:14PM
-// Cookie フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToCookieString() // Wednesday, 05-Aug-2020 13:14:15 CST
-// DayDateTime フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToDayDateTimeString() // Wed, Aug 5, 2020 1:14 PM
-// RSS フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRssString() // Wed, 05 Aug 2020 13:14:15 +0800
-// W3C フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToW3cString() // 2020-08-05T13:14:15+08:00
-
-// ISO8601 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601String() // 2020-08-05T13:14:15+08:00
-// ISO8601Milli フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MilliString() // 2020-08-05T13:14:15.999+08:00
-// ISO8601Micro フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MicroString() // 2020-08-05T13:14:15.999999+08:00
-// ISO8601Nano フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601NanoString() // 2020-08-05T13:14:15.999999999+08:00
-// ISO8601Zulu フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluString() // 2020-08-05T13:14:15Z
-// ISO8601ZuluMilli フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluMilliString() // 2020-08-05T13:14:15.999Z
-// ISO8601ZuluMicro フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluMicroString() // 2020-08-05T13:14:15.999999Z
-// ISO8601ZuluNano フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluNanoString() // 2020-08-05T13:14:15.999999999Z
-
-// RFC822 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc822String() // 05 Aug 20 13:14 CST
-// RFC822Z フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc822zString() // 05 Aug 20 13:14 +0800
-// RFC850 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc850String() // Wednesday, 05-Aug-20 13:14:15 CST
-// RFC1036 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc1036String() // Wed, 05 Aug 20 13:14:15 +0800
-// RFC1123 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123String() // Wed, 05 Aug 2020 13:14:15 CST
-// RFC1123Z フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123zString() // Wed, 05 Aug 2020 13:14:15 +0800
-// RFC2822 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc2822String() // Wed, 05 Aug 2020 13:14:15 +0800
-// RFC7231 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc7231String() // Wed, 05 Aug 2020 13:14:15 GMT
-
-// RFC3339 フォーマット文字列の出力
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339String() // 2020-08-05T13:14:15+08:00
-// RFC3339 フォーマット文字列の出力(ミリ秒を含む)
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MilliString() // 2020-08-05T13:14:15.999+08:00
-// RFC3339 フォーマット文字列の出力(マイクロ秒を含む)
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MicroString() // 2020-08-05T13:14:15.999999+08:00
-// RFC3339 フォーマット文字列の出力(ナノ秒を含む)
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339NanoString() // 2020-08-05T13:14:15.999999999+08:00
-
-// 日付時間文字列の出力
-fmt.Printf("%s", carbon.Parse("2020-08-05 13:14:15")) // 2020-08-05 13:14:15
-
-// "2006-01-02 15:04:05.999999999 -0700 MST" フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-
-// "Jan 2, 2006" フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToFormattedDateString() // Aug 5, 2020
-// "Mon, Jan 2, 2006" フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToFormattedDayDateString() // Wed, Aug 5, 2020
-
-// レイアウトを指定する文字列の出力
-carbon.Parse("2020-08-05 13:14:15").Layout(carbon.ISO8601Layout) // 2020-08-05T13:14:15+08:00
-carbon.Parse("2020-08-05 13:14:15").Layout("20060102150405") // 20200805131415
-carbon.Parse("2020-08-05 13:14:15").Layout("2006年01月02日 15时04分05秒") // 2020年08月05日 13时14分15秒
-carbon.Parse("2020-08-05 13:14:15").Layout("It is 2006-01-02 15:04:05") // It is 2020-08-05 13:14:15
-
-// 指定されたフォーマットの文字列の出力
-carbon.Parse("2020-08-05 13:14:15").Format("YmdHis") // 20200805131415
-carbon.Parse("2020-08-05 13:14:15").Format("Y年m月d日 H时i分s秒") // 2020年08月05日 13时14分15秒
-carbon.Parse("2020-08-05 13:14:15").Format("l jS \\o\\f F Y h:i:s A") // Wednesday 5th of August 2020 01:14:15 PM
-carbon.Parse("2020-08-05 13:14:15").Format("\\I\\t \\i\\s Y-m-d H:i:s") // It is 2020-08-05 13:14:15
-```
-
-> もっとフォーマットした出力記号は付録を見てください 書式設定記号表
-
-##### 星座
-
-```go
-// 星座を取得
-carbon.Parse("2020-08-05 13:14:15").Constellation() // Leo
-
-// おひつじ座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsAries() // false
-// おうし座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsTaurus() // false
-// ふたご座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsGemini() // false
-// かに座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsCancer() // false
-// しし座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsLeo() // true
-// おとめ座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsVirgo() // false
-// てんびん座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsLibra() // false
-// さそり座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsScorpio() // false
-// いて座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSagittarius() // false
-// やぎ座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsCapricorn() // false
-// みずがめ座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsAquarius() // false
-// うお座かどうか
-carbon.Parse("2020-08-05 13:14:15").IsPisces() // false
-```
-
-##### 季節
-
-> 気象区分によると、3-5月は春で、6-8月は夏で、9-11月は秋で、12-2月は冬です
-
-```go
-// 季節を取得
-carbon.Parse("2020-08-05 13:14:15").Season() // Summer
-
-// この季節の開始日
-carbon.Parse("2020-08-05 13:14:15").StartOfSeason().ToDateTimeString() // 2020-06-01 00:00:00
-// この季節の最終日
-carbon.Parse("2020-08-05 13:14:15").EndOfSeason().ToDateTimeString() // 2020-08-31 23:59:59
-
-// 春かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSpring() // false
-// 夏かどうか
-carbon.Parse("2020-08-05 13:14:15").IsSummer() // true
-// 秋かどうか
-carbon.Parse("2020-08-05 13:14:15").IsAutumn() // false
-// 冬かどうか
-carbon.Parse("2020-08-05 13:14:15").IsWinter() // false
-```
-
-##### JSON
-
-```go
-type Person struct {
- Name string `json:"name"`
- Age int `json:"age"`
- Birthday0 carbon.Carbon `json:"birthday0"`
- Birthday1 carbon.DateTime `json:"birthday1"`
- Birthday2 carbon.DateTimeMilli `json:"birthday2"`
- Birthday3 carbon.DateTimeMicro `json:"birthday3"`
- Birthday4 carbon.DateTimeNano `json:"birthday4"`
- GraduatedAt1 carbon.Date `json:"graduated_at1"`
- GraduatedAt2 carbon.DateMilli `json:"graduated_at2"`
- GraduatedAt3 carbon.DateMicro `json:"graduated_at3"`
- GraduatedAt4 carbon.DateNano `json:"graduated_at4"`
- OperatedAt1 carbon.Time `json:"operated_at1"`
- OperatedAt2 carbon.TimeMilli `json:"operated_at2"`
- OperatedAt3 carbon.TimeMicro `json:"operated_at3"`
- OperatedAt4 carbon.TimeNano `json:"operated_at4"`
- CreatedAt1 carbon.Timestamp `json:"created_at1"`
- CreatedAt2 carbon.TimestampMilli `json:"created_at2"`
- CreatedAt3 carbon.TimestampMicro `json:"created_at3"`
- CreatedAt4 carbon.TimestampNano `json:"created_at4"`
-}
-
-person := Person {
- Name: "gouguoyin",
- Age: 18,
- Birthday0: carbon.Now().SubYears(18),
- Birthday1: carbon.NewDateTime(carbon.Now().SubYears(18)),
- Birthday2: carbon.NewDateTimeMilli(carbon.Now().SubYears(18)),
- Birthday3: carbon.NewDateTimeMicro(carbon.Now().SubYears(18)),
- Birthday4: carbon.NewDateTimeNano(carbon.Now().SubYears(18)),
- GraduatedAt1: carbon.NewDate(carbon.Now()),
- GraduatedAt2: carbon.NewDateMilli(carbon.Now()),
- GraduatedAt3: carbon.NewDateMicro(carbon.Now()),
- GraduatedAt4: carbon.NewDateNano(carbon.Now()),
- OperatedAt1: carbon.NewTime(carbon.Now()),
- OperatedAt2: carbon.NewTimeMilli(carbon.Now()),
- OperatedAt3: carbon.NewTimeMicro(carbon.Now()),
- OperatedAt4: carbon.NewTimeNano(carbon.Now()),
- CreatedAt1: carbon.NewTimestamp(carbon.Now()),
- CreatedAt2: carbon.NewTimestampMilli(carbon.Now()),
- CreatedAt3: carbon.NewTimestampMicro(carbon.Now()),
- CreatedAt4: carbon.NewTimestampNano(carbon.Now()),
-}
-
-data, err := json.Marshal(&person)
-if err != nil {
- // エラー処理...
- log.Fatal(err)
-}
-fmt.Printf("%s", data)
-// 出力
-{
- "name": "gouguoyin",
- "age": 18,
- "birthday0": "2003-07-16 13:14:15",
- "birthday1": "2003-07-16 13:14:15",
- "birthday2": "2003-07-16 13:14:15.999",
- "birthday3": "2003-07-16 13:14:15.999999",
- "birthday4": "2003-07-16 13:14:15.999999999",
- "graduated_at1": "2020-08-05",
- "graduated_at2": "2020-08-05.999",
- "graduated_at3": "2020-08-05.999999",
- "graduated_at4": "2020-08-05.999999999",
- "operated_at1": "13:14:15",
- "operated_at2": "13:14:15.999",
- "operated_at3": "13:14:15.999999",
- "operated_at4": "13:14:15.999999999",
- "created_at1": 1596604455,
- "created_at2": 1596604455999,
- "created_at3": 1596604455999999,
- "created_at4": 1596604455999999999
-}
-
-err := json.Unmarshal([]byte(data), &person)
-if err != nil {
- // エラー処理...
- log.Fatal(err)
-}
-
-person.Birthday0.String() // 2003-07-16 13:14:15
-person.Birthday1.String() // 2003-07-16 13:14:15
-person.Birthday2.String() // 2003-07-16 13:14:15.999
-person.Birthday3.String() // 2003-07-16 13:14:15.999999
-person.Birthday4.String() // 2003-07-16 13:14:15.999999999
-
-person.GraduatedAt1.String() // 2020-08-05
-person.GraduatedAt2.String() // 2020-08-05.999
-person.GraduatedAt3.String() // 2020-08-05.999999
-person.GraduatedAt4.String() // 2020-08-05.999999999
-
-person.OperatedAt1.String() // 13:14:15
-person.OperatedAt2.String() // 13:14:15.999
-person.OperatedAt3.String() // 13:14:15.999999
-person.OperatedAt4.String() // 13:14:15.999999999
-
-person.CreatedAt1.String() // "1596604455"
-person.CreatedAt2.String() // "1596604455999"
-person.CreatedAt3.String() // "1596604455999999"
-person.CreatedAt4.String() // "1596604455999999999"
-
-person.CreatedAt1.Int64() // 1596604455
-person.CreatedAt2.Int64() // 1596604455999
-person.CreatedAt3.Int64() // 1596604455999999
-person.CreatedAt4.Int64() // 1596604455999999999
-```
-
-##### カレンダー
-
-現在サポートされているカレンダー
-
-* [儒略の日/簡略化儒略の日](./calendar/julian/README.jp.md "儒略日/简化儒略日")
-* [中国の旧暦](./calendar/lunar/README.jp.md "中国の旧暦")
-* [ペルシャ暦/イラン暦](./calendar/persian/README.jp.md "ペルシャ暦/イラン暦")
-
-##### i18n
-
-現在サポートされている言語
-
-* [简体中国語(zh-CN)](./lang/zh-CN.json "简体中国語"):[gouguoyin](https://github.com/gouguoyin "gouguoyin") に翻訳
-* [繁体中国語(zh-TW)](./lang/zh-TW.json "繁体中国語"):[gouguoyin](https://github.com/gouguoyin "gouguoyin") に翻訳
-* [英語(en)](./lang/en.json "英語"):[gouguoyin](https://github.com/gouguoyin "gouguoyin") に翻訳
-* [日本語(jp)](./lang/jp.json "日本語"):[gouguoyin](https://github.com/gouguoyin "gouguoyin") に翻訳
-* [韓国語(kr)](./lang/kr.json "韓国語"):[benzammour](https://github.com/benzammour "benzammour") に翻訳
-* [ドイツ語(de)](./lang/de.json "ドイツ語"):[benzammour](https://github.com/benzammour "benzammour") に翻訳
-* [スペイン語(es)](./lang/es.json "スペイン語"):[hgisinger](https://github.com/hgisinger "hgisinger") に翻訳
-* [トルコ語(tr)](./lang/tr.json "トルコ語"):[emresenyuva](https://github.com/emresenyuva "emresenyuva") に翻訳
-* [ポルトガル語(pt)](./lang/pt.json "ポルトガル語"):[felipear89](https://github.com/felipear89 "felipear89") に翻訳
-* [ロシア語(ru)](./lang/ru.json "ロシア語"):[zemlyak](https://github.com/zemlyak "zemlyak") に翻訳
-* [ウクライナ語(uk)](./lang/uk.json "ウクライナ語"):[open-git](https://github.com/open-git "open-git") に翻訳
-* [ルーマニア語(ro)](./lang/ro.json "ルーマニア語"): [DrOctavius](https://github.com/DrOctavius "DrOctavius") に翻訳
-* [インドネシア語(id)](./lang/id.json "インドネシア語"): [justpoypoy](https://github.com/justpoypoy "justpoypoy") に翻訳
-* [イタリア語(it)](./lang/it.json "イタリア語"): [nicoloHevelop](https://github.com/hollowaykeanho "nicoloHevelop") に翻訳
-* [マレーシアバハマ語(ms-MY)](./lang/ms-MY.json "マレーシアバハマ語"): [hollowaykeanho](https://github.com/hollowaykeanho "hollowaykeanho") に翻訳
-* [フランス語(fr)](./lang/fr.json "フランス語"): [hollowaykeanho](https://github.com/hollowaykeanho "hollowaykeanho") に翻訳
-* [タイ語(th)](./lang/th.json "タイ語"): [izcream](https://github.com/izcream "izcream") に翻訳
-* [スウェーデン語(se)](./lang/se.json "スウェーデン語"): [jwanglof](https://github.com/jwanglof "jwanglof") に翻訳
-* [ペルシア語(fa)](./lang/fa.json "ペルシア語"): [Iranian](https://github.com/Iranian "Iranian") に翻訳
-* [ポーランド語(nl)](./lang/nl.json "ポーランド語"): [RemcoE33](https://github.com/RemcoE33 "RemcoE33") に翻訳
-* [ベトナム語(vi)](./lang/vi.json "ベトナム語"): [culy247](https://github.com/culy247 "culy247") に翻訳
-* [ヒンディー語(hi)](./lang/hi.json "ヒンディー語"): [chauhan17nitin](https://github.com/chauhan17nitin "chauhan17nitin") に翻訳
-* [ポーランド語(pl)](./lang/pl.json "ポーランド語"): [gouguoyin](https://github.com/gouguoyin "gouguoyin") に翻訳
-* [ブルガリア語(bg)](./lang/bg.json "ブルガリア語"): [yuksbg](https://github.com/yuksbg "yuksbg") に翻訳
-* [アラビア語(ar)](./lang/ar.json "アラビア語"): [zumoshi](https://github.com/zumoshi "zumoshi") に翻訳
-* [ハンガリー語(hu)](./lang/hu.json "ハンガリー語"): [kenlas](https://github.com/kenlas "kenlas") に翻訳
-* [デンマーク語(dk)](./lang/dk.json "デンマーク語"): [Munk91](https://github.com/Munk91 "Munk91") に翻訳
-
-現在サポートされている方法
-
-* `Constellation()`:星座を取得,例えば `おひつじ座`
-* `Season()`:シーズンを取得,例えば `春`
-* `DiffForHumans()`:人が読みやすい形の時間差を取得します,例えば `1時間前`
-* `ToMonthString()`:月文字列の出力,例えば `いちがつ`
-* `ToShortMonthString()`:略語月文字列の出力,例えば `1がつ`
-* `ToWeekString()`:週文字列の出力,例えば `日曜日`
-* `ToShortWeekString()`:略語週文字列の出力,例えば `日`
-
-###### エリアの設定
-
-```go
-lang := carbon.NewLanguage()
-lang.SetLocale("jp")
-
-c := carbon.SetLanguage(lang)
-if c.Error != nil {
- // エラー処理
- log.Fatal(c.Error)
-}
-
-c.Now().AddHours(1).DiffForHumans() // 1 時間後
-c.Now().AddHours(1).ToMonthString() // はちがつ
-c.Now().AddHours(1).ToShortMonthString() // 8がつ
-c.Now().AddHours(1).ToWeekString() // 日曜日
-c.Now().AddHours(1).ToShortWeekString() // 日
-c.Now().AddHours(1).Constellation() // しし座
-c.Now().AddHours(1).Season() // 夏
-```
-
-###### 翻訳リソースの一部を書き換える(残りはまだ指定された `locale` ファイルの内容によって翻訳されます)
-
-```go
-lang := carbon.NewLanguage()
-
-resources := map[string]string {
- "hour": "%dh",
-}
-lang.SetLocale("en").SetResources(resources)
-
-c := carbon.SetLanguage(lang)
-if c.Error != nil {
- // エラー処理
- log.Fatal(c.Error)
-}
-
-c.Now().AddYears(1).DiffForHumans() // 1 year from now
-c.Now().AddHours(1).DiffForHumans() // 1h from now
-c.Now().ToMonthString() // August
-c.Now().ToShortMonthString() // Aug
-c.Now().ToWeekString() // Tuesday
-c.Now().ToShortWeekString() // Tue
-c.Now().Constellation() // Leo
-c.Now().Season() // Summer
-```
-
-###### すべての翻訳リソースを書き換える
-
-```go
-lang := carbon.NewLanguage()
-resources := map[string]string {
- "months": "january|february|march|april|may|june|july|august|september|october|november|december",
- "short_months": "jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec",
- "weeks": "sunday|monday|tuesday|wednesday|thursday|friday|saturday",
- "short_weeks": "sun|mon|tue|wed|thu|fri|sat",
- "seasons": "spring|summer|autumn|winter",
- "constellations": "aries|taurus|gemini|cancer|leo|virgo|libra|scorpio|sagittarius|capricornus|aquarius|pisce",
- "year": "1 yr|%d yrs",
- "month": "1 mo|%d mos",
- "week": "%dw",
- "day": "%dd",
- "hour": "%dh",
- "minute": "%dm",
- "second": "%ds",
- "now": "just now",
- "ago": "%s ago",
- "from_now": "in %s",
- "before": "%s before",
- "after": "%s after",
-}
-lang.SetResources(resources)
-
-c := carbon.SetLanguage(lang)
-c.Now().AddYears(1).DiffForHumans() // in 1 yr
-c.Now().AddHours(1).DiffForHumans() // in 1h
-c.Now().ToMonthString() // august
-c.Now().ToShortMonthString() // aug
-c.Now().ToWeekString() // tuesday
-c.Now().ToShortWeekString() // tue
-c.Now().Constellation() // leo
-c.Now().Season() // summer
-```
-
-##### テスト
-
-```go
-c := carbon.SetTimezone(carbon.UTC)
-
-c.Now().ToDateString() // 2023-12-27
-c.Now().IsSetTestNow() // false
-
-c.SetTestNow(carbon.Parse("2020-08-05"))
-c.Now().ToDateString() // 2020-08-05
-c.Now().IsSetTestNow() // true
-
-c.UnSetTestNow()
-c.Now().ToDateString() // 2023-12-27
-c.Now().IsSetTestNow() // false
-```
-
-##### エラー処理
-
-> 複数のエラーが発生した場合は最初のエラーだけを返します。前のエラーは削除された後に次のエラーに戻ります
-
-```go
-c := carbon.SetTimezone("xxx").Parse("2020-08-05")
-if c.Error != nil {
- // エラー処理...
- log.Fatal(c.Error)
-}
-// 出力
-invalid timezone "xxx", please see the file "$GOROOT/lib/time/zoneinfo.zip" for all valid timezones
-```
-
-#### 付録
-
-##### 書式設定記号表
-
-| 記号 | 説明 | 長さ | 範囲 | 例 |
-| :------------: | :------------: |:------:|:----------------:| :------------: |
-| d | 月の日(2桁でパディング) | 2 | 01-31 | 02 |
-| D | 略語の曜日 | 3 | Mon-Sun | Mon |
-| j | 月の日(パディングしない) | - | 1-31 | 2 |
-| S | 何日目の英語の略語の接尾語,普通はjと協力して使います | 2 | st/nd/rd/th | th |
-| l | 曜日 | - | Monday-Sunday | Monday |
-| F | 月 | - | January-December | January |
-| m | 月(2桁でパディング) | 2 | 01-12 | 01 |
-| M | 略語の月 | 3 | Jan-Dec | Jan |
-| n | 月(パディングしない) | - | 1-12 | 1 |
-| Y | 年 | 4 | 0000-9999 | 2006 |
-| y | 年(下2桁) | 2 | 00-99 | 06 |
-| a | 小文字の午前と午後 | 2 | am/pm | pm |
-| A | 大文字の午前と午後 | 2 | AM/PM | PM |
-| g | 時間, 12時間のフォーマット | - | 1-12 | 3 |
-| G | 時間, 24時間のフォーマット | - | 0-23 | 15 |
-| h | 時間, 12時間のフォーマット | 2 | 00-11 | 03 |
-| H | 時間, 24時間のフォーマット | 2 | 00-23 | 15 |
-| i | 分 | 2 | 01-59 | 04 |
-| s | 秒 | 2 | 01-59 | 05 |
-| O | グリニッジとの時間差の時間数 | - | - | -0700 |
-| P | グリニッジと時間の差の時間数, 時間と分の間にコロンあり | - | - | -07:00 |
-| T | タイムゾーンの略語 | - | - | MST |
-| W | ISO8601 フォーマットの数字は年の中の第何週(2桁でパディング) | 2 | 1-52 | 01 |
-| N | ISO8601 フォーマットの数字は曜日(2桁でパディング) | 2 | 01-07 | 02 |
-| L | うるう年かどうか, うるう年が1であれば, 0 | 1 | 0-1 | 0 |
-| U | 秒タイムスタンプ | - | - | 1596604455 |
-| V | ミリ秒のタイムスタンプ | - | - | 1596604455666 |
-| X | マイクロ秒タイムスタンプ | - | - | 1596604455666666 |
-| Z | ナノ秒タイムスタンプ | - | - | 1596604455666666666 |
-| v | ミリ秒 | - | 1-999 | 999 |
-| u | マイクロ秒| - | 1-999999 | 999999 |
-| x | ナノ秒 | - | 1-999999999 | 999999999 |
-| w | 数字表示の曜日 | 1 | 0-6 | 1 |
-| t | 月の総日数 | 2 | 28-31 | 31 |
-| z | 年間積算日 | - | 1-365 | 2 |
-| e | リージョン | - | - | America/New_York |
-| Q | 四半期 | 1 | 1-4 | 1 |
-| C | 世紀 | - | 0-99 | 21 |
-
-#### FAQ
-
-1、v1とv2のバージョンの違いは何ですか?
-> APIのv1バージョンとv2バージョンに違いはありませんが `language.go`
-> での翻訳リソースファイルの実装は異なります。v1は、サードパーティの拡張ライブラリ [packr](https://github.com/gobuffalo/packr) によって実装されています,v2は、 `golang1.16`
-> の後に組み込みの標準ライブラリ [embed](https://pkg.go.dev/embed) によって実装されています。goバージョンが1.16より大きい場合は、v2バージョンを使用することをお勧めします。それ以外の場合は、v1バージョンを使用する必要があります。
-
-#### 参考
+## リファレンス
* [briannesbitt/carbon](https://github.com/briannesbitt/Carbon)
* [nodatime/nodatime](https://github.com/nodatime/nodatime)
@@ -1546,17 +87,21 @@ invalid timezone "xxx", please see the file "$GOROOT/lib/time/zoneinfo.zip" for
* [moment/moment](https://github.com/moment/moment)
* [iamkun/dayjs](https://github.com/iamkun/dayjs)
-#### コントリビューター
+## コントリビューター
`Carbon` に貢献してくれた以下のすべてに感謝します:
-#### スポンサー
+## スポンサー
`Carbon` は非営利のオープンソースプロジェクトです,`Carbon` をサポートしたい場合は、開発者のために [コーヒーを1杯購入](https://opencollective.com/go-carbon) できます
-#### 謝辞
+## 謝辞
`Carbon` は無料の JetBrains オープンソースライセンスを取得しました,これに感謝します
+
+## オープンソースプロトコル
+
+`Carbon` は `MIT` オープンソースプロトコルに準拠しており、詳細は[LICENSE](./LICENSE)を参照してください
diff --git a/vendor/github.com/dromara/carbon/v2/README.md b/vendor/github.com/dromara/carbon/v2/README.md
index 8c717e3a..4b643f55 100644
--- a/vendor/github.com/dromara/carbon/v2/README.md
+++ b/vendor/github.com/dromara/carbon/v2/README.md
@@ -5,16 +5,16 @@
[](https://goreportcard.com/report/github.com/dromara/carbon/v2)
[](https://codecov.io/gh/dromara/carbon)
[](https://pkg.go.dev/github.com/dromara/carbon/v2)
+
[](https://github.com/dromara/carbon/blob/master/LICENSE)
English | [简体中文](README.cn.md) | [日本語](README.jp.md)
-#### Introduction
+## Introduction
-A simple, semantic and developer-friendly golang package for time, has been included
-by [awesome-go](https://github.com/avelino/awesome-go#date-and-time "awesome-go")
+A simple, semantic and developer-friendly time package for `golang`, `100%` unit test coverage, doesn't depend on `any` third-party package and has been included by [awesome-go](https://github.com/avelino/awesome-go#date-and-time "awesome-go") and [hello-github](https://hellogithub.com/en/repository/dromara/carbon "hello-github")
-#### Repository
+## Repository
[github.com/dromara/carbon](https://github.com/dromara/carbon "github.com/dromara/carbon")
@@ -22,9 +22,10 @@ by [awesome-go](https://github.com/avelino/awesome-go#date-and-time "awesome-go"
[gitcode.com/dromara/carbon](https://gitcode.com/dromara/carbon "gitcode.com/dromara/carbon")
-#### Installation
+## Quick Start
-##### go version >= 1.17
+### Installation
+> go version >= 1.21
```go
// By github
@@ -40,1500 +41,49 @@ go get -u gitcode.com/dromara/carbon/v2
import "gitee.com/dromara/gitcode/v2"
```
-`Carbon` was donated to the [dromara](https://dromara.org/ "dromara") organization, the repository url has changed. If the previous repository used was `golang-module/carbon`, please replace the original repository with the new repository in `go.mod`, or execute the following command
+`Carbon` was donated to the [dromara](https://dromara.org/ "dromara") organization, the repository URL has changed. If
+the previous repository used was `golang-module/carbon`, please replace the original repository with the new repository
+in `go.mod`, or execute the following command:
```go
-go mod edit -replace github.com/golang-module/carbon/v2=github.com/dromara/carbon/v2
+go mod edit -replace github.com/golang-module/carbon/v2 = github.com/dromara/carbon/v2
```
-#### Usage and example
-
-> Assuming the current time is 2020-08-05 13:14:15.999999999 +0800 CST
-
-##### Set globally default values
+### Example Usage
+Default timezone is `UTC`, language locale is `English`, start day of the week is `Monday` and weekend days of the week
+are `Saturday` and `Sunday`.
```go
-carbon.SetDefault(carbon.Default{
- Layout: carbon.DateTimeLayout,
- Timezone: carbon.UTC,
- WeekStartsAt: carbon.Sunday,
- Locale: "en", // value range: translate file name in the lang directory, excluding file suffix
-})
-```
-> Suggest setting in the entry file such as `main.go`
+carbon.SetTestNow(carbon.Parse("2020-08-05 13:14:15.999999999"))
+carbon.IsTestNow() // true
-##### Convert between `Carbon` and `time.Time`
+carbon.Now().ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
+carbon.Yesterday().ToString() // 2020-08-04 13:14:15.999999999 +0000 UTC
+carbon.Tomorrow().ToString() // 2020-08-06 13:14:15.999999999 +0000 UTC
-```go
-// Convert standard Time.time to Carbon
-carbon.CreateFromStdTime(time.Now())
-// Convert Carbon to standard Time.time
-carbon.Now().StdTime()
-```
+carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2022-03-08T03:01:14-07:00").ToString() // 2022-03-08 10:01:14 +0000 UTC
-##### Yesterday, today and tomorrow
+carbon.ParseByLayout("It is 2020-08-05 13:14:15", "It is 2006-01-02 15:04:05").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").ToString() // 2020-08-05 13:14:15 +0000 UTC
-```go
-// Return datetime of today
-fmt.Printf("%s", carbon.Now()) // 2020-08-05 13:14:15
-carbon.Now().String() // 2020-08-05 13:14:15
-carbon.Now().ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Now().ToDateTimeString() // 2020-08-05 13:14:15
-// Return date of today
-carbon.Now().ToDateString() // 2020-08-05
-// Return time of today
-carbon.Now().ToTimeString() // 13:14:15
-// Return datetime of today in a given timezone
-carbon.Now(Carbon.NewYork).ToDateTimeString() // 2020-08-05 14:14:15
-// Return timestamp with second of today
-carbon.Now().Timestamp() // 1596604455
-// Return timestamp with millisecond of today
-carbon.Now().TimestampMilli() // 1596604455999
-// Return timestamp with microsecond of today
-carbon.Now().TimestampMicro() // 1596604455999999
-// Return timestamp with nanosecond of today
-carbon.Now().TimestampNano() // 1596604455999999999
+carbon.CreateFromDate(2020, 8, 5).ToString() // 2020-08-05 00:00:00 +0000 UTC
+carbon.CreateFromTime(13, 14, 15).ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.CreateFromTimestamp(1596633255).ToString() // 2020-08-05 13:14:15 +0000 UTC
-// Return datetime of yesterday
-fmt.Printf("%s", carbon.Yesterday()) // 2020-08-04 13:14:15
-carbon.Yesterday().String() // 2020-08-04 13:14:15
-carbon.Yesterday().ToString() // 2020-08-04 13:14:15 +0800 CST
-carbon.Yesterday().ToDateTimeString() // 2020-08-04 13:14:15
-// Return date of yesterday
-carbon.Yesterday().ToDateString() // 2020-08-04
-// Return time of yesterday
-carbon.Yesterday().ToTimeString() // 13:14:15
-// Return datetime of yesterday on a given day
-carbon.Parse("2021-01-28 13:14:15").Yesterday().ToDateTimeString() // 2021-01-27 13:14:15
-// Return datetime of yesterday in a given timezone
-carbon.Yesterday(Carbon.NewYork).ToDateTimeString() // 2020-08-04 14:14:15
-// Return timestamp with second of yesterday
-carbon.Yesterday().Timestamp() // 1596518055
-// Return timestamp with millisecond of yesterday
-carbon.Yesterday().TimestampMilli() // 1596518055999
-// Return timestamp with microsecond of yesterday
-carbon.Yesterday().TimestampMicro() // 1596518055999999
-// Return timestamp with nanosecond of yesterday
-carbon.Yesterday().TimestampNano() // 1596518055999999999
-
-// Return datetime of tomorrow
-fmt.Printf("%s", carbon.Tomorrow()) // 2020-08-06 13:14:15
-carbon.Tomorrow().String() // 2020-08-06 13:14:15
-carbon.Tomorrow().ToString() // 2020-08-06 13:14:15 +0800 CST
-carbon.Tomorrow().ToDateTimeString() // 2020-08-06 13:14:15
-// Return date of tomorrow
-carbon.Tomorrow().ToDateString() // 2020-08-06
-// Return time of tomorrow
-carbon.Tomorrow().ToTimeString() // 13:14:15
-// Return datetime of tomorrow on a given day
-carbon.Parse("2021-01-28 13:14:15").Tomorrow().ToDateTimeString() // 2021-01-29 13:14:15
-// Return datetime of tomorrow in a given timezone
-carbon.Tomorrow(Carbon.NewYork).ToDateTimeString() // 2020-08-06 14:14:15
-// Return timestamp with second of tomorrow
-carbon.Tomorrow().Timestamp() // 1596690855
-// Return timestamp with millisecond of tomorrow
-carbon.Tomorrow().TimestampMilli() // 1596690855999
-// Return timestamp with microsecond of tomorrow
-carbon.Tomorrow().TimestampMicro() // 1596690855999999
-// Return timestamp with nanosecond of tomorrow
-carbon.Tomorrow().TimestampNano() // 1596690855999999999
-```
-
-##### Create a `Carbon` instance
-
-```go
-// Create a Carbon instance from a given timestamp with second
-carbon.CreateFromTimestamp(-1).ToString() // 1970-01-01 07:59:59 +0800 CST
-carbon.CreateFromTimestamp(0).ToString() // 1970-01-01 08:00:00 +0800 CST
-carbon.CreateFromTimestamp(1).ToString() // 1970-01-01 08:00:01 +0800 CST
-carbon.CreateFromTimestamp(1649735755).ToString() // 2022-04-12 11:55:55 +0800 CST
-// Create a Carbon instance from a given timestamp with millisecond
-carbon.CreateFromTimestampMilli(1649735755981).ToString() // 2022-04-12 11:55:55.981 +0800 CST
-// Create a Carbon instance from a given timestamp with microsecond
-carbon.CreateFromTimestampMicro(1649735755981566).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
-// Create a Carbon instance from a given timestamp with nanosecond
-carbon.CreateFromTimestampNano(1649735755981566000).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
-
-// Create a Carbon instance from a given date and time
-carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToString() // 2020-08-05 13:14:15 +0800 CST
-// Create a Carbon instance from a given date and time with millisecond
-carbon.CreateFromDateTimeMilli(2020, 8, 5, 13, 14, 15, 999).ToString() // 2020-08-05 13:14:15.999 +0800 CST
-// Create a Carbon instance from a given date and time with microsecond
-carbon.CreateFromDateTimeMicro(2020, 8, 5, 13, 14, 15, 999999).ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-// Create a Carbon instance from a given date and time with nanosecond
-carbon.CreateFromDateTimeNano(2020, 8, 5, 13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-
-// Create a Carbon instance from a given year, month and day
-carbon.CreateFromDate(2020, 8, 5).ToString() // 2020-08-05 00:00:00 +0800 CST
-// Create a Carbon instance from a given year, month and day with millisecond
-carbon.CreateFromDateMilli(2020, 8, 5, 999).ToString() // 2020-08-05 00:00:00.999 +0800 CST
-// Create a Carbon instance from a given year, month and day with microsecond
-carbon.CreateFromDateMicro(2020, 8, 5, 999999).ToString() // 2020-08-05 00:00:00.999999 +0800 CST
-// Create a Carbon instance from a given year, month and day with nanosecond
-carbon.CreateFromDateNano(2020, 8, 5, 999999999).ToString() // 2020-08-05 00:00:00.999999999 +0800 CST
-
-// Create a Carbon instance from a given hour, minute and second
-carbon.CreateFromTime(13, 14, 15).ToString() // 2020-08-05 13:14:15 +0800 CST
-// Create a Carbon instance from a given hour, minute and second with millisecond
-carbon.CreateFromTimeMilli(13, 14, 15, 999).ToString() // 2020-08-05 13:14:15.999 +0800 CST
-// Create a Carbon instance from a given hour, minute and second with microsecond
-carbon.CreateFromTimeMicro(13, 14, 15, 999999).ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-// Create a Carbon instance from a given hour, minute and second with nanosecond
-carbon.CreateFromTimeNano(13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-```
-
-##### Parse a time string as a `Carbon` instance
-
-```go
-carbon.Parse("").ToDateTimeString() // empty string
-carbon.Parse("0").ToDateTimeString() // empty string
-carbon.Parse("00:00:00").ToDateTimeString() // empty string
-carbon.Parse("0000-00-00").ToDateTimeString() // empty string
-carbon.Parse("0000-00-00 00:00:00").ToDateTimeString() // empty string
-
-carbon.Parse("now").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("yesterday").ToString() // 2020-08-04 13:14:15 +0800 CST
-carbon.Parse("tomorrow").ToString() // 2020-08-06 13:14:15 +0800 CST
-
-carbon.Parse("2020").ToString() // 2020-01-01 00:00:00 +0800 CST
-carbon.Parse("2020-8").ToString() // 2020-08-01 00:00:00 +0800 CST
-carbon.Parse("2020-08").ToString() // 2020-08-01 00:00:00 +0800 CST
-carbon.Parse("2020-8-5").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("2020-8-05").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("2020-08-05").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("2020-08-05.999").ToString() // 2020-08-05 00:00:00.999 +0800 CST
-carbon.Parse("2020-08-05.999999").ToString() // 2020-08-05 00:00:00.999999 +0800 CST
-carbon.Parse("2020-08-05.999999999").ToString() // 2020-08-05 00:00:00.999999999 +0800 CST
-
-carbon.Parse("2020-8-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-8-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05 13:14:15.999").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("2020-08-05 13:14:15.999999").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("2020-08-05 13:14:15.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-
-carbon.Parse("2020-8-5T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-8-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("2020-08-05T13:14:15.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("2020-08-05T13:14:15.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-
-carbon.Parse("20200805").ToString() // 2020-08-05 00:00:00 +0800 CST
-carbon.Parse("20200805131415").ToString() // 2020-08-05 13:14:15 +0800 CST
-carbon.Parse("20200805131415.999").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("20200805131415.999999").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("20200805131415.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-carbon.Parse("20200805131415.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0800 CST
-carbon.Parse("20200805131415.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-carbon.Parse("20200805131415.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-```
-
-##### Parse a time string as a `Carbon` instance by format
-
-```go
-carbon.ParseByFormat("2020|08|05 13|14|15", "Y|m|d H|i|s").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByFormat("今天是 2020年08月05日13时14分15秒", "今天是 Y年m月d日H时i分s秒").ToDateTimeString() // 2020-08-05 13:14:15
-```
-
-##### Parse a time string as a `Carbon` instance by layout
-
-```go
-carbon.ParseByLayout("2020|08|05 13|14|15", "2006|01|02 15|04|05").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByLayout("It is 2020-08-05 13:14:15", "It is 2006-01-02 15:04:05").ToDateTimeString() // 2020-08-05 13:14:15
-carbon.ParseByLayout("今天是 2020年08月05日13时14分15秒", "今天是 2006年01月02日15时04分05秒").ToDateTimeString() // 2020-08-05 13:14:15
-```
-
-##### Boundary
-
-```go
-// Start of the century
-carbon.Parse("2020-08-05 13:14:15").StartOfCentury().ToDateTimeString() // 2000-01-01 00:00:00
-// End of the century
-carbon.Parse("2020-08-05 13:14:15").EndOfCentury().ToDateTimeString() // 2999-12-31 23:59:59
-
-// Start of the decade
-carbon.Parse("2020-08-05 13:14:15").StartOfDecade().ToDateTimeString() // 2020-01-01 00:00:00
-carbon.Parse("2021-08-05 13:14:15").StartOfDecade().ToDateTimeString() // 2020-01-01 00:00:00
-carbon.Parse("2029-08-05 13:14:15").StartOfDecade().ToDateTimeString() // 2020-01-01 00:00:00
-// End of the decade
-carbon.Parse("2020-08-05 13:14:15").EndOfDecade().ToDateTimeString() // 2029-12-31 23:59:59
-carbon.Parse("2021-08-05 13:14:15").EndOfDecade().ToDateTimeString() // 2029-12-31 23:59:59
-carbon.Parse("2029-08-05 13:14:15").EndOfDecade().ToDateTimeString() // 2029-12-31 23:59:59
-
-// Start of the year
-carbon.Parse("2020-08-05 13:14:15").StartOfYear().ToDateTimeString() // 2020-01-01 00:00:00
-// End of the year
-carbon.Parse("2020-08-05 13:14:15").EndOfYear().ToDateTimeString() // 2020-12-31 23:59:59
-
-// Start of the quarter
-carbon.Parse("2020-08-05 13:14:15").StartOfQuarter().ToDateTimeString() // 2020-07-01 00:00:00
-// End of the quarter
-carbon.Parse("2020-08-05 13:14:15").EndOfQuarter().ToDateTimeString() // 2020-09-30 23:59:59
-
-// Start of the month
-carbon.Parse("2020-08-05 13:14:15").StartOfMonth().ToDateTimeString() // 2020-08-01 00:00:00
-// End of the month
-carbon.Parse("2020-08-05 13:14:15").EndOfMonth().ToDateTimeString() // 2020-08-31 23:59:59
-
-// Start of the week
-carbon.Parse("2020-08-05 13:14:15").StartOfWeek().ToDateTimeString() // 2020-08-02 00:00:00
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Sunday).StartOfWeek().ToDateTimeString() // 2020-08-02 00:00:00
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Monday).StartOfWeek().ToDateTimeString() // 2020-08-03 00:00:00
-// End of the week
-carbon.Parse("2020-08-05 13:14:15").EndOfWeek().ToDateTimeString() // 2020-08-08 23:59:59
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Sunday).EndOfWeek().ToDateTimeString() // 2020-08-08 23:59:59
-carbon.Parse("2020-08-05 13:14:15").SetWeekStartsAt(carbon.Monday).EndOfWeek().ToDateTimeString() // 2020-08-09 23:59:59
-
-// Start of the day
-carbon.Parse("2020-08-05 13:14:15").StartOfDay().ToDateTimeString() // 2020-08-05 00:00:00
-// End of the day
-carbon.Parse("2020-08-05 13:14:15").EndOfDay().ToDateTimeString() // 2020-08-05 23:59:59
-
-// Start of the hour
-carbon.Parse("2020-08-05 13:14:15").StartOfHour().ToDateTimeString() // 2020-08-05 13:00:00
-// End of the hour
-carbon.Parse("2020-08-05 13:14:15").EndOfHour().ToDateTimeString() // 2020-08-05 13:59:59
-
-// Start of the minute
-carbon.Parse("2020-08-05 13:14:15").StartOfMinute().ToDateTimeString() // 2020-08-05 13:14:00
-// End of the minute
-carbon.Parse("2020-08-05 13:14:15").EndOfMinute().ToDateTimeString() // 2020-08-05 13:14:59
-
-// Start of the second
-carbon.Parse("2020-08-05 13:14:15").StartOfSecond().ToString() // 2020-08-05 13:14:15 +0800 CST
-// End of the second
-carbon.Parse("2020-08-05 13:14:15").EndOfSecond().ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
-```
-
-##### Traveler
-
-```go
-// Add three centuries
-carbon.Parse("2020-02-29 13:14:15").AddCenturies(3).ToDateTimeString() // 2320-02-29 13:14:15
-// Add three centuries without overflowing month
-carbon.Parse("2020-02-29 13:14:15").AddCenturiesNoOverflow(3).ToDateTimeString() // 2320-02-29 13:14:15
-// Add one century
-carbon.Parse("2020-02-29 13:14:15").AddCentury().ToDateTimeString() // 2120-02-29 13:14:15
-// Add one century without overflowing month
-carbon.Parse("2020-02-29 13:14:15").AddCenturyNoOverflow().ToDateTimeString() // 2120-02-29 13:14:15
-// Subtract three centuries
-carbon.Parse("2020-02-29 13:14:15").SubCenturies(3).ToDateTimeString() // 1720-02-29 13:14:15
-// Subtract three centuries without overflowing month
-carbon.Parse("2020-02-29 13:14:15").SubCenturiesNoOverflow(3).ToDateTimeString() // 1720-02-29 13:14:15
-// Subtract one century
-carbon.Parse("2020-02-29 13:14:15").SubCentury().ToDateTimeString() // 1920-02-29 13:14:15
-// Subtract one century without overflowing month
-carbon.Parse("2020-02-29 13:14:15").SubCenturyNoOverflow().ToDateTimeString() // 1920-02-20 13:14:15
-
-// Add three decades
-carbon.Parse("2020-02-29 13:14:15").AddDecades(3).ToDateTimeString() // 2050-03-01 13:14:15
-// Add three decades without overflowing month
-carbon.Parse("2020-02-29 13:14:15").AddDecadesNoOverflow(3).ToDateTimeString() // 2050-02-28 13:14:15
-// Add one decade
-carbon.Parse("2020-02-29 13:14:15").AddDecade().ToDateTimeString() // 2030-03-01 13:14:15
-// Add one decade without overflowing month
-carbon.Parse("2020-02-29 13:14:15").AddDecadeNoOverflow().ToDateTimeString() // 2030-02-28 13:14:15
-// Subtract three decades
-carbon.Parse("2020-02-29 13:14:15").SubDecades(3).ToDateTimeString() // 1990-03-01 13:14:15
-// Subtract three decades without overflowing month
-carbon.Parse("2020-02-29 13:14:15").SubDecadesNoOverflow(3).ToDateTimeString() // 1990-02-28 13:14:15
-// Subtract one decade
-carbon.Parse("2020-02-29 13:14:15").SubDecade().ToDateTimeString() // 2010-03-01 13:14:15
-// Subtract one decade without overflowing month
-carbon.Parse("2020-02-29 13:14:15").SubDecadeNoOverflow().ToDateTimeString() // 2010-02-28 13:14:15
-
-// Add three years
-carbon.Parse("2020-02-29 13:14:15").AddYears(3).ToDateTimeString() // 2023-03-01 13:14:15
-// Add three years without overflowing month
-carbon.Parse("2020-02-29 13:14:15").AddYearsNoOverflow(3).ToDateTimeString() // 2023-02-28 13:14:15
-// Add one year
-carbon.Parse("2020-02-29 13:14:15").AddYear().ToDateTimeString() // 2021-03-01 13:14:15
-// Add one year without overflowing month
-carbon.Parse("2020-02-29 13:14:15").AddYearNoOverflow().ToDateTimeString() // 2021-02-28 13:14:15
-// Subtract three years
-carbon.Parse("2020-02-29 13:14:15").SubYears(3).ToDateTimeString() // 2017-03-01 13:14:15
-// Subtract three years without overflowing month
-carbon.Parse("2020-02-29 13:14:15").SubYearsNoOverflow(3).ToDateTimeString() // 2017-02-28 13:14:15
-// Subtract one year
-carbon.Parse("2020-02-29 13:14:15").SubYear().ToDateTimeString() // 2019-03-01 13:14:15
-// Subtract one year without overflowing month
-carbon.Parse("2020-02-29 13:14:15").SubYearNoOverflow().ToDateTimeString() // 2019-02-28 13:14:15
-
-// Add three quarters
-carbon.Parse("2019-05-31 13:14:15").AddQuarters(3).ToDateTimeString() // 2020-03-02 13:14:15
-// Add three quarters without overflowing month
-carbon.Parse("2019-05-31 13:14:15").AddQuartersNoOverflow(3).ToDateTimeString() // 2020-02-29 13:14:15
-// Add one quarter
-carbon.Parse("2019-11-30 13:14:15").AddQuarter().ToDateTimeString() // 2020-03-01 13:14:15
-// Add one quarter without overflowing month
-carbon.Parse("2019-11-30 13:14:15").AddQuarterNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-// Subtract three quarters
-carbon.Parse("2019-08-31 13:14:15").SubQuarters(3).ToDateTimeString() // 2019-03-03 13:14:15
-// Subtract three quarters without overflowing month
-carbon.Parse("2019-08-31 13:14:15").SubQuartersNoOverflow(3).ToDateTimeString() // 2019-02-28 13:14:15
-// Subtract one quarter
-carbon.Parse("2020-05-31 13:14:15").SubQuarter().ToDateTimeString() // 2020-03-02 13:14:15
-// Subtract one quarter without overflowing month
-carbon.Parse("2020-05-31 13:14:15").SubQuarterNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-
-// Add three months
-carbon.Parse("2020-02-29 13:14:15").AddMonths(3).ToDateTimeString() // 2020-05-29 13:14:15
-// Add three months without overflowing month
-carbon.Parse("2020-02-29 13:14:15").AddMonthsNoOverflow(3).ToDateTimeString() // 2020-05-29 13:14:15
-// Add one month
-carbon.Parse("2020-01-31 13:14:15").AddMonth().ToDateTimeString() // 2020-03-02 13:14:15
-// Add one month without overflowing month
-carbon.Parse("2020-01-31 13:14:15").AddMonthNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-// Subtract three months
-carbon.Parse("2020-02-29 13:14:15").SubMonths(3).ToDateTimeString() // 2019-11-29 13:14:15
-// Subtract three months without overflowing month
-carbon.Parse("2020-02-29 13:14:15").SubMonthsNoOverflow(3).ToDateTimeString() // 2019-11-29 13:14:15
-// Subtract one month
-carbon.Parse("2020-03-31 13:14:15").SubMonth().ToDateTimeString() // 2020-03-02 13:14:15
-// Subtract one month without overflowing month
-carbon.Parse("2020-03-31 13:14:15").SubMonthNoOverflow().ToDateTimeString() // 2020-02-29 13:14:15
-
-// Add three weeks
-carbon.Parse("2020-02-29 13:14:15").AddWeeks(3).ToDateTimeString() // 2020-03-21 13:14:15
-// Add one week
-carbon.Parse("2020-02-29 13:14:15").AddWeek().ToDateTimeString() // 2020-03-07 13:14:15
-// Subtract three weeks
-carbon.Parse("2020-02-29 13:14:15").SubWeeks(3).ToDateTimeString() // 2020-02-08 13:14:15
-// Subtract three week
-carbon.Parse("2020-02-29 13:14:15").SubWeek().ToDateTimeString() // 2020-02-22 13:14:15
-
-// Add three days
-carbon.Parse("2020-08-05 13:14:15").AddDays(3).ToDateTimeString() // 2020-08-08 13:14:15
-// Add one day
-carbon.Parse("2020-08-05 13:14:15").AddDay().ToDateTimeString() // 2020-08-05 13:14:15
-// Subtract three days
-carbon.Parse("2020-08-05 13:14:15").SubDays(3).ToDateTimeString() // 2020-08-02 13:14:15
-// Subtract one day
-carbon.Parse("2020-08-05 13:14:15").SubDay().ToDateTimeString() // 2020-08-04 13:14:15
-
-// Add three hours
-carbon.Parse("2020-08-05 13:14:15").AddHours(3).ToDateTimeString() // 2020-08-05 16:14:15
-// Add two and a half hours
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5h").ToDateTimeString() // 2020-08-05 15:44:15
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2h30m").ToDateTimeString() // 2020-08-05 15:44:15
-// Add one hour
-carbon.Parse("2020-08-05 13:14:15").AddHour().ToDateTimeString() // 2020-08-05 14:14:15
-// Subtract three hours
-carbon.Parse("2020-08-05 13:14:15").SubHours(3).ToDateTimeString() // 2020-08-05 10:14:15
-// Subtract two and a half hours
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5h").ToDateTimeString() // 2020-08-05 10:44:15
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2h30m").ToDateTimeString() // 2020-08-05 10:44:15
-// Subtract one hour
-carbon.Parse("2020-08-05 13:14:15").SubHour().ToDateTimeString() // 2020-08-05 12:14:15
-
-// Add three minutes
-carbon.Parse("2020-08-05 13:14:15").AddMinutes(3).ToDateTimeString() // 2020-08-05 13:17:15
-// Add two and a half minutes
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5m").ToDateTimeString() // 2020-08-05 13:16:45
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2m30s").ToDateTimeString() // 2020-08-05 13:16:45
-// Add one minute
-carbon.Parse("2020-08-05 13:14:15").AddMinute().ToDateTimeString() // 2020-08-05 13:15:15
-// Subtract three minutes
-carbon.Parse("2020-08-05 13:14:15").SubMinutes(3).ToDateTimeString() // 2020-08-05 13:11:15
-// Subtract two and a half minutes
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5m").ToDateTimeString() // 2020-08-05 13:11:45
-// Subtract one minute
-carbon.Parse("2020-08-05 13:14:15").SubMinute().ToDateTimeString() // 2020-08-05 13:13:15
-
-// Add three seconds
-carbon.Parse("2020-08-05 13:14:15").AddSeconds(3).ToDateTimeString() // 2020-08-05 13:14:18
-// Add two and a half seconds
-carbon.Parse("2020-08-05 13:14:15").AddDuration("2.5s").ToDateTimeString() // 2020-08-05 13:14:17
-// Add one second
-carbon.Parse("2020-08-05 13:14:15").AddSecond().ToDateTimeString() // 2020-08-05 13:14:16
-// Subtract three seconds
-carbon.Parse("2020-08-05 13:14:15").SubSeconds(3).ToDateTimeString() // 2020-08-05 13:14:12
-// Subtract two and a half seconds
-carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5s").ToDateTimeString() // 2020-08-05 13:14:12
-// Subtract one second
-carbon.Parse("2020-08-05 13:14:15").SubSecond().ToDateTimeString() // 2020-08-05 13:14:14
-
-// Add three milliseconds
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMilliseconds(3).ToString() // 2020-08-05 13:14:15.225222222 +0800 CST
-// Add one millisecond
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMillisecond().ToString() // 2020-08-05 13:14:15.223222222 +0800 CST
-// Subtract three milliseconds
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMilliseconds(3).ToString() // 2020-08-05 13:14:15.219222222 +0800 CST
-// Subtract one millisecond
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMillisecond().ToString() // 2020-08-05 13:14:15.221222222 +0800 CST
-
-// Add three microseconds
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMicroseconds(3).ToString() // 2020-08-05 13:14:15.222225222 +0800 CST
-// Add one microsecond
-carbon.Parse("2020-08-05 13:14:15.222222222").AddMicrosecond().ToString() // 2020-08-05 13:14:15.222223222 +0800 CST
-// Subtract three microseconds
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMicroseconds(3).ToString() // 2020-08-05 13:14:15.222219222 +0800 CST
-// Subtract one microsecond
-carbon.Parse("2020-08-05 13:14:15.222222222").SubMicrosecond().ToString() // 2020-08-05 13:14:15.222221222 +0800 CST
-
-// Add three nanoseconds
-carbon.Parse("2020-08-05 13:14:15.222222222").AddNanoseconds(3).ToString() // 2020-08-05 13:14:15.222222225 +0800 CST
-// Add one nanosecond
-carbon.Parse("2020-08-05 13:14:15.222222222").AddNanossecond().ToString() // 2020-08-05 13:14:15.222222223 +0800 CST
-// Subtract three nanoseconds
-carbon.Parse("2020-08-05 13:14:15.222222222").SubNanosseconds(3).ToString() // 2020-08-05 13:14:15.222222219 +0800 CST
-// Subtract one nanosecond
-carbon.Parse("2020-08-05 13:14:15.222222222").SubNanossecond().ToString() // 2020-08-05 13:14:15.222222221 +0800 CST
-```
-
-##### Difference
-
-```go
-// Difference in years
-carbon.Parse("2021-08-05 13:14:15").DiffInYears(carbon.Parse("2020-08-05 13:14:15")) // -1
-// Difference in years with absolute value
-carbon.Parse("2021-08-05 13:14:15").DiffAbsInYears(carbon.Parse("2020-08-05 13:14:15")) // 1
-
-// Difference in months
-carbon.Parse("2020-08-05 13:14:15").DiffInMonths(carbon.Parse("2020-07-05 13:14:15")) // -1
-// Difference in months with absolute value
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInMonths(carbon.Parse("2020-07-05 13:14:15")) // 1
-
-// Difference in weeks
-carbon.Parse("2020-08-05 13:14:15").DiffInWeeks(carbon.Parse("2020-07-28 13:14:15")) // -1
-// Difference in weeks with absolute value
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInWeeks(carbon.Parse("2020-07-28 13:14:15")) // 1
-
-// Difference in days
-carbon.Parse("2020-08-05 13:14:15").DiffInDays(carbon.Parse("2020-08-04 13:14:15")) // -1
-// Difference in days with absolute value
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInDays(carbon.Parse("2020-08-04 13:14:15")) // 1
-
-// Difference in hours
-carbon.Parse("2020-08-05 13:14:15").DiffInHours(carbon.Parse("2020-08-05 12:14:15")) // -1
-// Difference in hours with absolute value
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInHours(carbon.Parse("2020-08-05 12:14:15")) // 1
-
-// Difference in minutes
-carbon.Parse("2020-08-05 13:14:15").DiffInMinutes(carbon.Parse("2020-08-05 13:13:15")) // -1
-// Difference in minutes with absolute value
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInMinutes(carbon.Parse("2020-08-05 13:13:15")) // 1
-
-// Difference in seconds
-carbon.Parse("2020-08-05 13:14:15").DiffInSeconds(carbon.Parse("2020-08-05 13:14:14")) // -1
-// Difference in seconds with absolute value
-carbon.Parse("2020-08-05 13:14:15").DiffAbsInSeconds(carbon.Parse("2020-08-05 13:14:14")) // 1
-
-// Difference in string
-carbon.Now().DiffInString() // just now
-carbon.Now().AddYearsNoOverflow(1).DiffInString() // -1 year
-carbon.Now().SubYearsNoOverflow(1).DiffInString() // 1 year
-// Difference in string with absolute value
-carbon.Now().DiffAbsInString(carbon.Now()) // just now
-carbon.Now().AddYearsNoOverflow(1).DiffAbsInString(carbon.Now()) // 1 year
-carbon.Now().SubYearsNoOverflow(1).DiffAbsInString(carbon.Now()) // 1 year
-
-// Difference in duration
-now := carbon.Now()
-now.DiffInDuration(now).String() // 0s
-now.AddHour().DiffInDuration(now).String() // 1h0m0s
-now.SubHour().DiffInDuration(now).String() // -1h0m0s
-// Difference in duration with absolute value
-now.DiffAbsInDuration(now).String() // 0s
-now.AddHour().DiffAbsInDuration(now).String() // 1h0m0s
-now.SubHour().DiffAbsInDuration(now).String() // 1h0m0s
-
-// Difference in a human-readable format
-carbon.Parse("2020-08-05 13:14:15").DiffForHumans() // just now
-carbon.Parse("2019-08-05 13:14:15").DiffForHumans() // 1 year ago
-carbon.Parse("2018-08-05 13:14:15").DiffForHumans() // 2 years ago
-carbon.Parse("2021-08-05 13:14:15").DiffForHumans() // 1 year from now
-carbon.Parse("2022-08-05 13:14:15").DiffForHumans() // 2 years from now
-// Difference in a human-readable format from now time
-carbon.Parse("2020-08-05 13:14:15").DiffForHumans(carbon.Now()) // 1 year before
-carbon.Parse("2019-08-05 13:14:15").DiffForHumans(carbon.Now()) // 2 years before
-carbon.Parse("2018-08-05 13:14:15").DiffForHumans(carbon.Now()) // 1 year after
-carbon.Parse("2022-08-05 13:14:15").DiffForHumans(carbon.Now()) // 2 years after
-```
-
-##### Extremum
-
-```go
-c0 := carbon.Parse("2023-04-01")
-c1 := carbon.Parse("2023-03-28")
-c2 := carbon.Parse("2023-04-16")
-// Return the closest Carbon instance
-c0.Closest(c1, c2) // c1
-// Return the farthest Carbon instance
-c0.Farthest(c1, c2) // c2
-
-yesterday := carbon.Yesterday()
-today := carbon.Now()
-tomorrow := carbon.Tomorrow()
-// Return the maximum Carbon instance
-carbon.Max(yesterday, today, tomorrow) // tomorrow
-// Return the minimum Carbon instance
-carbon.Min(yesterday, today, tomorrow) // yesterday
-
-// Return a Carbon instance for the greatest supported date
-carbon.MaxValue().ToString() // 9999-12-31 23:59:59.999999999 +0000 UTC
-// Return a Carbon instance for the lowest supported date
-carbon.MinValue().ToString() // -9998-01-01 00:00:00 +0000 UTC
-```
-
-##### Comparison
-
-```go
-// Whether is daylight saving time
-carbon.Parse("").IsDST() // false
-carbon.Parse("0").IsDST() // false
-carbon.Parse("0000-00-00 00:00:00").IsDST() // false
-carbon.Parse("0000-00-00").IsDST() // false
-carbon.Parse("00:00:00").IsDST() // false
-carbon.Parse("2023-01-01", "Australia/Brisbane").IsDST() // false
-carbon.Parse("2023-01-01", "Australia/Sydney").IsDST() // true
-
-// Whether is zero time(0001-01-01 00:00:00 +0000 UTC)
-carbon.Parse("").IsZero() // true
-carbon.Parse("0").IsZero() // true
-carbon.Parse("0000-00-00 00:00:00").IsZero() // true
-carbon.Parse("0000-00-00").IsZero() // true
-carbon.Parse("00:00:00").IsZero() // true
-carbon.Parse("2020-08-05 00:00:00").IsZero() // false
-carbon.Parse("2020-08-05").IsZero() // false
-carbon.Parse("2020-08-05").SetTimezone("xxx").IsZero() // false
-
-// Whether is valid time
-carbon.Parse("").IsValid() // false
-carbon.Parse("0").IsValid() // false
-carbon.Parse("0000-00-00 00:00:00").IsValid() // false
-carbon.Parse("0000-00-00").IsValid() // false
-carbon.Parse("00:00:00").IsValid() // false
-carbon.Parse("2020-08-05 00:00:00").IsValid() // true
-carbon.Parse("2020-08-05").IsValid() // true
-carbon.Parse("2020-08-05").SetTimezone("xxx").IsValid() // false
-
-// Whether is invalid time
-carbon.Parse("").IsInvalid() // true
-carbon.Parse("0").IsInvalid() // true
-carbon.Parse("0000-00-00 00:00:00").IsInvalid() // true
-carbon.Parse("0000-00-00").IsInvalid() // true
-carbon.Parse("00:00:00").IsInvalid() // true
-carbon.Parse("2020-08-05 00:00:00").IsInvalid() // false
-carbon.Parse("2020-08-05").IsInvalid() // false
-carbon.Parse("2020-08-05").SetTimezone("xxx").IsInvalid() // true
-
-// Whether is before noon
-carbon.Parse("2020-08-05 00:00:00").IsAM() // true
-carbon.Parse("2020-08-05 08:00:00").IsAM() // true
-carbon.Parse("2020-08-05 12:00:00").IsAM() // false
-carbon.Parse("2020-08-05 13:00:00").IsAM() // false
-// Whether is after noon
-carbon.Parse("2020-08-05 00:00:00").IsPM() // false
-carbon.Parse("2020-08-05 08:00:00").IsPM() // false
-carbon.Parse("2020-08-05 12:00:00").IsPM() // true
-carbon.Parse("2020-08-05 13:00:00").IsPM() // true
-
-// Whether is now time
-carbon.Now().IsNow() // true
-// Whether is future time
-carbon.Tomorrow().IsFuture() // true
-// Whether is pass time
-carbon.Yesterday().IsPast() // true
-
-// Whether is a leap year
-carbon.Parse("2020-08-05 13:14:15").IsLeapYear() // true
-// Whether is a long year
-carbon.Parse("2020-08-05 13:14:15").IsLongYear() // true
-
-// Whether is January
-carbon.Parse("2020-08-05 13:14:15").IsJanuary() // false
-// Whether is February
-carbon.Parse("2020-08-05 13:14:15").IsFebruary() // false
-// Whether is March
-carbon.Parse("2020-08-05 13:14:15").IsMarch() // false
-// Whether is April
-carbon.Parse("2020-08-05 13:14:15").IsApril() // false
-// Whether is May
-carbon.Parse("2020-08-05 13:14:15").IsMay() // false
-// Whether is June
-carbon.Parse("2020-08-05 13:14:15").IsJune() // false
-// Whether is July
-carbon.Parse("2020-08-05 13:14:15").IsJuly() // false
-// Whether is August
-carbon.Parse("2020-08-05 13:14:15").IsAugust() // false
-// Whether is September
-carbon.Parse("2020-08-05 13:14:15").IsSeptember() // true
-// Whether is October
-carbon.Parse("2020-08-05 13:14:15").IsOctober() // false
-// Whether is November
-carbon.Parse("2020-08-05 13:14:15").IsNovember() // false
-// Whether is December
-carbon.Parse("2020-08-05 13:14:15").IsDecember() // false
-
-// Whether is Monday
-carbon.Parse("2020-08-05 13:14:15").IsMonday() // false
-// Whether is Tuesday
-carbon.Parse("2020-08-05 13:14:15").IsTuesday() // true
-// Whether is Wednesday
-carbon.Parse("2020-08-05 13:14:15").IsWednesday() // false
-// Whether is Thursday
-carbon.Parse("2020-08-05 13:14:15").IsThursday() // false
-// Whether is Friday
-carbon.Parse("2020-08-05 13:14:15").IsFriday() // false
-// Whether is Saturday
-carbon.Parse("2020-08-05 13:14:15").IsSaturday() // false
-// Whether is Sunday
-carbon.Parse("2020-08-05 13:14:15").IsSunday() // false
-// Whether is weekday
-carbon.Parse("2020-08-05 13:14:15").IsWeekday() // false
-// Whether is weekend
-carbon.Parse("2020-08-05 13:14:15").IsWeekend() // true
-
-// Whether is yesterday
-carbon.Parse("2020-08-04 13:14:15").IsYesterday() // true
-carbon.Parse("2020-08-04 00:00:00").IsYesterday() // true
-carbon.Parse("2020-08-04").IsYesterday() // true
-// Whether is today
-carbon.Parse("2020-08-05 13:14:15").IsToday() // true
-carbon.Parse("2020-08-05 00:00:00").IsToday() // true
-carbon.Parse("2020-08-05").IsToday() // true
-// Whether is tomorrow
-carbon.Parse("2020-08-06 13:14:15").IsTomorrow() // true
-carbon.Parse("2020-08-06 00:00:00").IsTomorrow() // true
-carbon.Parse("2020-08-06").IsTomorrow() // true
-
-// Whether is same century
-carbon.Parse("2020-08-05 13:14:15").IsSameCentury(carbon.Parse("3020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").IsSameCentury(carbon.Parse("2099-08-05 13:14:15")) // true
-// Whether is same decade
-carbon.Parse("2020-08-05 13:14:15").IsSameDecade(carbon.Parse("2030-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").IsSameDecade(carbon.Parse("2120-08-05 13:14:15")) // true
-// Whether is same year
-carbon.Parse("2020-08-05 00:00:00").IsSameYear(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-01-01 00:00:00").IsSameYear(carbon.Parse("2020-12-31 13:14:15")) // true
-// Whether is same quarter
-carbon.Parse("2020-08-05 00:00:00").IsSameQuarter(carbon.Parse("2020-09-05 13:14:15")) // false
-carbon.Parse("2020-01-01 00:00:00").IsSameQuarter(carbon.Parse("2021-01-31 13:14:15")) // true
-// Whether is same month
-carbon.Parse("2020-01-01 00:00:00").IsSameMonth(carbon.Parse("2021-01-31 13:14:15")) // false
-carbon.Parse("2020-01-01 00:00:00").IsSameMonth(carbon.Parse("2020-01-31 13:14:15")) // true
-// Whether is same day
-carbon.Parse("2020-08-05 13:14:15").IsSameDay(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 00:00:00").IsSameDay(carbon.Parse("2020-08-05 13:14:15")) // true
-// Whether is same hour
-carbon.Parse("2020-08-05 13:14:15").IsSameHour(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:00:00").IsSameHour(carbon.Parse("2020-08-05 13:14:15")) // true
-// Whether is same minute
-carbon.Parse("2020-08-05 13:14:15").IsSameMinute(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:00").IsSameMinute(carbon.Parse("2020-08-05 13:14:15")) // true
-// Whether is same second
-carbon.Parse("2020-08-05 13:14:15").IsSameSecond(carbon.Parse("2021-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").IsSameSecond(carbon.Parse("2020-08-05 13:14:15")) // true
-
-// Whether greater than
-carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-05 13:14:15")) // false
-
-// Whether less than
-carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-05 13:14:15")) // false
-
-// Whether equal
-carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:00")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:00")) // false
-
-// Whether not equal
-carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-05 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Compare("!=", carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<>", carbon.Parse("2020-08-05 13:14:15")) // false
-
-// Whether greater than or equal
-carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-04 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-05 13:14:15")) // true
-
-// Whether less than or equal
-carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<=", carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").Compare("<=", carbon.Parse("2020-08-05 13:14:15")) // true
-
-// Whether between two Carbon instances, excluded the start and end Carbon instance
-carbon.Parse("2020-08-05 13:14:15").Between(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // false
-carbon.Parse("2020-08-05 13:14:15").Between(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-
-// Whether between two Carbon instances, included the start Carbon instance
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedStart(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedStart(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-
-// Whether between two Carbon instances, included the end Carbon instance
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedEnd(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-05 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedEnd(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-
-// Whether between two Carbon instances, included the start and end Carbon instance
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-05 13:14:15"), carbon.Parse("2020-08-06 13:14:15")) // true
-carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-04 13:14:15"), carbon.Parse("2020-08-05 13:14:15")) // true
-```
-
-> For the definition of long year, please see https://en.wikipedia.org/wiki/ISO_8601#Week_dates
-
-##### Setter
-
-```go
-// Set timezone
-carbon.SetTimezone(carbon.PRC).Now().ToDateTimeString() // 2020-08-05 13:14:15
-carbon.SetTimezone(carbon.Tokyo).Now().ToDateTimeString() // 2020-08-05 14:14:15
-carbon.SetTimezone(carbon.Tokyo).Now().SetTimezone(carbon.PRC).ToDateTimeString() // 2020-08-05 12:14:15
-
-// Set location
-utc, _ := time.LoadLocation(carbon.UTC)
-carbon.SetLocation(utc).Now().ToDateTimeString() // 2022-06-28 09:25:38
-tokyo, _ := time.LoadLocation(carbon.Tokyo)
-carbon.SetLocation(tokyo).Now().ToDateTimeString() // 2022-06-28 18:25:38
-
-// Set locale
-carbon.Parse("2020-07-05 13:14:15").SetLocale("en").DiffForHumans() // 1 month before
+carbon.Parse("2020-07-05 13:14:15").DiffForHumans() // 1 month before
carbon.Parse("2020-07-05 13:14:15").SetLocale("zh-CN").DiffForHumans() // 1 月前
-// Set year, month, day, hour, minute and second
-carbon.Parse("2020-01-01").SetDateTime(2019, 2, 2, 13, 14, 15).ToString() // 2019-02-02 13:14:15 +0800 CST
-carbon.Parse("2020-01-01").SetDateTime(2019, 2, 31, 13, 14, 15).ToString() // 2019-03-03 13:14:15 +0800 CST
-// Set year, month, day, hour, minute, second and millisecond
-carbon.Parse("2020-01-01").SetDateTimeMilli(2019, 2, 2, 13, 14, 15, 999).ToString() // 2019-02-02 13:14:15.999 +0800 CST
-carbon.Parse("2020-01-01").SetDateTimeMilli(2019, 2, 31, 13, 14, 15, 999).ToString() // 2019-03-03 13:14:15.999 +0800 CST
-// Set year, month, day, hour, minute, second and microsecond
-carbon.Parse("2020-01-01").SetDateTimeMicro(2019, 2, 2, 13, 14, 15, 999999).ToString() // 2019-02-02 13:14:15.999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateTimeMicro(2019, 2, 31, 13, 14, 15, 999999).ToString() // 2019-03-03 13:14:15.999999 +0800 CST
-// Set year, month, day, hour, minute, second and nanosecond
-carbon.Parse("2020-01-01").SetDateTimeNano(2019, 2, 2, 13, 14, 15, 999999999).ToString() // 2019-02-02 13:14:15.999999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateTimeNano(2019, 2, 31, 13, 14, 15, 999999999).ToString() // 2019-03-03 13:14:15.999999999 +0800 CST
-
-// Set year, month and day
-carbon.Parse("2020-01-01").SetDate(2019, 2, 2).ToString() // 2019-02-02 00:00:00 +0800 CST
-carbon.Parse("2020-01-01").SetDate(2019, 2, 31).ToString() // 2019-03-03 00:00:00 +0800 CST
-// Set year, month, day and millisecond
-carbon.Parse("2020-01-01").SetDateMilli(2019, 2, 2, 999).ToString() // 2019-02-02 00:00:00.999 +0800 CST
-carbon.Parse("2020-01-01").SetDateMilli(2019, 2, 31, 999).ToString() // 2019-03-03 00:00:00.999 +0800 CST
-// Set year, month, day and microsecond
-carbon.Parse("2020-01-01").SetDateMicro(2019, 2, 2, 999999).ToString() // 2019-02-02 00:00:00.999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateMicro(2019, 2, 31, 999999).ToString() // 2019-03-03 00:00:00.999999 +0800 CST
-// Set year, month, day and nanosecond
-carbon.Parse("2020-01-01").SetDateNano(2019, 2, 2, 999999999).ToString() // 2019-02-02 00:00:00.999999999 +0800 CST
-carbon.Parse("2020-01-01").SetDateNano(2019, 2, 31, 999999999).ToString() // 2019-03-03 00:00:00.999999999 +0800 CST
-
-// Set hour, minute and second
-carbon.Parse("2020-01-01").SetTime(13, 14, 15).ToString() // 2020-01-01 13:14:15 +0800 CST
-carbon.Parse("2020-01-01").SetTime(13, 14, 90).ToString() // 2020-01-01 13:15:30 +0800 CST
-// Set hour, minute, second and millisecond
-carbon.Parse("2020-01-01").SetTimeMilli(13, 14, 15, 999).ToString() // 2020-01-01 13:14:15.999 +0800 CST
-carbon.Parse("2020-01-01").SetTimeMilli(13, 14, 90, 999).ToString() // 2020-01-01 13:15:30.999 +0800 CST
-// Set hour, minute, second and microsecond
-carbon.Parse("2020-01-01").SetTimeMicro(13, 14, 15, 999999).ToString() // 2020-01-01 13:14:15.999999 +0800 CST
-carbon.Parse("2020-01-01").SetTimeMicro(13, 14, 90, 999999).ToString() // 2020-01-01 13:15:30.999999 +0800 CST
-// Set hour, minute, second and nanosecond
-carbon.Parse("2020-01-01").SetTimeNano(13, 14, 15, 999999999).ToString() // 2020-01-01 13:14:15.999999999 +0800 CST
-carbon.Parse("2020-01-01").SetTimeNano(13, 14, 90, 999999999).ToString() // 2020-01-01 13:15:30.999999999 +0800 CST
-
-// Set year
-carbon.Parse("2020-02-29").SetYear(2021).ToDateString() // 2021-03-01
-// Set year without overflowing month
-carbon.Parse("2020-02-29").SetYearNoOverflow(2021).ToDateString() // 2021-02-28
-
-// Set month
-carbon.Parse("2020-01-31").SetMonth(2).ToDateString() // 2020-03-02
-// Set month without overflowing month
-carbon.Parse("2020-01-31").SetMonthNoOverflow(2).ToDateString() // 2020-02-29
-
-// Set start day of the week
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Sunday).Week() // 0
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Monday).Week() // 6
-
-// Set day
-carbon.Parse("2019-08-05").SetDay(31).ToDateString() // 2020-08-31
-carbon.Parse("2020-02-01").SetDay(31).ToDateString() // 2020-03-02
-
-// Set hour
-carbon.Parse("2020-08-05 13:14:15").SetHour(10).ToDateTimeString() // 2020-08-05 10:14:15
-carbon.Parse("2020-08-05 13:14:15").SetHour(24).ToDateTimeString() // 2020-08-06 00:14:15
-
-// Set minute
-carbon.Parse("2020-08-05 13:14:15").SetMinute(10).ToDateTimeString() // 2020-08-05 13:10:15
-carbon.Parse("2020-08-05 13:14:15").SetMinute(60).ToDateTimeString() // 2020-08-05 14:00:15
-
-// Set second
-carbon.Parse("2020-08-05 13:14:15").SetSecond(10).ToDateTimeString() // 2020-08-05 13:14:10
-carbon.Parse("2020-08-05 13:14:15").SetSecond(60).ToDateTimeString() // 2020-08-05 13:15:00
-
-// Set millisecond
-carbon.Parse("2020-08-05 13:14:15").SetMillisecond(100).Millisecond() // 100
-carbon.Parse("2020-08-05 13:14:15").SetMillisecond(999).Millisecond() // 999
-
-// Set microsecond
-carbon.Parse("2020-08-05 13:14:15").SetMicrosecond(100000).Microsecond() // 100000
-carbon.Parse("2020-08-05 13:14:15").SetMicrosecond(999999).Microsecond() // 999999
-
-// Set nanosecond
-carbon.Parse("2020-08-05 13:14:15").SetNanosecond(100000000).Nanosecond() // 100000000
-carbon.Parse("2020-08-05 13:14:15").SetNanosecond(999999999).Nanosecond() // 999999999
+carbon.ClearTestNow()
+carbon.IsTestNow() // false
```
-##### Getter
+## Documentation
-```go
-// Get total days of the year
-carbon.Parse("2019-08-05 13:14:15").DaysInYear() // 365
-carbon.Parse("2020-08-05 13:14:15").DaysInYear() // 366
-// Get total days of the month
-carbon.Parse("2020-02-01 13:14:15").DaysInMonth() // 29
-carbon.Parse("2020-04-01 13:14:15").DaysInMonth() // 30
-carbon.Parse("2020-08-01 13:14:15").DaysInMonth() // 31
+For full documentation, please visit [carbon.go-pkg.com](https://carbon.go-pkg.com)
-// Get day of the year
-carbon.Parse("2020-08-05 13:14:15").DayOfYear() // 218
-// Get week of the year
-carbon.Parse("2020-08-05 13:14:15").WeekOfYear() // 32
-// Get day of the month
-carbon.Parse("2020-08-05 13:14:15").DayOfMonth() // 5
-// Get week of the month
-carbon.Parse("2020-08-05 13:14:15").WeekOfMonth() // 1
-// Get day of the week
-carbon.Parse("2020-08-05 13:14:15").DayOfWeek() // 3
-
-// Get current year, month, day, hour, minute and second
-carbon.Parse("2020-08-05 13:14:15").DateTime() // 2020, 8, 5, 13, 14, 15
-// Get current year, month, day, hour, minute, second and millisecond
-carbon.Parse("2020-08-05 13:14:15").DateTimeMilli() // 2020, 8, 5, 13, 14, 15, 999
-// Get current year, month, day, hour, minute, second and microsecond
-carbon.Parse("2020-08-05 13:14:15").DateTimeMicro() // 2020, 8, 5, 13, 14, 15, 999999
-// Get current year, month, day, hour, minute, second and nanosecond
-carbon.Parse("2020-08-05 13:14:15").DateTimeNano() // 2020, 8, 5, 13, 14, 15, 999999999
-
-// Get current year, month and day
-carbon.Parse("2020-08-05 13:14:15.999999999").Date() // 2020, 8, 5
-// Get current year, month, day and millisecond
-carbon.Parse("2020-08-05 13:14:15.999999999").DateMilli() // 2020, 8, 5, 999
-// Get current year, month, day and microsecond
-carbon.Parse("2020-08-05 13:14:15.999999999").DateMicro() // 2020, 8, 5, 999999
-// Get current year, month, day and nanosecond
-carbon.Parse("2020-08-05 13:14:15.999999999").DateNano() // 2020, 8, 5, 999999999
-
-// Get current hour, minute and second
-carbon.Parse("2020-08-05 13:14:15.999999999").Time() // 13, 14, 15
-// Get current hour, minute, second and millisecond
-carbon.Parse("2020-08-05 13:14:15.999999999").TimeMilli() // 13, 14, 15, 999
-// Get current hour, minute, second and microsecond
-carbon.Parse("2020-08-05 13:14:15.999999999").TimeMicro() // 13, 14, 15, 999999
-// Get current hour, minute, second and nanosecond
-carbon.Parse("2020-08-05 13:14:15.999999999").TimeNano() // 13, 14, 15, 999999999
-
-// Get current century
-carbon.Parse("2020-08-05 13:14:15").Century() // 21
-// Get current decade
-carbon.Parse("2019-08-05 13:14:15").Decade() // 10
-carbon.Parse("2021-08-05 13:14:15").Decade() // 20
-// Get current year
-carbon.Parse("2020-08-05 13:14:15").Year() // 2020
-// Get current quarter
-carbon.Parse("2020-08-05 13:14:15").Quarter() // 3
-// Get current month
-carbon.Parse("2020-08-05 13:14:15").Month() // 8
-// Get current week(start from 0)
-carbon.Parse("2020-08-02 13:14:15").Week() // 0
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Sunday).Week() // 0
-carbon.Parse("2020-08-02").SetWeekStartsAt(carbon.Monday).Week() // 6
-// Get current day
-carbon.Parse("2020-08-05 13:14:15").Day() // 5
-// Get current hour
-carbon.Parse("2020-08-05 13:14:15").Hour() // 13
-// Get current minute
-carbon.Parse("2020-08-05 13:14:15").Minute() // 14
-// Get current second
-carbon.Parse("2020-08-05 13:14:15").Second() // 15
-// Get current millisecond
-carbon.Parse("2020-08-05 13:14:15.999").Millisecond() // 999
-// Get current microsecond
-carbon.Parse("2020-08-05 13:14:15.999").Microsecond() // 999000
-// Get current nanosecond
-carbon.Parse("2020-08-05 13:14:15.999").Nanosecond() // 999000000
-
-// Get timestamp with second
-carbon.Parse("2020-08-05 13:14:15").Timestamp() // 1596604455
-// Get timestamp with millisecond
-carbon.Parse("2020-08-05 13:14:15").TimestampMilli() // 1596604455000
-// Get timestamp with microsecond
-carbon.Parse("2020-08-05 13:14:15").TimestampMicro() // 1596604455000000
-// Get timestamp with nanosecond
-carbon.Parse("2020-08-05 13:14:15").TimestampNano() // 1596604455000000000
-
-// Get timezone name
-carbon.SetTimezone(carbon.PRC).Timezone() // CST
-carbon.SetTimezone(carbon.Tokyo).Timezone() // JST
-
-// Get location name
-carbon.SetTimezone(carbon.PRC).Location() // PRC
-carbon.SetTimezone(carbon.Tokyo).Location() // Asia/Tokyo
-
-// Get offset seconds from the UTC timezone
-carbon.SetTimezone(carbon.PRC).Offset() // 28800
-carbon.SetTimezone(carbon.Tokyo).Offset() // 32400
-
-// Get locale name
-carbon.Now().SetLocale("en").Locale() // en
-carbon.Now().SetLocale("zh-CN").Locale() // zh-CN
-
-// Get constellation name
-carbon.Now().Constellation() // Leo
-carbon.Now().SetLocale("en").Constellation() // Leo
-carbon.Now().SetLocale("zh-CN").Constellation() // 狮子座
-
-// Get season name
-carbon.Now().Season() // Summer
-carbon.Now().SetLocale("en").Season() // Summer
-carbon.Now().SetLocale("zh-CN").Season() // 夏季
-
-// Get current age
-carbon.Parse("2002-01-01 13:14:15").Age() // 17
-carbon.Parse("2002-12-31 13:14:15").Age() // 18
-```
-
-##### Output
-
-```go
-// Output datetime format string
-carbon.Parse("2020-08-05 13:14:15").ToDateTimeString() // 2020-08-05 13:14:15
-// Output datetime with millisecond format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeMilliString() // 2020-08-05 13:14:15.999
-// Output datetime with microsecond format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeMicroString() // 2020-08-05 13:14:15.999999
-// Output datetime with nanosecond format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToDateTimeNanoString() // 2020-08-05 13:14:15.999999999
-
-// Output short datetime format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeString() // 20200805131415
-// Output short datetime with millisecond format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeMilliString() // 20200805131415.999
-// Output short datetime with microsecond format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeMicroString() // 20200805131415.999999
-// Output short datetime with nanosecond format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToShortDateTimeNanoString() // 20200805131415.999999999
-
-// Output date format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateString() // 2020-08-05
-// Output date with millisecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateMilliString() // 2020-08-05.999
-// Output date with microsecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateMicroString() // 2020-08-05.999999
-// Output date with nanosecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToDateNanoString() // 2020-08-05.999999999
-
-// Output short date format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateString() // 20200805
-// Output short date with millisecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateMilliString() // 20200805.999
-// Output short date with microsecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateMicroString() // 20200805.999999
-// Output short date with nanosecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortDateNanoString() // 20200805.999999999
-
-// Output time format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeString() // 13:14:15
-// Output time with millisecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeMilliString() // 13:14:15.999
-// Output time with microsecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeMicroString() // 13:14:15.999999
-// Output time with nanosecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToTimeNanoString() // 13:14:15.999999999
-
-// Output short time format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeString() // 131415
-// Output short time with millisecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeMilliString() // 131415.999
-// Output short time with microsecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeMicroString() // 131415.999999
-// Output short time with nanosecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToShortTimeNanoString() // 131415.999999999
-
-// Output Ansic format string
-carbon.Parse("2020-08-05 13:14:15").ToAnsicString() // Wed Aug 5 13:14:15 2020
-// Output Atom format string
-carbon.Parse("2020-08-05 13:14:15").ToAtomString() // 2020-08-05T13:14:15+08:00
-// Output Unix date format string
-carbon.Parse("2020-08-05 13:14:15").ToUnixDateString() // Wed Aug 5 13:14:15 CST 2020
-// Output Ruby date format string
-carbon.Parse("2020-08-05 13:14:15").ToRubyDateString() // Wed Aug 05 13:14:15 +0800 2020
-// Output Kitchen format string
-carbon.Parse("2020-08-05 13:14:15").ToKitchenString() // 1:14PM
-// Output Cookie format string
-carbon.Parse("2020-08-05 13:14:15").ToCookieString() // Wednesday, 05-Aug-2020 13:14:15 CST
-// Output day, date and time format string
-carbon.Parse("2020-08-05 13:14:15").ToDayDateTimeString() // Wed, Aug 5, 2020 1:14 PM
-// Output RSS format string
-carbon.Parse("2020-08-05 13:14:15").ToRssString() // Wed, 05 Aug 2020 13:14:15 +0800
-// Output W3C format string
-carbon.Parse("2020-08-05 13:14:15").ToW3cString() // 2020-08-05T13:14:15+08:00
-
-// Output ISO8601 format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601String() // 2020-08-05T13:14:15+08:00
-// Output ISO8601 with millisecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MilliString() // 2020-08-05T13:14:15.999+08:00
-// Output ISO8601 with microsecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MicroString() // 2020-08-05T13:14:15.999999+08:00
-// Output ISO8601 with nanosecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601NanoString() // 2020-08-05T13:14:15.999999999+08:00
-// Output ISO8601Zulu format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluString() // 2020-08-05T13:14:15Z
-// Output ISO8601Zulu with millisecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluMilliString() // 2020-08-05T13:14:15.999Z
-// Output ISO8601Zulu with microsecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluMicroString() // 2020-08-05T13:14:15.999999Z
-// Output ISO8601Zulu with nanosecond format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluNanoString() // 2020-08-05T13:14:15.999999999Z
-
-// Output RFC822 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc822String() // 05 Aug 20 13:14 CST
-// Output RFC822Z format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc822zString() // 05 Aug 20 13:14 +0800
-// Output RFC850 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc850String() // Wednesday, 05-Aug-20 13:14:15 CST
-// Output RFC1036 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc1036String() // Wed, 05 Aug 20 13:14:15 +0800
-// Output RFC1123 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123String() // Wed, 05 Aug 2020 13:14:15 CST
-// Output RFC1123Z format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123zString() // Wed, 05 Aug 2020 13:14:15 +0800
-// Output RFC2822 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc2822String() // Wed, 05 Aug 2020 13:14:15 +0800
-// Output RFC7231 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc7231String() // Wed, 05 Aug 2020 13:14:15 GMT
-
-// Output RFC3339 format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339String() // 2020-08-05T13:14:15+08:00
-// Output RFC3339 with millisecond format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MilliString() // 2020-08-05T13:14:15.999+08:00
-// Output RFC3339 with microsecond format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MicroString() // 2020-08-05T13:14:15.999999+08:00
-// Output RFC3339 with nanosecond format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339NanoString() // 2020-08-05T13:14:15.999999999+08:00
-
-// Output datetime format string
-fmt.Printf("%s", carbon.Parse("2020-08-05 13:14:15")) // 2020-08-05 13:14:15
-
-// Output "2006-01-02 15:04:05.999999999 -0700 MST" format string
-carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15.999999 +0800 CST
-
-// Output "Jan 2, 2006" format string
-carbon.Parse("2020-08-05 13:14:15").ToFormattedDateString() // Aug 5, 2020
-// Output "Mon, Jan 2, 2006" format string
-carbon.Parse("2020-08-05 13:14:15").ToFormattedDayDateString() // Wed, Aug 5, 2020
-
-// Output string by layout
-carbon.Parse("2020-08-05 13:14:15").Layout(carbon.ISO8601Layout) // 2020-08-05T13:14:15+08:00
-carbon.Parse("2020-08-05 13:14:15").Layout("20060102150405") // 20200805131415
-carbon.Parse("2020-08-05 13:14:15").Layout("2006年01月02日 15时04分05秒") // 2020年08月05日 13时14分15秒
-carbon.Parse("2020-08-05 13:14:15").Layout("It is 2006-01-02 15:04:05") // It is 2020-08-05 13:14:15
-
-// Output string by format
-carbon.Parse("2020-08-05 13:14:15").Format("YmdHis") // 20200805131415
-carbon.Parse("2020-08-05 13:14:15").Format("Y年m月d日 H时i分s秒") // 2020年08月05日 13时14分15秒
-carbon.Parse("2020-08-05 13:14:15").Format("l jS \\o\\f F Y h:i:s A") // Wednesday 5th of August 2020 01:14:15 PM
-carbon.Parse("2020-08-05 13:14:15").Format("\\I\\t \\i\\s Y-m-d H:i:s") // It is 2020-08-05 13:14:15
-```
-
-> For more supported format signs, please see the Format sign table
-
-##### Constellation
-
-```go
-// Get constellation name
-carbon.Parse("2020-08-05 13:14:15").Constellation() // Leo
-
-// Whether is Aries
-carbon.Parse("2020-08-05 13:14:15").IsAries() // false
-// Whether is Taurus
-carbon.Parse("2020-08-05 13:14:15").IsTaurus() // false
-// Whether is Gemini
-carbon.Parse("2020-08-05 13:14:15").IsGemini() // false
-// Whether is Cancer
-carbon.Parse("2020-08-05 13:14:15").IsCancer() // false
-// Whether is Leo
-carbon.Parse("2020-08-05 13:14:15").IsLeo() // true
-// Whether is Virgo
-carbon.Parse("2020-08-05 13:14:15").IsVirgo() // false
-// Whether is Libra
-carbon.Parse("2020-08-05 13:14:15").IsLibra() // false
-// Whether is Scorpio
-carbon.Parse("2020-08-05 13:14:15").IsScorpio() // false
-// Whether is Sagittarius
-carbon.Parse("2020-08-05 13:14:15").IsSagittarius() // false
-// Whether is Capricorn
-carbon.Parse("2020-08-05 13:14:15").IsCapricorn() // false
-// Whether is Aquarius
-carbon.Parse("2020-08-05 13:14:15").IsAquarius() // false
-// Whether is Pisces
-carbon.Parse("2020-08-05 13:14:15").IsPisces() // false
-```
-
-##### Season
-
-> According to the meteorological division method, March to May is spring, June to August is summer, September to November is autumn, and December to February is winter
-
-```go
-// Get season name
-carbon.Parse("2020-08-05 13:14:15").Season() // Summer
-
-// Start of the season
-carbon.Parse("2020-08-05 13:14:15").StartOfSeason().ToDateTimeString() // 2020-06-01 00:00:00
-// End of the season
-carbon.Parse("2020-08-05 13:14:15").EndOfSeason().ToDateTimeString() // 2020-08-31 23:59:59
-
-// Whether is spring
-carbon.Parse("2020-08-05 13:14:15").IsSpring() // false
-// Whether is summer
-carbon.Parse("2020-08-05 13:14:15").IsSummer() // true
-// Whether is autumn
-carbon.Parse("2020-08-05 13:14:15").IsAutumn() // false
-// Whether is winter
-carbon.Parse("2020-08-05 13:14:15").IsWinter() // false
-```
-
-##### JSON
-
-```go
-type Person struct {
- Name string `json:"name"`
- Age int `json:"age"`
- Birthday0 carbon.Carbon `json:"birthday0"`
- Birthday1 carbon.DateTime `json:"birthday1"`
- Birthday2 carbon.DateTimeMilli `json:"birthday2"`
- Birthday3 carbon.DateTimeMicro `json:"birthday3"`
- Birthday4 carbon.DateTimeNano `json:"birthday4"`
- GraduatedAt1 carbon.Date `json:"graduated_at1"`
- GraduatedAt2 carbon.DateMilli `json:"graduated_at2"`
- GraduatedAt3 carbon.DateMicro `json:"graduated_at3"`
- GraduatedAt4 carbon.DateNano `json:"graduated_at4"`
- OperatedAt1 carbon.Time `json:"operated_at1"`
- OperatedAt2 carbon.TimeMilli `json:"operated_at2"`
- OperatedAt3 carbon.TimeMicro `json:"operated_at3"`
- OperatedAt4 carbon.TimeNano `json:"operated_at4"`
- CreatedAt1 carbon.Timestamp `json:"created_at1"`
- CreatedAt2 carbon.TimestampMilli `json:"created_at2"`
- CreatedAt3 carbon.TimestampMicro `json:"created_at3"`
- CreatedAt4 carbon.TimestampNano `json:"created_at4"`
-}
-
-person := Person {
- Name: "gouguoyin",
- Age: 18,
- Birthday0: carbon.Now().SubYears(18),
- Birthday1: carbon.NewDateTime(carbon.Now().SubYears(18)),
- Birthday2: carbon.NewDateTimeMilli(carbon.Now().SubYears(18)),
- Birthday3: carbon.NewDateTimeMicro(carbon.Now().SubYears(18)),
- Birthday4: carbon.NewDateTimeNano(carbon.Now().SubYears(18)),
- GraduatedAt1: carbon.NewDate(carbon.Now()),
- GraduatedAt2: carbon.NewDateMilli(carbon.Now()),
- GraduatedAt3: carbon.NewDateMicro(carbon.Now()),
- GraduatedAt4: carbon.NewDateNano(carbon.Now()),
- OperatedAt1: carbon.NewTime(carbon.Now()),
- OperatedAt2: carbon.NewTimeMilli(carbon.Now()),
- OperatedAt3: carbon.NewTimeMicro(carbon.Now()),
- OperatedAt4: carbon.NewTimeNano(carbon.Now()),
- CreatedAt1: carbon.NewTimestamp(carbon.Now()),
- CreatedAt2: carbon.NewTimestampMilli(carbon.Now()),
- CreatedAt3: carbon.NewTimestampMicro(carbon.Now()),
- CreatedAt4: carbon.NewTimestampNano(carbon.Now()),
-}
-
-data, err := json.Marshal(&person)
-if err != nil {
- // Error handle...
- log.Fatal(err)
-}
-fmt.Printf("%s", data)
-// Output
-{
- "name": "gouguoyin",
- "age": 18,
- "birthday0": "2003-07-16 13:14:15",
- "birthday1": "2003-07-16 13:14:15",
- "birthday2": "2003-07-16 13:14:15.999",
- "birthday3": "2003-07-16 13:14:15.999999",
- "birthday4": "2003-07-16 13:14:15.999999999",
- "graduated_at1": "2020-08-05",
- "graduated_at2": "2020-08-05.999",
- "graduated_at3": "2020-08-05.999999",
- "graduated_at4": "2020-08-05.999999999",
- "operated_at1": "13:14:15",
- "operated_at2": "13:14:15.999",
- "operated_at3": "13:14:15.999999",
- "operated_at4": "13:14:15.999999999",
- "created_at1": 1596604455,
- "created_at2": 1596604455999,
- "created_at3": 1596604455999999,
- "created_at4": 1596604455999999999
-}
-
-err := json.Unmarshal([]byte(data), &person)
-if err != nil {
- // Error handle...
- log.Fatal(err)
-}
-
-person.Birthday0.String() // 2003-07-16 13:14:15
-person.Birthday1.String() // 2003-07-16 13:14:15
-person.Birthday2.String() // 2003-07-16 13:14:15.999
-person.Birthday3.String() // 2003-07-16 13:14:15.999999
-person.Birthday4.String() // 2003-07-16 13:14:15.999999999
-
-person.GraduatedAt1.String() // 2020-08-05
-person.GraduatedAt2.String() // 2020-08-05.999
-person.GraduatedAt3.String() // 2020-08-05.999999
-person.GraduatedAt4.String() // 2020-08-05.999999999
-
-person.OperatedAt1.String() // 13:14:15
-person.OperatedAt2.String() // 13:14:15.999
-person.OperatedAt3.String() // 13:14:15.999999
-person.OperatedAt4.String() // 13:14:15.999999999
-
-person.CreatedAt1.String() // "1596604455"
-person.CreatedAt2.String() // "1596604455999"
-person.CreatedAt3.String() // "1596604455999999"
-person.CreatedAt4.String() // "1596604455999999999"
-
-person.CreatedAt1.Int64() // 1596604455
-person.CreatedAt2.Int64() // 1596604455999
-person.CreatedAt3.Int64() // 1596604455999999
-person.CreatedAt4.Int64() // 1596604455999999999
-```
-
-##### Calendar
-
-The following calendars are supported
-
-* [Julian Day/Modified Julian Day](./calendar/julian/README.md "JD/MJD")
-* [Chinese Lunar](./calendar/lunar/README.md "Chinese Lunar")
-* [Persian/Jalaali](./calendar/persian/README.md "Persian/Jalaali")
-
-##### I18n
-
-The following languages are supported
-
-* [Simplified Chinese(zh-CN)](./lang/zh-CN.json "Simplified Chinese"):translated
- by [gouguoyin](https://github.com/gouguoyin "gouguoyin")
-* [Traditional Chinese(zh-TW)](./lang/zh-TW.json "Traditional Chinese"):translated
- by [gouguoyin](https://github.com/gouguoyin "gouguoyin")
-* [English(en)](./lang/en.json "English"):translated
- by [gouguoyin](https://github.com/gouguoyin "gouguoyin")
-* [Japanese(jp)](./lang/jp.json "Japanese"):translated
- by [gouguoyin](https://github.com/gouguoyin "gouguoyin")
-* [Korean(kr)](./lang/kr.json "Korean"):translated by [nannul](https://github.com/nannul "nannul")
-* [German(de)](./lang/de.json "German"):translated by [benzammour](https://github.com/benzammour "benzammour")
-* [Spanish(es)](./lang/es.json "Spanish"):translated by [hgisinger](https://github.com/hgisinger "hgisinger")
-* [Turkish(tr)](./lang/tr.json "Turkish"): translated by [emresenyuva](https://github.com/emresenyuva "emresenyuva")
-* [Portuguese(pt)](./lang/pt.json "Portuguese"): translated by [felipear89](https://github.com/felipear89 "felipear89")
-* [Russian(ru)](./lang/ru.json "Russian"): translated by [zemlyak](https://github.com/zemlyak "zemlyak")
-* [Ukrainian(uk)](./lang/uk.json "Ukrainian"): translated by [open-git](https://github.com/open-git "open-git")
-* [Romanian(ro)](./lang/ro.json "Romanian"): translated by [DrOctavius](https://github.com/DrOctavius "DrOctavius")
-* [Indonesian(id)](./lang/id.json "Indonesian"): translated by [justpoypoy](https://github.com/justpoypoy "justpoypoy")
-* [Italian(it)](../blob/master/lang/it.json "Italian"): translated by [nicoloHevelop](https://github.com/nicoloHevelop "nicoloHevelop")
-* [Bahasa Malaysia(ms-MY)](./lang/ms-MY.json "Bahasa Malaysia"): translated
- by [hollowaykeanho](https://github.com/hollowaykeanho "hollowaykeanho")
-* [French(fr)](./lang/fr.json "French"): translated
- by [hollowaykeanho](https://github.com/hollowaykeanho "hollowaykeanho")
-* [Thailand(th)](./lang/th.json "Thailand"): translated by [izcream](https://github.com/izcream "izcream")
-* [Swedish(se)](./lang/se.json "Swedish"): translated by [jwanglof](https://github.com/jwanglof "jwanglof")
-* [Farsi(fa)](./lang/fa.json "Farsi"): translated by [erfanMomeniii](https://github.com/erfanMomeniii "erfanMomeniii")
-* [Dutch(nl)](./lang/nl.json "Dutch"): translated by [RemcoE33](https://github.com/RemcoE33 "RemcoE33")
-* [VietNamese(vi)](./lang/vi.json "VietNam"): translated by [culy247](https://github.com/culy247 "culy247")
-* [Hindi(hi)](./lang/hi.json "India"): translated by [chauhan17nitin](https://github.com/chauhan17nitin "chauhan17nitin")
-* [Polish(pl)](./lang/pl.json "Polish"): translated by [gouguoyin](https://github.com/gouguoyin "gouguoyin")
-* [Bulgarian(bg)](./lang/bg.json "Bulgarian"): translated by [yuksbg](https://github.com/yuksbg "yuksbg")
-* [Arabic(ar)](./lang/ar.json "Arabic"): translated by [zumoshi](https://github.com/zumoshi "zumoshi")
-* [Hungarian(hu)](./lang/hu.json "Hungarian"): translated by [kenlas](https://github.com/kenlas "kenlas")
-* [Dansk(dk)](./lang/dk.json "Dansk"): translated by [Munk91](https://github.com/Munk91 "Munk91")
-
-The following methods are supported
-
-* `Constellation()`:get constellation name, like `Aries`
-* `Season()`:get season name, like `Spring`
-* `DiffForHumans()`:get the difference with human-readable format string, like `1 year from now`
-* `ToMonthString()`:output month format string, like `January`
-* `ToShortMonthString()`:output short month format string, like `Jan`
-* `ToWeekString()`:output week format string, like `Sunday`
-* `ToShortWeekString()`:output short week format string, like `Sun`
-
-###### Set locale
-
-```go
-lang := carbon.NewLanguage()
-lang.SetLocale("en")
-
-c := carbon.SetLanguage(lang)
-if c.Error != nil {
- // Error handle...
- log.Fatal(c.Error)
-}
-
-c.Now().AddHours(1).DiffForHumans() // 1 hour from now
-c.Now().AddHours(1).ToMonthString() // August
-c.Now().AddHours(1).ToShortMonthString() // Aug
-c.Now().AddHours(1).ToWeekString() // Wednesday
-c.Now().AddHours(1).ToShortWeekString() // Wed
-c.Now().AddHours(1).Constellation() // Leo
-c.Now().AddHours(1).Season() // Summer
-```
-
-###### Reset some resources(the rests still translate from the given locale)
-
-```go
-lang := carbon.NewLanguage()
-
-resources := map[string]string {
- "hour": "%dh",
-}
-lang.SetLocale("en").SetResources(resources)
-
-c := carbon.SetLanguage(lang)
-if c.Error != nil {
- // Error handle...
- log.Fatal(c.Error)
-}
-
-c.Now().AddYears(1).DiffForHumans() // 1 year from now
-c.Now().AddHours(1).DiffForHumans() // 1h from now
-c.Now().ToMonthString() // August
-c.Now().ToShortMonthString() // Aug
-c.Now().ToWeekString() // Tuesday
-c.Now().ToShortWeekString() // Tue
-c.Now().Constellation() // Leo
-c.Now().Season() // Summer
-```
-
-###### Reset all resources
-
-```go
-lang := carbon.NewLanguage()
-resources := map[string]string {
- "months": "january|february|march|april|may|june|july|august|september|october|november|december",
- "short_months": "jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec",
- "weeks": "sunday|monday|tuesday|wednesday|thursday|friday|saturday",
- "short_weeks": "sun|mon|tue|wed|thu|fri|sat",
- "seasons": "spring|summer|autumn|winter",
- "constellations": "aries|taurus|gemini|cancer|leo|virgo|libra|scorpio|sagittarius|capricornus|aquarius|pisce",
- "year": "1 yr|%d yrs",
- "month": "1 mo|%d mos",
- "week": "%dw",
- "day": "%dd",
- "hour": "%dh",
- "minute": "%dm",
- "second": "%ds",
- "now": "just now",
- "ago": "%s ago",
- "from_now": "in %s",
- "before": "%s before",
- "after": "%s after",
-}
-lang.SetResources(resources)
-
-c := carbon.SetLanguage(lang)
-c.Now().AddYears(1).DiffForHumans() // in 1 yr
-c.Now().AddHours(1).DiffForHumans() // in 1h
-c.Now().ToMonthString() // august
-c.Now().ToShortMonthString() // aug
-c.Now().ToWeekString() // tuesday
-c.Now().ToShortWeekString() // tue
-c.Now().Constellation() // leo
-c.Now().Season() // summer
-```
-
-##### Testing
-
-```go
-c := carbon.SetTimezone(carbon.UTC)
-
-c.Now().ToDateString() // 2023-12-27
-c.Now().IsSetTestNow() // false
-
-c.SetTestNow(carbon.Parse("2020-08-05"))
-c.Now().ToDateString() // 2020-08-05
-c.Now().IsSetTestNow() // true
-
-c.UnSetTestNow()
-c.Now().ToDateString() // 2023-12-27
-c.Now().IsSetTestNow() // false
-```
-
-##### Error
-
-> If more than one error occurs, only the first error is returned
-
-```go
-c := carbon.SetTimezone("xxx").Parse("2020-08-05")
-if c.Error != nil {
- // Error handle...
- log.Fatal(c.Error)
-}
-// Output
-invalid timezone "xxx", please see the file "$GOROOT/lib/time/zoneinfo.zip" for all valid timezones
-```
-
-#### Appendix
-
-##### Format sign table
-
-| sign | desc | length | range | example |
-|:----:|:------------------------------------------------------------------------------------------------------:|:------:|:----------------:|:-------------------------------:|
-| d | Day of the month, padded to 2 | 2 | 01-31 | 02 |
-| D | Day of the week, as an abbreviate localized string | 3 | Mon-Sun | Mon |
-| j | Day of the month, no padding | - | 1-31 | 2 |
-| S | English ordinal suffix for the day of the month, 2 characters. Eg: st, nd, rd or th. Works well with j | 2 | st/nd/rd/th | th |
-| l | Day of the week, as an unabbreviated localized string | - | Monday-Sunday | Monday |
-| F | Month as an unabbreviated localized string | - | January-December | January |
-| m | Month, padded to 2 | 2 | 01-12 | 01 |
-| M | Month as an abbreviated localized string | 3 | Jan-Dec | Jan |
-| n | Month, no padding | - | 1-12 | 1 |
-| Y | Four-digit year | 4 | 0000-9999 | 2006 |
-| y | Two-digit year | 2 | 00-99 | 06 |
-| a | Lowercase morning or afternoon sign | 2 | am/pm | pm |
-| A | Uppercase morning or afternoon sign | 2 | AM/PM | PM |
-| g | Hour in 12-hour format, no padding | - | 1-12 | 3 |
-| G | Hour in 24-hour format, no padding | - | 0-23 | 15 |
-| h | Hour in 12-hour format, padded to 2 | 2 | 00-11 | 03 |
-| H | Hour in 24-hour format, padded to 2 | 2 | 00-23 | 15 |
-| i | Minute, padded to 2 | 2 | 01-59 | 04 |
-| s | Second, padded to 2 | 2 | 01-59 | 05 |
-| O | Difference to Greenwich time (GMT) without colon between hours and minutes | - | - | -0700 |
-| P | Difference to Greenwich time (GMT) with colon between hours and minutes | - | - | -07:00 |
-| T | Abbreviated timezone | - | - | MST |
-| W | week of the year, padded to 2 | 2 | 01-52 | 01 |
-| N | day of the week, padded to 2 | 2 | 01-07 | 02 |
-| L | Whether it's a leap year | 1 | 0-1 | 0 |
-| U | Unix timestamp with seconds | - | - | 1596604455 |
-| V | Unix timestamp with millisecond | - | - | 1596604455666 |
-| X | Unix timestamp with microsecond | - | - | 1596604455666666 |
-| Z | Unix timestamp with nanoseconds | - | - | 1596604455666666666 |
-| v | Millisecond | - | 1-999 | 999 |
-| u | Microsecond | - | 1-999999 | 999999 |
-| x | Nanosecond | - | 1-999999999 | 999999999 |
-| w | Day of the week | 1 | 0-6 | 1 |
-| t | Total days of the month | 2 | 28-31 | 31 |
-| z | Day of the year | - | 1-365 | 2 |
-| e | Location | - | - | America/New_York |
-| Q | Quarter | 1 | 1-4 | 1 |
-| C | Century | - | 0-99 | 21 |
-
-#### FAQ
-
-1、What is the difference between v1 and v2?
-> There is no difference between v1 and v2 of the API, but the implementation of the translation resource files in `language.go` is different. The v1 is implemented by the third-party extension library [packr](https://github.com/gobuffalo/packr), and the v2 is implemented by the standard library [embed](https://pkg.go.dev/embed) after `golang1.16`. If your golang version is `1.16+`, the v2 is recommended, otherwise, the v1 is required.
-
-#### References
+## References
* [briannesbitt/carbon](https://github.com/briannesbitt/Carbon)
* [nodatime/nodatime](https://github.com/nodatime/nodatime)
@@ -1544,18 +94,22 @@ invalid timezone "xxx", please see the file "$GOROOT/lib/time/zoneinfo.zip" for
* [moment/moment](https://github.com/moment/moment)
* [iamkun/dayjs](https://github.com/iamkun/dayjs)
-#### Contributors
-Thanks to all of the following who contributed to `Carbon`:
+## Contributors
+Thanks to all the following who contributed to `Carbon`:
-#### Sponsors
+## Sponsors
`Carbon` is a non-commercial open source project. If you want to support `Carbon`, you can [buy a cup of coffee](https://opencollective.com/go-carbon) for developer.
-#### Thanks
+## Thanks
`Carbon` had been being developed with GoLand under the free JetBrains Open Source license, I would like to express my
thanks here.
+
+## License
+
+`Carbon` is licensed under the `MIT` License, see the [LICENSE](./LICENSE) file for details.
diff --git a/vendor/github.com/dromara/carbon/v2/boundary.go b/vendor/github.com/dromara/carbon/v2/boundary.go
index 879fadfa..0383a6c5 100644
--- a/vendor/github.com/dromara/carbon/v2/boundary.go
+++ b/vendor/github.com/dromara/carbon/v2/boundary.go
@@ -1,63 +1,56 @@
package carbon
// StartOfCentury returns a Carbon instance for start of the century.
-// 本世纪开始时间
-func (c Carbon) StartOfCentury() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfCentury() *Carbon {
+ if c.IsInvalid() {
return c
}
return c.create(c.Year()/YearsPerCentury*YearsPerCentury, 1, 1, 0, 0, 0, 0)
}
// EndOfCentury returns a Carbon instance for end of the century.
-// 本世纪结束时间
-func (c Carbon) EndOfCentury() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfCentury() *Carbon {
+ if c.IsInvalid() {
return c
}
return c.create(c.Year()/YearsPerCentury*YearsPerCentury+99, 12, 31, 23, 59, 59, 999999999)
}
// StartOfDecade returns a Carbon instance for start of the decade.
-// 本年代开始时间
-func (c Carbon) StartOfDecade() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfDecade() *Carbon {
+ if c.IsInvalid() {
return c
}
return c.create(c.Year()/YearsPerDecade*YearsPerDecade, 1, 1, 0, 0, 0, 0)
}
// EndOfDecade returns a Carbon instance for end of the decade.
-// 本年代结束时间
-func (c Carbon) EndOfDecade() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfDecade() *Carbon {
+ if c.IsInvalid() {
return c
}
return c.create(c.Year()/YearsPerDecade*YearsPerDecade+9, 12, 31, 23, 59, 59, 999999999)
}
// StartOfYear returns a Carbon instance for start of the year.
-// 本年开始时间
-func (c Carbon) StartOfYear() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfYear() *Carbon {
+ if c.IsInvalid() {
return c
}
return c.create(c.Year(), 1, 1, 0, 0, 0, 0)
}
// EndOfYear returns a Carbon instance for end of the year.
-// 本年结束时间
-func (c Carbon) EndOfYear() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfYear() *Carbon {
+ if c.IsInvalid() {
return c
}
return c.create(c.Year(), 12, 31, 23, 59, 59, 999999999)
}
// StartOfQuarter returns a Carbon instance for start of the quarter.
-// 本季度开始时间
-func (c Carbon) StartOfQuarter() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfQuarter() *Carbon {
+ if c.IsInvalid() {
return c
}
year, quarter, day := c.Year(), c.Quarter(), 1
@@ -65,9 +58,8 @@ func (c Carbon) StartOfQuarter() Carbon {
}
// EndOfQuarter returns a Carbon instance for end of the quarter.
-// 本季度结束时间
-func (c Carbon) EndOfQuarter() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfQuarter() *Carbon {
+ if c.IsInvalid() {
return c
}
year, quarter, day := c.Year(), c.Quarter(), 30
@@ -81,9 +73,8 @@ func (c Carbon) EndOfQuarter() Carbon {
}
// StartOfMonth returns a Carbon instance for start of the month.
-// 本月开始时间
-func (c Carbon) StartOfMonth() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfMonth() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, _ := c.Date()
@@ -91,9 +82,8 @@ func (c Carbon) StartOfMonth() Carbon {
}
// EndOfMonth returns a Carbon instance for end of the month.
-// 本月结束时间
-func (c Carbon) EndOfMonth() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfMonth() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, _ := c.Date()
@@ -101,29 +91,32 @@ func (c Carbon) EndOfMonth() Carbon {
}
// StartOfWeek returns a Carbon instance for start of the week.
-// 本周开始时间
-func (c Carbon) StartOfWeek() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfWeek() *Carbon {
+ if c.IsInvalid() {
return c
}
- dayOfWeek, weekStartsAt := c.DayOfWeek(), int(c.weekStartsAt)
- return c.SubDays((DaysPerWeek + dayOfWeek - weekStartsAt) % DaysPerWeek).StartOfDay()
+ dayOfWeek, weekStartsAt := c.StdTime().Weekday(), c.WeekStartsAt()
+ if dayOfWeek == weekStartsAt {
+ return c.StartOfDay()
+ }
+ return c.Copy().SubDays(int(DaysPerWeek+dayOfWeek-weekStartsAt) % DaysPerWeek).StartOfDay()
}
// EndOfWeek returns a Carbon instance for end of the week.
-// 本周结束时间
-func (c Carbon) EndOfWeek() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfWeek() *Carbon {
+ if c.IsInvalid() {
return c
}
- dayOfWeek, weekEndsAt := c.DayOfWeek(), int(c.weekStartsAt)+DaysPerWeek-1
- return c.AddDays((DaysPerWeek - dayOfWeek + weekEndsAt) % DaysPerWeek).EndOfDay()
+ dayOfWeek, weekEndsAt := c.StdTime().Weekday(), c.WeekEndsAt()
+ if dayOfWeek == weekEndsAt {
+ return c.EndOfDay()
+ }
+ return c.Copy().AddDays(int(DaysPerWeek-dayOfWeek+weekEndsAt) % DaysPerWeek).EndOfDay()
}
// StartOfDay returns a Carbon instance for start of the day.
-// 本日开始时间
-func (c Carbon) StartOfDay() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfDay() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day := c.Date()
@@ -131,9 +124,8 @@ func (c Carbon) StartOfDay() Carbon {
}
// EndOfDay returns a Carbon instance for end of the day.
-// 本日结束时间
-func (c Carbon) EndOfDay() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfDay() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day := c.Date()
@@ -141,9 +133,8 @@ func (c Carbon) EndOfDay() Carbon {
}
// StartOfHour returns a Carbon instance for start of the hour.
-// 小时开始时间
-func (c Carbon) StartOfHour() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfHour() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day := c.Date()
@@ -151,9 +142,8 @@ func (c Carbon) StartOfHour() Carbon {
}
// EndOfHour returns a Carbon instance for end of the hour.
-// 小时结束时间
-func (c Carbon) EndOfHour() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfHour() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day := c.Date()
@@ -161,9 +151,8 @@ func (c Carbon) EndOfHour() Carbon {
}
// StartOfMinute returns a Carbon instance for start of the minute.
-// 分钟开始时间
-func (c Carbon) StartOfMinute() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfMinute() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, hour, minute, _ := c.DateTime()
@@ -171,9 +160,8 @@ func (c Carbon) StartOfMinute() Carbon {
}
// EndOfMinute returns a Carbon instance for end of the minute.
-// 分钟结束时间
-func (c Carbon) EndOfMinute() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfMinute() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, hour, minute, _ := c.DateTime()
@@ -181,9 +169,8 @@ func (c Carbon) EndOfMinute() Carbon {
}
// StartOfSecond returns a Carbon instance for start of the second.
-// 秒开始时间
-func (c Carbon) StartOfSecond() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfSecond() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, hour, minute, second := c.DateTime()
@@ -191,9 +178,8 @@ func (c Carbon) StartOfSecond() Carbon {
}
// EndOfSecond returns a Carbon instance for end of the second.
-// 秒结束时间
-func (c Carbon) EndOfSecond() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfSecond() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, hour, minute, second := c.DateTime()
diff --git a/vendor/github.com/dromara/carbon/v2/calendar.go b/vendor/github.com/dromara/carbon/v2/calendar.go
index 00fbd4ae..e286b382 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar.go
@@ -7,55 +7,66 @@ import (
)
// Lunar converts Carbon instance to Lunar instance.
-// 将 Carbon 实例转化为 Lunar 实例
-func (c Carbon) Lunar() (l lunar.Lunar) {
- if c.Error != nil {
- l.Error = c.Error
- return
+func (c *Carbon) Lunar() *lunar.Lunar {
+ if c.IsNil() {
+ return nil
}
- return lunar.FromGregorian(c.StdTime()).ToLunar()
+ if c.IsZero() || c.IsEmpty() {
+ return &lunar.Lunar{}
+ }
+ if c.HasError() {
+ return &lunar.Lunar{Error: c.Error}
+ }
+ return lunar.FromStdTime(c.StdTime())
}
-// CreateFromLunar creates a Carbon instance from Lunar date and time.
-// 从 农历日期 创建 Carbon 实例
-func CreateFromLunar(year, month, day, hour, minute, second int, isLeapMonth bool) Carbon {
- t := lunar.FromLunar(year, month, day, hour, minute, second, isLeapMonth).ToGregorian().Time
- return CreateFromStdTime(t)
+// CreateFromLunar creates a Carbon instance from Lunar date.
+func CreateFromLunar(year, month, day int, isLeapMonth bool) *Carbon {
+ l := lunar.NewLunar(year, month, day, isLeapMonth)
+ if l.Error != nil {
+ return &Carbon{Error: l.Error}
+ }
+ return NewCarbon(l.ToGregorian(DefaultTimezone).Time)
}
// Julian converts Carbon instance to Julian instance.
-// 将 Carbon 实例转化为 Julian 实例
-func (c Carbon) Julian() (j julian.Julian) {
- if c.Error != nil {
- return
+func (c *Carbon) Julian() *julian.Julian {
+ if c.IsNil() {
+ return nil
}
- return julian.FromGregorian(c.StdTime()).ToJulian()
+ if c.IsEmpty() {
+ return &julian.Julian{}
+ }
+ if c.HasError() {
+ return &julian.Julian{}
+ }
+ return julian.FromStdTime(c.StdTime())
}
// CreateFromJulian creates a Carbon instance from Julian Day or Modified Julian Day.
-// 从 儒略日/简化儒略日 创建 Carbon 实例
-func CreateFromJulian(f float64) Carbon {
- t := julian.FromJulian(f).ToGregorian().Time
- return CreateFromStdTime(t)
+func CreateFromJulian(f float64) *Carbon {
+ return NewCarbon(julian.NewJulian(f).ToGregorian(DefaultTimezone).Time)
}
// Persian converts Carbon instance to Persian instance.
-// 将 Carbon 实例转化为 Persian 实例
-func (c Carbon) Persian() (p persian.Persian) {
- if c.Error != nil {
- return
+func (c *Carbon) Persian() *persian.Persian {
+ if c.IsNil() {
+ return nil
}
- return persian.FromGregorian(c.StdTime()).ToPersian()
+ if c.IsZero() || c.IsEmpty() {
+ return &persian.Persian{}
+ }
+ if c.HasError() {
+ return &persian.Persian{Error: c.Error}
+ }
+ return persian.FromStdTime(c.StdTime())
}
-// CreateFromPersian creates a Carbon instance from Persian date and time.
-// 从 波斯日期 创建 Carbon 实例
-func CreateFromPersian(year, month, day, hour, minute, second int) (c Carbon) {
- p := persian.FromPersian(year, month, day, hour, minute, second)
+// CreateFromPersian creates a Carbon instance from Persian date.
+func CreateFromPersian(year, month, day int) *Carbon {
+ p := persian.NewPersian(year, month, day)
if p.Error != nil {
- c.Error = p.Error
- return
+ return &Carbon{Error: p.Error}
}
- t := p.ToGregorian().Time
- return CreateFromStdTime(t)
+ return NewCarbon(p.ToGregorian(DefaultTimezone).Time)
}
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/gregorian.go b/vendor/github.com/dromara/carbon/v2/calendar/gregorian.go
index 647c2e3b..109e717f 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/gregorian.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar/gregorian.go
@@ -2,279 +2,22 @@
package calendar
import (
- "fmt"
"time"
)
-var InvalidDateError = func() error {
- return fmt.Errorf("invalid gregorian date, please make sure the date is valid")
-}
-
-// month constants
-// 月份常量
-const (
- January = "January" // 一月
- February = "February" // 二月
- March = "March" // 三月
- April = "April" // 四月
- May = "May" // 五月
- June = "June" // 六月
- July = "July" // 七月
- August = "August" // 八月
- September = "September" // 九月
- October = "October" // 十月
- November = "November" // 十一月
- December = "December" // 十二月
-)
-
-// week constants
-// 星期常量
-const (
- Monday = "Monday" // 周一
- Tuesday = "Tuesday" // 周二
- Wednesday = "Wednesday" // 周三
- Thursday = "Thursday" // 周四
- Friday = "Friday" // 周五
- Saturday = "Saturday" // 周六
- Sunday = "Sunday" // 周日
-)
-
-// number constants
-// 数字常量
-const (
- YearsPerMillennium = 1000 // 每千年1000年
- YearsPerCentury = 100 // 每世纪100年
- YearsPerDecade = 10 // 每十年10年
- QuartersPerYear = 4 // 每年4个季度
- MonthsPerYear = 12 // 每年12月
- MonthsPerQuarter = 3 // 每季度3月
- WeeksPerNormalYear = 52 // 每常规年52周
- weeksPerLongYear = 53 // 每长年53周
- WeeksPerMonth = 4 // 每月4周
- DaysPerLeapYear = 366 // 每闰年366天
- DaysPerNormalYear = 365 // 每常规年365天
- DaysPerWeek = 7 // 每周7天
- HoursPerWeek = 168 // 每周168小时
- HoursPerDay = 24 // 每天24小时
- MinutesPerDay = 1440 // 每天1440分钟
- MinutesPerHour = 60 // 每小时60分钟
- SecondsPerWeek = 604800 // 每周604800秒
- SecondsPerDay = 86400 // 每天86400秒
- SecondsPerHour = 3600 // 每小时3600秒
- SecondsPerMinute = 60 // 每分钟60秒
-)
-
-// layout constants
-// 布局模板常量
-const (
- AtomLayout = RFC3339Layout
- ANSICLayout = time.ANSIC
- CookieLayout = "Monday, 02-Jan-2006 15:04:05 MST"
- KitchenLayout = time.Kitchen
- RssLayout = time.RFC1123Z
- RubyDateLayout = time.RubyDate
- UnixDateLayout = time.UnixDate
- W3cLayout = RFC3339Layout
-
- RFC1036Layout = "Mon, 02 Jan 06 15:04:05 -0700"
- RFC1123Layout = time.RFC1123
- RFC1123ZLayout = time.RFC1123Z
- RFC2822Layout = time.RFC1123Z
- RFC3339Layout = "2006-01-02T15:04:05Z07:00"
- RFC3339MilliLayout = "2006-01-02T15:04:05.999Z07:00"
- RFC3339MicroLayout = "2006-01-02T15:04:05.999999Z07:00"
- RFC3339NanoLayout = "2006-01-02T15:04:05.999999999Z07:00"
- RFC7231Layout = "Mon, 02 Jan 2006 15:04:05 MST"
- RFC822Layout = time.RFC822
- RFC822ZLayout = time.RFC822Z
- RFC850Layout = time.RFC850
-
- ISO8601Layout = "2006-01-02T15:04:05-07:00"
- ISO8601MilliLayout = "2006-01-02T15:04:05.999-07:00"
- ISO8601MicroLayout = "2006-01-02T15:04:05.999999-07:00"
- ISO8601NanoLayout = "2006-01-02T15:04:05.999999999-07:00"
-
- DayDateTimeLayout = "Mon, Jan 2, 2006 3:04 PM"
- DateTimeLayout = "2006-01-02 15:04:05"
- DateTimeMilliLayout = "2006-01-02 15:04:05.999"
- DateTimeMicroLayout = "2006-01-02 15:04:05.999999"
- DateTimeNanoLayout = "2006-01-02 15:04:05.999999999"
- ShortDateTimeLayout = "20060102150405"
- ShortDateTimeMilliLayout = "20060102150405.999"
- ShortDateTimeMicroLayout = "20060102150405.999999"
- ShortDateTimeNanoLayout = "20060102150405.999999999"
-
- DateLayout = "2006-01-02"
- DateMilliLayout = "2006-01-02.999"
- DateMicroLayout = "2006-01-02.999999"
- DateNanoLayout = "2006-01-02.999999999"
- ShortDateLayout = "20060102"
- ShortDateMilliLayout = "20060102.999"
- ShortDateMicroLayout = "20060102.999999"
- ShortDateNanoLayout = "20060102.999999999"
-
- TimeLayout = "15:04:05"
- TimeMilliLayout = "15:04:05.999"
- TimeMicroLayout = "15:04:05.999999"
- TimeNanoLayout = "15:04:05.999999999"
- ShortTimeLayout = "150405"
- ShortTimeMilliLayout = "150405.999"
- ShortTimeMicroLayout = "150405.999999"
- ShortTimeNanoLayout = "150405.999999999"
-)
-
// Gregorian defines a Gregorian struct.
-// 定义 Gregorian 结构体
type Gregorian struct {
Time time.Time
Error error
}
-// NewGregorian returns a new Gregorian instance.
-// 初始化 Gregorian 结构体
-func NewGregorian(t time.Time) (g Gregorian) {
- if t.IsZero() {
- return
- }
- g.Time = t
- return
-}
-
-// MaxValue returns a Gregorian instance for the greatest supported date.
-// 返回 Gregorian 的最大值
-func MaxValue() Gregorian {
- return NewGregorian(time.Date(9999, 12, 31, 23, 59, 59, 999999999, time.UTC))
-}
-
-// MinValue returns a Gregorian instance for the lowest supported date.
-// 返回 Gregorian 的最小值
-func MinValue() Gregorian {
- return NewGregorian(time.Date(-9998, 1, 1, 0, 0, 0, 0, time.UTC))
-}
-
-// Date gets gregorian year, month, and day like 2020, 8, 5.
-// 获取公历年、月、日
-func (g Gregorian) Date() (year, month, day int) {
- if g.IsZero() {
- return 0, 0, 0
- }
- var tm time.Month
- year, tm, day = g.Time.Date()
- month = int(tm)
- return
-}
-
-// Clock gets gregorian hour, minute, and second like 13, 14, 15.
-// 获取公历时、分、秒
-func (g Gregorian) Clock() (hour, minute, second int) {
- if g.IsZero() {
- return 0, 0, 0
- }
- return g.Time.Clock()
-}
-
-// Year gets gregorian year like 2020.
-// 获取公历年
-func (g Gregorian) Year() int {
- if g.IsZero() {
- return 0
- }
- return g.Time.Year()
-}
-
-// Month gets gregorian month like 8.
-// 获取公历月,如 8
-func (g Gregorian) Month() int {
- if g.IsZero() {
- return 0
- }
- return int(g.Time.Month())
-}
-
-// Week gets gregorian week day like 0.
-// 获取周
-func (g Gregorian) Week() int {
- if g.IsZero() {
- return 0
- }
- return int(g.Time.Weekday())
-}
-
-// Day gets gregorian day like 5.
-// 获取公历日,如 0
-func (g Gregorian) Day() int {
- if g.IsZero() {
- return 0
- }
- return g.Time.Day()
-}
-
-// Hour gets gregorian hour like 13.
-// 获取公历小时,如 13
-func (g Gregorian) Hour() int {
- if g.IsZero() {
- return 0
- }
- return g.Time.Hour()
-}
-
-// Minute gets gregorian minute like 14.
-// 获取公历分钟数,如 14
-func (g Gregorian) Minute() int {
- if g.IsZero() {
- return 0
- }
- return g.Time.Minute()
-}
-
-// Second gets gregorian second like 15.
-// 获取公历秒数,如 15
-func (g Gregorian) Second() int {
- if g.IsZero() {
- return 0
- }
- return g.Time.Second()
-}
-
-// Location gets gregorian timezone information.
-// 获取时区信息
-func (g Gregorian) Location() *time.Location {
- return g.Time.Location()
-}
-
-// String implements Stringer interface and outputs a string in YYYY-MM-DD HH::ii::ss format like "2019-12-07 00:00:00".
-// 实现 Stringer 接口, 输出 YYYY-MM-DD HH::ii::ss 格式字符串,如 "2019-12-07 00:00:00"
-func (g Gregorian) String() string {
- if g.IsZero() {
+// String implements "Stringer" interface.
+func (g *Gregorian) String() string {
+ if g == nil {
return ""
}
- return g.Time.Format(DateTimeLayout)
-}
-
-// IsZero reports whether is zero time.
-// 是否是零值时间
-func (g Gregorian) IsZero() bool {
- return g.Time.IsZero()
-}
-
-// IsValid reports whether is a valid gregorian date.
-// 是否是有效的年份
-func (g Gregorian) IsValid() bool {
- if g.Year() >= MinValue().Year() && g.Year() <= MaxValue().Year() && g.Month() >= MinValue().Month() && g.Month() <= MaxValue().Month() && g.Day() >= MinValue().Day() && g.Day() <= MaxValue().Day() {
- return true
+ if g.Time.IsZero() {
+ return ""
}
- return false
-}
-
-// IsLeapYear reports whether is a leap year.
-// 是否是闰年
-func (g Gregorian) IsLeapYear() bool {
- if g.IsZero() {
- return false
- }
- year := g.Year()
- if year%400 == 0 || (year%4 == 0 && year%100 != 0) {
- return true
- }
- return false
+ return g.Time.String()
}
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/julian/julian.go b/vendor/github.com/dromara/carbon/v2/calendar/julian/julian.go
index 4cde2f28..b140d9b9 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/julian/julian.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar/julian/julian.go
@@ -11,39 +11,20 @@ import (
var (
// julian day or modified julian day decimal precision
- // 儒略日或简化儒略日小数精度
decimalPrecision = 6
// difference between Julian Day and Modified Julian Day
- // 儒略日和简化儒略日之间的差值
diffJdFromMjd = 2400000.5
)
-// Gregorian defines a Gregorian struct.
-// 定义 Gregorian 结构体
-type Gregorian struct {
- calendar.Gregorian
-}
-
// Julian defines a Julian struct.
-// 定义 Julian 结构体
type Julian struct {
jd, mjd float64
}
-// FromGregorian creates a Gregorian instance from time.Time.
-// 从标准 time.Time 创建 Gregorian 实例
-func FromGregorian(t time.Time) (g Gregorian) {
- if t.IsZero() {
- return
- }
- g.Time = t
- return g
-}
-
-// FromJulian creates a Julian instance from julian day or modified julian day.
-// 从 儒略日 或 简化儒略日 创建 Julian 实例
-func FromJulian(f float64) (j Julian) {
+// NewJulian returns a new Lunar instance.
+func NewJulian(f float64) (j *Julian) {
+ j = new(Julian)
// get length of the integer part
l := len(strconv.Itoa(int(math.Ceil(f))))
switch l {
@@ -62,15 +43,17 @@ func FromJulian(f float64) (j Julian) {
return
}
-// ToJulian converts Gregorian instance to Julian instance.
-// 将 Gregorian 实例转化为 Julian 实例
-func (g Gregorian) ToJulian() (j Julian) {
- if g.IsZero() {
- return
+// FromStdTime creates a Julian instance from standard time.Time.
+func FromStdTime(t time.Time) *Julian {
+ j := new(Julian)
+ if t.IsZero() {
+ j.jd = 1721423.5
+ j.mjd = -678577
+ return j
}
- y := g.Year()
- m := g.Month()
- d := float64(g.Day()) + ((float64(g.Second())/60+float64(g.Minute()))/60+float64(g.Hour()))/24
+ y := t.Year()
+ m := int(t.Month())
+ d := float64(t.Day()) + ((float64(t.Second())/60+float64(t.Minute()))/60+float64(t.Hour()))/24
n := 0
f := false
if y*372+m*31+int(d) >= 588829 {
@@ -85,14 +68,21 @@ func (g Gregorian) ToJulian() (j Julian) {
n = 2 - n + n/4
}
jd := float64(int(365.25*(float64(y)+4716))) + float64(int(30.6001*(float64(m)+1))) + d + float64(n) - 1524.5
- return FromJulian(jd)
+ return NewJulian(jd)
}
// ToGregorian converts Julian instance to Gregorian instance.
-// 将 Julian 实例转化为 Gregorian 实例
-func (j Julian) ToGregorian() (g Gregorian) {
- if j.IsZero() {
- return
+func (j *Julian) ToGregorian(timezone ...string) *calendar.Gregorian {
+ g := new(calendar.Gregorian)
+ if j == nil {
+ return nil
+ }
+ loc := time.UTC
+ if len(timezone) > 0 {
+ loc, g.Error = time.LoadLocation(timezone[0])
+ }
+ if g.Error != nil {
+ return g
}
d := int(j.jd + 0.5)
f := j.jd + 0.5 - float64(d)
@@ -123,38 +113,35 @@ func (j Julian) ToGregorian() (g Gregorian) {
f -= float64(minute)
f *= 60
second := int(math.Round(f))
- return FromGregorian(time.Date(year, time.Month(month), day, hour, minute, second, 0, time.Local))
+ g.Time = time.Date(year, time.Month(month), day, hour, minute, second, 0, loc)
+ return g
}
// JD gets julian day like 2460332.5
-// 获取儒略日
-func (j Julian) JD(precision ...int) float64 {
- if len(precision) > 0 {
- decimalPrecision = precision[0]
+func (j *Julian) JD(precision ...int) float64 {
+ if j == nil {
+ return 0
}
- return parseFloat64(j.jd, decimalPrecision)
+ p := decimalPrecision
+ if len(precision) > 0 {
+ p = precision[0]
+ }
+ return parseFloat64(j.jd, p)
}
// MJD gets modified julian day like 60332
-// 获取简化儒略日
-func (j Julian) MJD(precision ...int) float64 {
+func (j *Julian) MJD(precision ...int) float64 {
+ if j == nil {
+ return 0
+ }
+ p := decimalPrecision
if len(precision) > 0 {
- decimalPrecision = precision[0]
+ p = precision[0]
}
- return parseFloat64(j.mjd, decimalPrecision)
-}
-
-// IsZero reports whether is zero time.
-// 是否是零值时间
-func (j Julian) IsZero() bool {
- if j.jd == 0 || j.mjd == 0 {
- return true
- }
- return false
+ return parseFloat64(j.mjd, p)
}
// parseFloat64 round to n decimal places
-// 四舍五入保留 n 位小数点
func parseFloat64(f float64, n int) float64 {
p10 := math.Pow10(n)
return math.Round(f*p10) / p10
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.cn.md b/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.cn.md
index c792e535..171f765d 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.cn.md
+++ b/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.cn.md
@@ -10,40 +10,40 @@
```go
// 获取农历生肖
-carbon.Parse("2020-08-05 13:14:15").Lunar().Animal() // 鼠
+carbon.Parse("2020-08-05").Lunar().Animal() // 鼠
// 获取农历节日
-carbon.Parse("2021-02-12 13:14:15").Lunar().Festival() // 春节
+carbon.Parse("2021-02-12").Lunar().Festival() // 春节
// 获取农历年份
-carbon.Parse("2020-08-05 13:14:15").Lunar().Year() // 2020
+carbon.Parse("2020-08-05").Lunar().Year() // 2020
// 获取农历月份
-carbon.Parse("2020-08-05 13:14:15").Lunar().Month() // 6
+carbon.Parse("2020-08-05").Lunar().Month() // 6
// 获取农历闰月月份
-carbon.Parse("2020-08-05 13:14:15").Lunar().LeapMonth() // 4
+carbon.Parse("2020-08-05").Lunar().LeapMonth() // 4
// 获取农历日期
-carbon.Parse("2020-08-05 13:14:15").Lunar().Day() // 16
+carbon.Parse("2020-08-05").Lunar().Day() // 16
// 获取农历时辰
-carbon.Parse("2020-08-05 13:14:15").Lunar().Hour() // 13
+carbon.Parse("2020-08-05").Lunar().Hour() // 13
// 获取农历分钟
-carbon.Parse("2020-08-05 13:14:15").Lunar().Minute() // 14
+carbon.Parse("2020-08-05").Lunar().Minute() // 14
// 获取农历秒数
-carbon.Parse("2020-08-05 13:14:15").Lunar().Second() // 15
+carbon.Parse("2020-08-05").Lunar().Second() // 15
// 获取农历日期时间字符串
-carbon.Parse("2020-08-05 13:14:15").Lunar().String() // 2020-06-16 13:14:15
-fmt.Printf("%s", carbon.Parse("2020-08-05 13:14:15").Lunar()) // 2020-06-16 13:14:15
+carbon.Parse("2020-08-05").Lunar().String() // 2020-06-16
+fmt.Printf("%s", carbon.Parse("2020-08-05").Lunar()) // 2020-06-16
// 获取农历年字符串
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToYearString() // 二零二零
+carbon.Parse("2020-08-05").Lunar().ToYearString() // 二零二零
// 获取农历月字符串
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToMonthString() // 六月
+carbon.Parse("2020-08-05").Lunar().ToMonthString() // 六月
// 获取农历闰月字符串
-carbon.Parse("2020-04-23 13:14:15").Lunar().ToMonthString() // 闰四月
+carbon.Parse("2020-04-23").Lunar().ToMonthString() // 闰四月
// 获取农历周字符串
-carbon.Parse("2020-04-23 13:14:15").Lunar().ToWeekString() // 周四
+carbon.Parse("2020-04-23").Lunar().ToWeekString() // 周四
// 获取农历天字符串
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToDayString() // 十六
+carbon.Parse("2020-08-05").Lunar().ToDayString() // 十六
// 获取农历日期字符串
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToDateString() // 二零二零年六月十六
+carbon.Parse("2020-08-05").Lunar().ToDateString() // 二零二零年六月十六
```
@@ -51,11 +51,11 @@ carbon.Parse("2020-08-05 13:14:15").Lunar().ToDateString() // 二零二零年六
```go
// 将农历 二零二三年腊月十一 转化为 公历
-carbon.CreateFromLunar(2023, 12, 11, 0, 0, 0, false).ToDateTimeString() // 2024-01-21 00:00:00
+carbon.CreateFromLunar(2023, 12, 11, false).ToDateTimeString() // 2024-01-21 00:00:00
// 将农历 二零二三年二月十一 转化为 公历
-carbon.CreateFromLunar(2023, 2, 11, 0, 0, 0, false).ToDateTimeString() // 2023-03-02 00:00:00
+carbon.CreateFromLunar(2023, 2, 11, false).ToDateTimeString() // 2023-03-02 00:00:00
// 将农历 二零二三年闰二月十一 转化为 公历
-carbon.CreateFromLunar(2023, 2, 11, 0, 0, 0, true).ToDateTimeString() // 2023-04-01 00:00:00
+carbon.CreateFromLunar(2023, 2, 11, true).ToDateTimeString() // 2023-04-01 00:00:00
```
##### 日期判断
@@ -63,36 +63,36 @@ carbon.CreateFromLunar(2023, 2, 11, 0, 0, 0, true).ToDateTimeString() // 2023-04
```go
// 是否是合法农历日期
-carbon.Parse("0000-00-00 00:00:00").Lunar().IsValid() // false
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsValid() // true
+carbon.Parse("0000-00-00").Lunar().IsValid() // false
+carbon.Parse("2020-08-05").Lunar().IsValid() // true
// 是否是农历闰年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsLeapYear() // true
+carbon.Parse("2020-08-05").Lunar().IsLeapYear() // true
// 是否是农历闰月
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsLeapMonth() // false
+carbon.Parse("2020-08-05").Lunar().IsLeapMonth() // false
// 是否是鼠年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsRatYear() // true
+carbon.Parse("2020-08-05").Lunar().IsRatYear() // true
// 是否是牛年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsOxYear() // false
+carbon.Parse("2020-08-05").Lunar().IsOxYear() // false
// 是否是虎年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsTigerYear() // false
+carbon.Parse("2020-08-05").Lunar().IsTigerYear() // false
// 是否是兔年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsRabbitYear() // false
+carbon.Parse("2020-08-05").Lunar().IsRabbitYear() // false
// 是否是龙年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsDragonYear() // false
+carbon.Parse("2020-08-05").Lunar().IsDragonYear() // false
// 是否是蛇年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsSnakeYear() // false
+carbon.Parse("2020-08-05").Lunar().IsSnakeYear() // false
// 是否是马年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsHorseYear() // false
+carbon.Parse("2020-08-05").Lunar().IsHorseYear() // false
// 是否是羊年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsGoatYear() // false
+carbon.Parse("2020-08-05").Lunar().IsGoatYear() // false
// 是否是猴年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsMonkeyYear() // false
+carbon.Parse("2020-08-05").Lunar().IsMonkeyYear() // false
// 是否是鸡年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsRoosterYear() // false
+carbon.Parse("2020-08-05").Lunar().IsRoosterYear() // false
// 是否是狗年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsDogYear() // false
+carbon.Parse("2020-08-05").Lunar().IsDogYear() // false
// 是否是猪年
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsPigYear() // false
+carbon.Parse("2020-08-05").Lunar().IsPigYear() // false
```
\ No newline at end of file
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.jp.md b/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.jp.md
index 46011ad7..b9b87953 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.jp.md
+++ b/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.jp.md
@@ -10,40 +10,40 @@
```go
// 旧暦の干支を手に入れる
-carbon.Parse("2020-08-05 13:14:15").Lunar().Animal() // 鼠
+carbon.Parse("2020-08-05").Lunar().Animal() // 鼠
// 旧暦の祝日を取得する
-carbon.Parse("2021-02-12 13:14:15").Lunar().Festival() // 春节
+carbon.Parse("2021-02-12").Lunar().Festival() // 春节
// 旧正月の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().Year() // 2020
+carbon.Parse("2020-08-05").Lunar().Year() // 2020
// 旧暦月の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().Month() // 6
+carbon.Parse("2020-08-05").Lunar().Month() // 6
// 旧暦うるう月の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().LeapMonth() // 4
+carbon.Parse("2020-08-05").Lunar().LeapMonth() // 4
// 旧暦日の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().Day() // 16
+carbon.Parse("2020-08-05").Lunar().Day() // 16
// 旧暦時刻の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().Hour() // 13
+carbon.Parse("2020-08-05").Lunar().Hour() // 13
// 旧暦分の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().Minute() // 14
+carbon.Parse("2020-08-05").Lunar().Minute() // 14
// 旧暦の取得秒数
-carbon.Parse("2020-08-05 13:14:15").Lunar().Second() // 15
+carbon.Parse("2020-08-05").Lunar().Second() // 15
// 旧暦日時文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().String() // 2020-06-16 13:14:15
-fmt.Printf("%s", carbon.Parse("2020-08-05 13:14:15").Lunar()) // 2020-06-16 13:14:15
+carbon.Parse("2020-08-05").Lunar().String() // 2020-06-16
+fmt.Printf("%s", carbon.Parse("2020-08-05").Lunar()) // 2020-06-16
// 旧正月文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToYearString() // 二零二零
+carbon.Parse("2020-08-05").Lunar().ToYearString() // 二零二零
// 旧暦月文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToMonthString() // 六月
+carbon.Parse("2020-08-05").Lunar().ToMonthString() // 六月
// 旧暦うるう月文字列の取得
-carbon.Parse("2020-04-23 13:14:15").Lunar().ToMonthString() // 闰四月
+carbon.Parse("2020-04-23").Lunar().ToMonthString() // 闰四月
// 旧暦週文字列の取得
-carbon.Parse("2020-04-23 13:14:15").Lunar().ToWeekString() // 周四
+carbon.Parse("2020-04-23").Lunar().ToWeekString() // 周四
// 旧暦日文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToDayString() // 十六
+carbon.Parse("2020-08-05").Lunar().ToDayString() // 十六
// 旧暦日付文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToDateString() // 二零二零年六月十六
+carbon.Parse("2020-08-05").Lunar().ToDateString() // 二零二零年六月十六
```
@@ -61,37 +61,37 @@ carbon.CreateFromLunar(2023, 2, 11, 0, 0, 0, true).ToDateTimeString() // 2023-04
##### 日付判断
```go
// 合法的なペルシャ暦の日付かどうか
-carbon.Parse("0000-00-00 00:00:00").Lunar().IsValid() // false
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsValid() // true
+carbon.Parse("0000-00-00").Lunar().IsValid() // false
+carbon.Parse("2020-08-05").Lunar().IsValid() // true
// 旧暦うるう年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsLeapYear() // true
+carbon.Parse("2020-08-05").Lunar().IsLeapYear() // true
// 旧暦うるう月かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsLeapMonth() // false
+carbon.Parse("2020-08-05").Lunar().IsLeapMonth() // false
// ねずみ年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsRatYear() // true
+carbon.Parse("2020-08-05").Lunar().IsRatYear() // true
// 牛年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsOxYear() // false
+carbon.Parse("2020-08-05").Lunar().IsOxYear() // false
// 寅年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsTigerYear() // false
+carbon.Parse("2020-08-05").Lunar().IsTigerYear() // false
// うさぎ年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsRabbitYear() // false
+carbon.Parse("2020-08-05").Lunar().IsRabbitYear() // false
// 龍年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsDragonYear() // false
+carbon.Parse("2020-08-05").Lunar().IsDragonYear() // false
// 蛇の年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsSnakeYear() // false
+carbon.Parse("2020-08-05").Lunar().IsSnakeYear() // false
// 馬年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsHorseYear() // false
+carbon.Parse("2020-08-05").Lunar().IsHorseYear() // false
// 羊年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsGoatYear() // false
+carbon.Parse("2020-08-05").Lunar().IsGoatYear() // false
// 申年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsMonkeyYear() // false
+carbon.Parse("2020-08-05").Lunar().IsMonkeyYear() // false
// 鶏の年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsRoosterYear() // false
+carbon.Parse("2020-08-05").Lunar().IsRoosterYear() // false
// 犬年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsDogYear() // false
+carbon.Parse("2020-08-05").Lunar().IsDogYear() // false
// 豚年かどうか
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsPigYear() // false
+carbon.Parse("2020-08-05").Lunar().IsPigYear() // false
```
\ No newline at end of file
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.md b/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.md
index ad7b8b67..81971f96 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.md
+++ b/vendor/github.com/dromara/carbon/v2/calendar/lunar/README.md
@@ -12,38 +12,38 @@ English | [简体中文](README.cn.md) | [日本語](README.jp.md)
// Get Lunar year of animal
carbon.Parse("2020-08-05 13:14:15").Lunar().Animal() // 鼠
// Get lunar festival
-carbon.Parse("2021-02-12 13:14:15").Lunar().Festival() // 春节
+carbon.Parse("2021-02-12").Lunar().Festival() // 春节
// Get lunar year
-carbon.Parse("2020-08-05 13:14:15").Lunar().Year() // 2020
+carbon.Parse("2020-08-05").Lunar().Year() // 2020
// Get lunar month
-carbon.Parse("2020-08-05 13:14:15").Lunar().Month() // 6
+carbon.Parse("2020-08-05").Lunar().Month() // 6
// Get lunar leap month
-carbon.Parse("2020-08-05 13:14:15").Lunar().LeapMonth() // 4
+carbon.Parse("2020-08-05").Lunar().LeapMonth() // 4
// Get lunar day
-carbon.Parse("2020-08-05 13:14:15").Lunar().Day() // 16
+carbon.Parse("2020-08-05").Lunar().Day() // 16
// Get lunar hour
-carbon.Parse("2020-08-05 13:14:15").Lunar().Hour() // 13
+carbon.Parse("2020-08-05").Lunar().Hour() // 13
// Get lunar minute
-carbon.Parse("2020-08-05 13:14:15").Lunar().Minute() // 14
+carbon.Parse("2020-08-05").Lunar().Minute() // 14
// Get lunar second
-carbon.Parse("2020-08-05 13:14:15").Lunar().Second() // 15
+carbon.Parse("2020-08-05").Lunar().Second() // 15
// Get lunar date and time string
-carbon.Parse("2020-08-05 13:14:15").Lunar().String() // 2020-06-16 13:14:15
-fmt.Printf("%s", carbon.Parse("2020-08-05 13:14:15").Lunar()) // 2020-06-16 13:14:15
+carbon.Parse("2020-08-05").Lunar().String() // 2020-06-16
+fmt.Printf("%s", carbon.Parse("2020-08-05").Lunar()) // 2020-06-16
// Get lunar year as string
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToYearString() // 二零二零
+carbon.Parse("2020-08-05").Lunar().ToYearString() // 二零二零
// Get lunar month as string
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToMonthString() // 六月
+carbon.Parse("2020-08-05").Lunar().ToMonthString() // 六月
// Get lunar leap month as string
-carbon.Parse("2020-04-23 13:14:15").Lunar().ToMonthString() // 闰四月
+carbon.Parse("2020-04-23").Lunar().ToMonthString() // 闰四月
// Get lunar week as string
-carbon.Parse("2020-04-23 13:14:15").Lunar().ToWeekString() // 周四
+carbon.Parse("2020-04-23").Lunar().ToWeekString() // 周四
// Get lunar day as string
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToDayString() // 十六
+carbon.Parse("2020-08-05").Lunar().ToDayString() // 十六
// Get lunar date as string
-carbon.Parse("2020-08-05 13:14:15").Lunar().ToDateString() // 二零二零年六月十六
+carbon.Parse("2020-08-05").Lunar().ToDateString() // 二零二零年六月十六
```
@@ -61,37 +61,37 @@ carbon.CreateFromLunar(2023, 2, 11, 0, 0, 0, true).ToDateTimeString() // 2023-04
##### Comparison
```go
// Whether is a valid lunar date
-carbon.Parse("0000-00-00 00:00:00").Lunar().IsValid() // false
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsValid() // true
+carbon.Parse("0000-00-00").Lunar().IsValid() // false
+carbon.Parse("2020-08-05").Lunar().IsValid() // true
// Whether is a lunar leap year
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsLeapYear() // true
+carbon.Parse("2020-08-05").Lunar().IsLeapYear() // true
// Whether is a lunar leap month
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsLeapMonth() // false
+carbon.Parse("2020-08-05").Lunar().IsLeapMonth() // false
// Whether is a lunar year of the rat
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsRatYear() // true
+carbon.Parse("2020-08-05").Lunar().IsRatYear() // true
// Whether is a lunar year of the ox
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsOxYear() // false
+carbon.Parse("2020-08-05").Lunar().IsOxYear() // false
// Whether is a lunar year of the tiger
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsTigerYear() // false
+carbon.Parse("2020-08-05").Lunar().IsTigerYear() // false
// Whether is a lunar year of the rabbit
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsRabbitYear() // false
+carbon.Parse("2020-08-05").Lunar().IsRabbitYear() // false
// Whether is a lunar year of the dragon
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsDragonYear() // false
+carbon.Parse("2020-08-05").Lunar().IsDragonYear() // false
// Whether is a lunar year of the snake
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsSnakeYear() // false
+carbon.Parse("2020-08-05").Lunar().IsSnakeYear() // false
// Whether is a lunar year of the horse
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsHorseYear() // false
+carbon.Parse("2020-08-05").Lunar().IsHorseYear() // false
// Whether is a lunar year of the goat
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsGoatYear() // false
+carbon.Parse("2020-08-05").Lunar().IsGoatYear() // false
// Whether is a lunar year of the monkey
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsMonkeyYear() // false
+carbon.Parse("2020-08-05").Lunar().IsMonkeyYear() // false
// Whether is a lunar year of the rooster
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsRoosterYear() // false
+carbon.Parse("2020-08-05").Lunar().IsRoosterYear() // false
// Whether is a lunar year of the dog
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsDogYear() // false
+carbon.Parse("2020-08-05").Lunar().IsDogYear() // false
// Whether is a lunar year of the dig
-carbon.Parse("2020-08-05 13:14:15").Lunar().IsPigYear() // false
+carbon.Parse("2020-08-05").Lunar().IsPigYear() // false
```
\ No newline at end of file
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/lunar/lunar.go b/vendor/github.com/dromara/carbon/v2/calendar/lunar/lunar.go
index d32249a8..1b74b8a7 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/lunar/lunar.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar/lunar/lunar.go
@@ -54,86 +54,58 @@ var (
0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
0x0d520, // 2100
}
-
- InvalidDateError = func() error {
- return fmt.Errorf("invalid invalid date, please make sure the date is valid")
- }
)
-// Gregorian defines a Gregorian struct.
-// 定义 Gregorian 结构体
-type Gregorian struct {
- calendar.Gregorian
+// ErrInvalidLunar returns a invalid lunar date.
+var ErrInvalidLunar = func() error {
+ return fmt.Errorf("invalid lunar date, please make sure the lunar date is valid")
}
// Lunar defines a Lunar struct.
-// 定义 Lunar 结构体
type Lunar struct {
- year, month, day, hour, minute, second int
- isLeapMonth bool
- Error error
+ year, month, day int
+ isLeapMonth bool
+ Error error
+}
+
+// NewLunar returns a new Lunar instance.
+func NewLunar(year, month, day int, isLeapMonth bool) *Lunar {
+ l := new(Lunar)
+ l.year, l.month, l.day, l.isLeapMonth = year, month, day, isLeapMonth
+ if !l.IsValid() {
+ l.Error = ErrInvalidLunar()
+ }
+ return l
}
// MaxValue returns a Lunar instance for the greatest supported date.
-// 返回 Carbon 的最大值
-func MaxValue() Lunar {
- return Lunar{
- year: 2100,
- month: 12,
- day: 31,
- hour: 23,
- minute: 59,
- second: 59,
+func MaxValue() *Lunar {
+ return &Lunar{
+ year: 2100,
+ month: 12,
+ day: 31,
}
}
// MinValue returns a Lunar instance for the lowest supported date.
-// 返回 Lunar 的最小值
-func MinValue() Lunar {
- return Lunar{
- year: 1900,
- month: 1,
- day: 1,
- hour: 0,
- minute: 0,
- second: 0,
+func MinValue() *Lunar {
+ return &Lunar{
+ year: 1900,
+ month: 1,
+ day: 1,
}
}
-// FromGregorian creates a Gregorian instance from time.Time.
-// 从标准 time.Time 创建 Gregorian 实例
-func FromGregorian(t time.Time) (g Gregorian) {
+// FromStdTime creates a Lunar instance from standard time.Time.
+func FromStdTime(t time.Time) *Lunar {
+ l := new(Lunar)
if t.IsZero() {
- return
- }
- g.Time = t
- return
-}
-
-// FromLunar creates a Lunar instance from lunar datetime.
-// 从 农历日期 创建 Lunar 实例
-func FromLunar(year, month, day, hour, minute, second int, isLeapMonth bool) (l Lunar) {
- l.year, l.month, l.day = year, month, day
- l.hour, l.minute, l.second = hour, minute, second
- l.isLeapMonth = isLeapMonth
- if !l.IsValid() {
- l.Error = InvalidDateError()
- return
- }
- return
-}
-
-// ToLunar converts Gregorian instance to Lunar instance.
-// 将 Gregorian 实例转化为 Lunar 实例
-func (g Gregorian) ToLunar() (l Lunar) {
- if g.IsZero() {
- return
+ return nil
}
daysInYear, daysInMonth, leapMonth := 365, 30, 0
maxYear, minYear := MaxValue().year, MinValue().year
- // 与 1900-01-31 相差多少天
- offset := g.diffInDays(time.Date(minYear, 1, 31, 0, 0, 0, 0, g.Location()))
+ offset := int(t.Truncate(time.Hour).Sub(time.Date(minYear, 1, 31, 0, 0, 0, 0, t.Location())).Hours() / 24)
for l.year = minYear; l.year <= maxYear && offset > 0; l.year++ {
daysInYear = l.getDaysInYear()
offset -= daysInYear
@@ -156,7 +128,6 @@ func (g Gregorian) ToLunar() (l Lunar) {
l.isLeapMonth = false
}
}
- // offset为0时,并且刚才计算的月份是闰月,要校正
if offset == 0 && leapMonth > 0 && l.month == leapMonth+1 {
if l.isLeapMonth {
l.isLeapMonth = false
@@ -165,51 +136,51 @@ func (g Gregorian) ToLunar() (l Lunar) {
l.month--
}
}
- // offset小于0时,也要校正
if offset < 0 {
offset += daysInMonth
l.month--
}
l.day = offset + 1
- l.hour, l.minute, l.second = g.Clock()
- if !l.IsValid() {
- l.Error = InvalidDateError()
- return
- }
- return
+ return l
}
// ToGregorian converts Lunar instance to Gregorian instance.
-// 将 Lunar 实例转化为 Gregorian 实例
-func (l Lunar) ToGregorian() (g Gregorian) {
+func (l *Lunar) ToGregorian(timezone ...string) *calendar.Gregorian {
+ g := new(calendar.Gregorian)
if !l.IsValid() {
- return
+ return g
+ }
+ loc := time.UTC
+ if len(timezone) > 0 {
+ loc, g.Error = time.LoadLocation(timezone[0])
+ }
+ if g.Error != nil {
+ return g
}
days := l.getDaysInMonth()
offset := l.getOffsetInYear()
offset += l.getOffsetInMonth()
- // 转换闰月农历 需补充该年闰月的前一个月的时差
+
+ // add the time difference of the month before the leap month
if l.isLeapMonth {
offset += days
}
- // https://github.com/golang-module/carbon/issues/219
- ts := int64(offset+l.day)*86400 - int64(2206512000) + int64(l.hour)*3600 + int64(l.minute)*60 + int64(l.second)
- g.Time = time.Unix(ts, 0)
- return
+ // https://github.com/dromara/carbon/issues/219
+ ts := int64(offset+l.day)*86400 - int64(2206512000)
+ g.Time = time.Unix(ts, 0).In(loc)
+ return g
}
// Animal gets lunar animal name like "猴".
-// 获取农历生肖
-func (l Lunar) Animal() string {
+func (l *Lunar) Animal() string {
if !l.IsValid() {
return ""
}
- return animals[l.year%calendar.MonthsPerYear]
+ return animals[l.year%12]
}
// Festival gets lunar festival name like "春节".
-// 获取农历节日
-func (l Lunar) Festival() string {
+func (l *Lunar) Festival() string {
if !l.IsValid() {
return ""
}
@@ -217,97 +188,60 @@ func (l Lunar) Festival() string {
}
// Year gets lunar year like 2020.
-// 获取农历年份
-func (l Lunar) Year() int {
- if l.Error != nil {
+func (l *Lunar) Year() int {
+ if !l.IsValid() {
return 0
}
return l.year
}
// Month gets lunar month like 8.
-// 获取农历月份
-func (l Lunar) Month() int {
- if l.Error != nil {
+func (l *Lunar) Month() int {
+ if !l.IsValid() {
return 0
}
return l.month
}
// Day gets lunar day like 5.
-// 获取农历日,如 5
-func (l Lunar) Day() int {
- if l.Error != nil {
+func (l *Lunar) Day() int {
+ if !l.IsValid() {
return 0
}
return l.day
}
-// Hour gets current hour like 13.
-// 获取农历时辰
-func (l Lunar) Hour() int {
- if l.Error != nil {
- return 0
- }
- return l.hour
-}
-
-// Minute gets current minute like 14.
-// 获取农历分钟数
-func (l Lunar) Minute() int {
- if l.Error != nil {
- return 0
- }
- return l.minute
-}
-
-// Second gets current second like 15.
-// 获取农历秒数
-func (l Lunar) Second() int {
- if l.Error != nil {
- return 0
- }
- return l.second
-}
-
// LeapMonth gets lunar leap month like 2.
-// 获取农历闰月月份,如 2
-func (l Lunar) LeapMonth() int {
- if l.Error != nil {
+func (l *Lunar) LeapMonth() int {
+ if !l.IsValid() {
return 0
}
minYear := MinValue().year
- if l.year-minYear < 0 {
- return 0
- }
return years[l.year-minYear] & 0xf
}
-// String implements Stringer interface and outputs a string in YYYY-MM-DD HH::ii::ss format like "2019-12-07 00:00:00".
-// 实现 Stringer 接口, 输出 YYYY-MM-DD HH::ii::ss 格式字符串,如 "2019-12-07 00:00:00"
-func (l Lunar) String() string {
+// String implements "Stringer" interface for Lunar.
+func (l *Lunar) String() string {
if !l.IsValid() {
return ""
}
- return fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", l.year, l.month, l.day, l.hour, l.minute, l.second)
+ return fmt.Sprintf("%04d-%02d-%02d", l.year, l.month, l.day)
}
// ToYearString outputs a string in lunar year format like "二零二零".
-// 获取农历年份字符串,如 "二零二零"
-func (l Lunar) ToYearString() (year string) {
+func (l *Lunar) ToYearString() (year string) {
if !l.IsValid() {
return ""
}
year = fmt.Sprintf("%d", l.year)
- for index, number := range numbers {
- year = strings.Replace(year, fmt.Sprintf("%d", index), number, -1)
+ for i := range numbers {
+ year = strings.Replace(year, fmt.Sprintf("%d", i), numbers[i], -1)
}
return year
}
// ToMonthString outputs a string in lunar month format like "正月".
-// 获取农历月份字符串,如 "正月"
-func (l Lunar) ToMonthString() (month string) {
+func (l *Lunar) ToMonthString() (month string) {
if !l.IsValid() {
return ""
}
@@ -319,17 +253,15 @@ func (l Lunar) ToMonthString() (month string) {
}
// ToWeekString outputs a string in week layout like "周一".
-// 输出完整农历星期字符串,如 "周一"
-func (l Lunar) ToWeekString() (month string) {
+func (l *Lunar) ToWeekString() (month string) {
if !l.IsValid() {
return ""
}
- return weeks[l.ToGregorian().Week()]
+ return weeks[l.ToGregorian().Time.Weekday()]
}
// ToDayString outputs a string in lunar day format like "廿一".
-// 获取农历日字符串,如 "廿一"
-func (l Lunar) ToDayString() (day string) {
+func (l *Lunar) ToDayString() (day string) {
if !l.IsValid() {
return ""
}
@@ -353,7 +285,7 @@ func (l Lunar) ToDayString() (day string) {
// ToDateString outputs a string in lunar date format like "二零二零年腊月初五".
// 获取农历日期字符串,如 "二零二零年腊月初五"
-func (l Lunar) ToDateString() string {
+func (l *Lunar) ToDateString() string {
if !l.IsValid() {
return ""
}
@@ -362,182 +294,167 @@ func (l Lunar) ToDateString() string {
// IsValid reports whether is a valid lunar date.
// 是否是有效的年份
-func (l Lunar) IsValid() bool {
- if l.Year() >= MinValue().year && l.Year() <= MaxValue().year && l.month >= MinValue().month && l.month <= MaxValue().month && l.day >= MinValue().day && l.day <= MaxValue().day {
+func (l *Lunar) IsValid() bool {
+ if l == nil || l.Error != nil {
+ return false
+ }
+ if l.year >= MinValue().year && l.year <= MaxValue().year {
return true
}
return false
}
// IsLeapYear reports whether is a lunar leap year.
-// 是否是农历闰年
-func (l Lunar) IsLeapYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsLeapYear() bool {
+ if !l.IsValid() {
return false
}
return l.LeapMonth() != 0
}
// IsLeapMonth reports whether is a lunar leap month.
-// 是否是农历闰月
-func (l Lunar) IsLeapMonth() bool {
- if l.Error != nil {
+func (l *Lunar) IsLeapMonth() bool {
+ if !l.IsValid() {
return false
}
- return l.month == l.LeapMonth()
+ return l.isLeapMonth
}
// IsRatYear reports whether is lunar year of Rat.
-// 是否是鼠年
-func (l Lunar) IsRatYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsRatYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 4 {
+ if l.year%12 == 4 {
return true
}
return false
}
// IsOxYear reports whether is lunar year of Ox.
-// 是否是牛年
-func (l Lunar) IsOxYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsOxYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 5 {
+ if l.year%12 == 5 {
return true
}
return false
}
// IsTigerYear reports whether is lunar year of Tiger.
-// 是否是虎年
-func (l Lunar) IsTigerYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsTigerYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 6 {
+ if l.year%12 == 6 {
return true
}
return false
}
// IsRabbitYear reports whether is lunar year of Rabbit.
-// 是否是兔年
-func (l Lunar) IsRabbitYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsRabbitYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 7 {
+ if l.year%12 == 7 {
return true
}
return false
}
// IsDragonYear reports whether is lunar year of Dragon.
-// 是否是龙年
-func (l Lunar) IsDragonYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsDragonYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 8 {
+ if l.year%12 == 8 {
return true
}
return false
}
// IsSnakeYear reports whether is lunar year of Snake.
-// 是否是蛇年
-func (l Lunar) IsSnakeYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsSnakeYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 9 {
+ if l.year%12 == 9 {
return true
}
return false
}
// IsHorseYear reports whether is lunar year of Horse.
-// 是否是马年
-func (l Lunar) IsHorseYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsHorseYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 10 {
+ if l.year%12 == 10 {
return true
}
return false
}
// IsGoatYear reports whether is lunar year of Goat.
-// 是否是羊年
-func (l Lunar) IsGoatYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsGoatYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 11 {
+ if l.year%12 == 11 {
return true
}
return false
}
// IsMonkeyYear reports whether is lunar year of Monkey.
-// 是否是猴年
-func (l Lunar) IsMonkeyYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsMonkeyYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 0 {
+ if l.year%12 == 0 {
return true
}
return false
}
// IsRoosterYear reports whether is lunar year of Rooster.
-// 是否是鸡年
-func (l Lunar) IsRoosterYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsRoosterYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 1 {
+ if l.year%12 == 1 {
return true
}
return false
}
// IsDogYear reports whether is lunar year of Dog.
-// 是否是狗年
-func (l Lunar) IsDogYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsDogYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 2 {
+ if l.year%12 == 2 {
return true
}
return false
}
// IsPigYear reports whether is lunar year of Pig.
-// 是否是猪年
-func (l Lunar) IsPigYear() bool {
- if l.Error != nil {
+func (l *Lunar) IsPigYear() bool {
+ if !l.IsValid() {
return false
}
- if l.year%calendar.MonthsPerYear == 3 {
+ if l.year%12 == 3 {
return true
}
return false
}
-func (g Gregorian) diffInDays(t time.Time) int {
- return int(g.Time.Truncate(time.Hour).Sub(t).Hours() / 24)
-}
-
-func (l Lunar) getOffsetInYear() int {
+func (l *Lunar) getOffsetInYear() int {
flag := false
- clone, month, offset := l, 0, 0
+ clone, month, offset := *l, 0, 0
for month = 1; month < l.month; month++ {
leapMonth := l.LeapMonth()
if !flag {
@@ -553,8 +470,8 @@ func (l Lunar) getOffsetInYear() int {
return offset
}
-func (l Lunar) getOffsetInMonth() int {
- clone, year, offset := l, 0, 0
+func (l *Lunar) getOffsetInMonth() int {
+ clone, year, offset := *l, 0, 0
for year = MinValue().year; year < l.year; year++ {
clone.year = year
offset += clone.getDaysInYear()
@@ -562,7 +479,7 @@ func (l Lunar) getOffsetInMonth() int {
return offset
}
-func (l Lunar) getDaysInYear() int {
+func (l *Lunar) getDaysInYear() int {
var days = 348
for i := 0x8000; i > 0x8; i >>= 1 {
if (years[l.year-MinValue().year] & i) != 0 {
@@ -572,14 +489,14 @@ func (l Lunar) getDaysInYear() int {
return days + l.getDaysInLeapMonth()
}
-func (l Lunar) getDaysInMonth() int {
+func (l *Lunar) getDaysInMonth() int {
if (years[l.year-MinValue().year] & (0x10000 >> uint(l.month))) != 0 {
return 30
}
return 29
}
-func (l Lunar) getDaysInLeapMonth() int {
+func (l *Lunar) getDaysInLeapMonth() int {
if l.LeapMonth() == 0 {
return 0
}
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/persian/README.cn.md b/vendor/github.com/dromara/carbon/v2/calendar/persian/README.cn.md
index 16c9486d..57747ee7 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/persian/README.cn.md
+++ b/vendor/github.com/dromara/carbon/v2/calendar/persian/README.cn.md
@@ -8,67 +8,67 @@
```go
// 获取波斯历年份
-carbon.Parse("2020-08-05 13:14:15").Persian().Year() // 1399
+carbon.Parse("2020-08-05").Persian().Year() // 1399
// 获取波斯历月份
-carbon.Parse("2020-08-05 13:14:15").Persian().Month() // 5
+carbon.Parse("2020-08-05").Persian().Month() // 5
// 获取波斯历日期
-carbon.Parse("2020-08-05 13:14:15").Persian().Day() // 15
+carbon.Parse("2020-08-05").Persian().Day() // 15
// 获取波斯历小时
-carbon.Parse("2020-08-05 13:14:15").Persian().Hour() // 13
+carbon.Parse("2020-08-05").Persian().Hour() // 13
// 获取波斯历分钟
-carbon.Parse("2020-08-05 13:14:15").Persian().Minute() // 14
+carbon.Parse("2020-08-05").Persian().Minute() // 14
// 获取波斯历秒数
-carbon.Parse("2020-08-05 13:14:15").Persian().Second() // 15
+carbon.Parse("2020-08-05").Persian().Second() // 15
// 获取波斯历日期时间字符串
-carbon.Parse("2020-08-05 13:14:15").Persian().String() // 1399-05-15 13:14:15
-fmt.Printf("%s", carbon.Parse("2020-08-05 13:14:15").Persian()) // 1399-05-15 13:14:15
+carbon.Parse("2020-08-05").Persian().String() // 1399-05-15
+fmt.Printf("%s", carbon.Parse("2020-08-05").Persian()) // 1399-05-15
// 获取波斯历月字符串
-carbon.Parse("2020-08-05 13:14:15").Persian().ToMonthString() // Mordad
-carbon.Parse("2020-08-05 13:14:15").Persian().ToMonthString("en") // Mordad
-carbon.Parse("2020-08-05 13:14:15").Persian().ToMonthString("fa") // مرداد
+carbon.Parse("2020-08-05").Persian().ToMonthString() // Mordad
+carbon.Parse("2020-08-05").Persian().ToMonthString("en") // Mordad
+carbon.Parse("2020-08-05").Persian().ToMonthString("fa") // مرداد
// 获取简写波斯历月字符串
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortMonthString() // Mor
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortMonthString("en") // Mor
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortMonthString("fa") // مرد
+carbon.Parse("2020-08-05").Persian().ToShortMonthString() // Mor
+carbon.Parse("2020-08-05").Persian().ToShortMonthString("en") // Mor
+carbon.Parse("2020-08-05").Persian().ToShortMonthString("fa") // مرد
// 获取波斯历周字符串
-carbon.Parse("2020-08-05 13:14:15").Persian().ToWeekString() // Chaharshanbeh
-carbon.Parse("2020-08-05 13:14:15").Persian().ToWeekString("en") // Chaharshanbeh
-carbon.Parse("2020-08-05 13:14:15").Persian().ToWeekString("fa") // چهارشنبه
+carbon.Parse("2020-08-05").Persian().ToWeekString() // Chaharshanbeh
+carbon.Parse("2020-08-05").Persian().ToWeekString("en") // Chaharshanbeh
+carbon.Parse("2020-08-05").Persian().ToWeekString("fa") // چهارشنبه
// 获取简写波斯历周字符串
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortWeekString() // Cha
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortWeekString("en") // Cha
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortWeekString("fa") // د
+carbon.Parse("2020-08-05").Persian().ToShortWeekString() // Cha
+carbon.Parse("2020-08-05").Persian().ToShortWeekString("en") // Cha
+carbon.Parse("2020-08-05").Persian().ToShortWeekString("fa") // د
```
##### 将 `波斯历` 转化成 `公历`
```go
-carbon.CreateFromPersian(1, 1, 1, 0, 0, 0).ToDateTimeString() // 2016-03-20 00:00:00
-carbon.CreateFromPersian(622, 1, 1, 0, 0, 0).ToDateTimeString() // 1243-03-21 00:00:00
-carbon.CreateFromPersian(1395, 1, 1, 0, 0, 0).ToDateTimeString() // 2016-03-20 00:00:00
-carbon.CreateFromPersian(9377, 1, 1, 0, 0, 0).ToDateTimeString() // 9998-03-19 00:00:00
+carbon.CreateFromPersian(1, 1, 1).ToDateTimeString() // 2016-03-20 00:00:00
+carbon.CreateFromPersian(622, 1, 1).ToDateTimeString() // 1243-03-21 00:00:00
+carbon.CreateFromPersian(1395, 1, 1).ToDateTimeString() // 2016-03-20 00:00:00
+carbon.CreateFromPersian(9377, 1, 1).ToDateTimeString() // 9998-03-19 00:00:00
```
##### 日期判断
```go
// 是否是合法的波斯历日期
-carbon.CreateFromPersian(1, 1, 1, 0, 0, 0).IsValid() // true
-carbon.CreateFromPersian(622, 1, 1, 0, 0, 0).IsValid() // true
-carbon.CreateFromPersian(9377, 1, 1, 0, 0, 0).IsValid() // true
-carbon.CreateFromPersian(0, 0, 0, 0, 0, 0).IsValid() // false
-carbon.CreateFromPersian(2024, 0, 1, 0, 0, 0).IsValid() // false
-carbon.CreateFromPersian(2024, 1, 0, 0, 0, 0).IsValid() // false
+carbon.CreateFromPersian(1, 1, 1).IsValid() // true
+carbon.CreateFromPersian(622, 1, 1).IsValid() // true
+carbon.CreateFromPersian(9377, 1, 1).IsValid() // true
+carbon.CreateFromPersian(0, 0, 0, 0).IsValid() // false
+carbon.CreateFromPersian(2024, 0, 1).IsValid() // false
+carbon.CreateFromPersian(2024, 1, 0).IsValid() // false
// 是否是波斯历闰年
-carbon.CreateFromPersian(1395, 1, 1, 0, 0, 0).IsLeapYear() // true
-carbon.CreateFromPersian(9377, 1, 1, 0, 0, 0).IsLeapYear() // true
-carbon.CreateFromPersian(622, 1, 1, 0, 0, 0).IsLeapYear() // false
-carbon.CreateFromPersian(9999, 1, 1, 0, 0, 0).IsLeapYear() // false
+carbon.CreateFromPersian(1395, 1, 1).IsLeapYear() // true
+carbon.CreateFromPersian(9377, 1, 1).IsLeapYear() // true
+carbon.CreateFromPersian(622, 1, 1).IsLeapYear() // false
+carbon.CreateFromPersian(9999, 1, 1).IsLeapYear() // false
```
\ No newline at end of file
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/persian/README.jp.md b/vendor/github.com/dromara/carbon/v2/calendar/persian/README.jp.md
index c70a26ef..a5fce10e 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/persian/README.jp.md
+++ b/vendor/github.com/dromara/carbon/v2/calendar/persian/README.jp.md
@@ -8,66 +8,66 @@
```go
// ペルシャ暦の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().Year() // 1399
+carbon.Parse("2020-08-05").Persian().Year() // 1399
// ペルシャ暦月の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().Month() // 5
+carbon.Parse("2020-08-05").Persian().Month() // 5
// ペルシャ暦の取得日
-carbon.Parse("2020-08-05 13:14:15").Persian().Day() // 15
+carbon.Parse("2020-08-05").Persian().Day() // 15
// ペルシャ暦時間の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().Hour() // 13
+carbon.Parse("2020-08-05").Persian().Hour() // 13
// ペルシャ暦分の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().Minute() // 14
+carbon.Parse("2020-08-05").Persian().Minute() // 14
// ペルシャ暦秒の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().Second() // 15
+carbon.Parse("2020-08-05").Persian().Second() // 15
// ペルシャ暦日時文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().String() // 1399-05-15 13:14:15
-fmt.Printf("%s", carbon.Parse("2020-08-05 13:14:15").Persian()) // 1399-05-15 13:14:15
+carbon.Parse("2020-08-05").Persian().String() // 1399-05-15
+fmt.Printf("%s", carbon.Parse("2020-08-05").Persian()) // 1399-05-15
// ペルシア暦月文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().ToMonthString() // Mordad
-carbon.Parse("2020-08-05 13:14:15").Persian().ToMonthString("en") // Mordad
-carbon.Parse("2020-08-05 13:14:15").Persian().ToMonthString("fa") // مرداد
+carbon.Parse("2020-08-05").Persian().ToMonthString() // Mordad
+carbon.Parse("2020-08-05").Persian().ToMonthString("en") // Mordad
+carbon.Parse("2020-08-05").Persian().ToMonthString("fa") // مرداد
// 略語ペルシャ暦文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortMonthString() // Mor
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortMonthString("en") // Mor
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortMonthString("fa") // مرد
+carbon.Parse("2020-08-05").Persian().ToShortMonthString() // Mor
+carbon.Parse("2020-08-05").Persian().ToShortMonthString("en") // Mor
+carbon.Parse("2020-08-05").Persian().ToShortMonthString("fa") // مرد
// ペルシャ暦週文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().ToWeekString() // Chaharshanbeh
-carbon.Parse("2020-08-05 13:14:15").Persian().ToWeekString("en") // Chaharshanbeh
-carbon.Parse("2020-08-05 13:14:15").Persian().ToWeekString("fa") // چهارشنبه
+carbon.Parse("2020-08-05").Persian().ToWeekString() // Chaharshanbeh
+carbon.Parse("2020-08-05").Persian().ToWeekString("en") // Chaharshanbeh
+carbon.Parse("2020-08-05").Persian().ToWeekString("fa") // چهارشنبه
// 略語ペルシャ暦週文字列の取得
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortWeekString() // Cha
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortWeekString("en") // Cha
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortWeekString("fa") // د
+carbon.Parse("2020-08-05").Persian().ToShortWeekString() // Cha
+carbon.Parse("2020-08-05").Persian().ToShortWeekString("en") // Cha
+carbon.Parse("2020-08-05").Persian().ToShortWeekString("fa") // د
```
##### ペルシャ暦を西暦に変換する
```go
-carbon.CreateFromPersian(1, 1, 1, 0, 0, 0).ToDateTimeString() // 2016-03-20 00:00:00
-carbon.CreateFromPersian(622, 1, 1, 0, 0, 0).ToDateTimeString() // 1243-03-21 00:00:00
-carbon.CreateFromPersian(1395, 1, 1, 0, 0, 0).ToDateTimeString() // 2016-03-20 00:00:00
-carbon.CreateFromPersian(9377, 1, 1, 0, 0, 0).ToDateTimeString() // 9998-03-19 00:00:00
+carbon.CreateFromPersian(1, 1, 1).ToDateTimeString() // 2016-03-20 00:00:00
+carbon.CreateFromPersian(622, 1, 1).ToDateTimeString() // 1243-03-21 00:00:00
+carbon.CreateFromPersian(1395, 1, 1).ToDateTimeString() // 2016-03-20 00:00:00
+carbon.CreateFromPersian(9377, 1, 1).ToDateTimeString() // 9998-03-19 00:00:00
```
##### 日付判断
```go
// 合法的なペルシャ暦の日付かどうか
-carbon.CreateFromPersian(1, 1, 1, 0, 0, 0).IsValid() // true
-carbon.CreateFromPersian(622, 1, 1, 0, 0, 0).IsValid() // true
-carbon.CreateFromPersian(9377, 1, 1, 0, 0, 0).IsValid() // true
-carbon.CreateFromPersian(0, 0, 0, 0, 0, 0).IsValid() // false
-carbon.CreateFromPersian(2024, 0, 1, 0, 0, 0).IsValid() // false
-carbon.CreateFromPersian(2024, 1, 0, 0, 0, 0).IsValid() // false
+carbon.CreateFromPersian(1, 1, 1).IsValid() // true
+carbon.CreateFromPersian(622, 1, 1).IsValid() // true
+carbon.CreateFromPersian(9377, 1, 1).IsValid() // true
+carbon.CreateFromPersian(0, 0, 0, 0).IsValid() // false
+carbon.CreateFromPersian(2024, 0, 1).IsValid() // false
+carbon.CreateFromPersian(2024, 1, 0).IsValid() // false
// ペルシア暦閏年かどうか
-carbon.CreateFromPersian(1395, 1, 1, 0, 0, 0).IsLeapYear() // true
-carbon.CreateFromPersian(9377, 1, 1, 0, 0, 0).IsLeapYear() // true
-carbon.CreateFromPersian(622, 1, 1, 0, 0, 0).IsLeapYear() // false
-carbon.CreateFromPersian(9999, 1, 1, 0, 0, 0).IsLeapYear() // false
+carbon.CreateFromPersian(1395, 1, 1).IsLeapYear() // true
+carbon.CreateFromPersian(9377, 1, 1).IsLeapYear() // true
+carbon.CreateFromPersian(622, 1, 1).IsLeapYear() // false
+carbon.CreateFromPersian(9999, 1, 1).IsLeapYear() // false
```
\ No newline at end of file
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/persian/README.md b/vendor/github.com/dromara/carbon/v2/calendar/persian/README.md
index d5cf8255..299136c4 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/persian/README.md
+++ b/vendor/github.com/dromara/carbon/v2/calendar/persian/README.md
@@ -8,67 +8,67 @@ English | [简体中文](README.cn.md) | [日本語](README.jp.md)
```go
// Get persian year
-carbon.Parse("2020-08-05 13:14:15").Persian().Year() // 1399
+carbon.Parse("2020-08-05").Persian().Year() // 1399
// Get persian month
-carbon.Parse("2020-08-05 13:14:15").Persian().Month() // 5
+carbon.Parse("2020-08-05").Persian().Month() // 5
// Get persian day
-carbon.Parse("2020-08-05 13:14:15").Persian().Day() // 15
+carbon.Parse("2020-08-05").Persian().Day() // 15
// Get persian hour
-carbon.Parse("2020-08-05 13:14:15").Persian().Hour() // 13
+carbon.Parse("2020-08-05").Persian().Hour() // 13
// Get persian minute
-carbon.Parse("2020-08-05 13:14:15").Persian().Minute() // 14
+carbon.Parse("2020-08-05").Persian().Minute() // 14
// Get persian second
-carbon.Parse("2020-08-05 13:14:15").Persian().Second() // 15
+carbon.Parse("2020-08-05").Persian().Second() // 15
// Get persian date and time string
-carbon.Parse("2020-08-05 13:14:15").Persian().String() // 1399-05-15 13:14:15
-fmt.Printf("%s", carbon.Parse("2020-08-05 13:14:15").Persian()) // 1399-05-15 13:14:15
+carbon.Parse("2020-08-05").Persian().String() // 1399-05-15
+fmt.Printf("%s", carbon.Parse("2020-08-05").Persian()) // 1399-05-15
// Get persian month as string
-carbon.Parse("2020-08-05 13:14:15").Persian().ToMonthString() // Mordad
-carbon.Parse("2020-08-05 13:14:15").Persian().ToMonthString("en") // Mordad
-carbon.Parse("2020-08-05 13:14:15").Persian().ToMonthString("fa") // مرداد
+carbon.Parse("2020-08-05").Persian().ToMonthString() // Mordad
+carbon.Parse("2020-08-05").Persian().ToMonthString("en") // Mordad
+carbon.Parse("2020-08-05").Persian().ToMonthString("fa") // مرداد
// Get persian short month as string
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortMonthString() // Mor
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortMonthString("en") // Mor
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortMonthString("fa") // مرد
+carbon.Parse("2020-08-05").Persian().ToShortMonthString() // Mor
+carbon.Parse("2020-08-05").Persian().ToShortMonthString("en") // Mor
+carbon.Parse("2020-08-05").Persian().ToShortMonthString("fa") // مرد
// Get persian week as string
-carbon.Parse("2020-08-05 13:14:15").Persian().ToWeekString() // Chaharshanbeh
-carbon.Parse("2020-08-05 13:14:15").Persian().ToWeekString("en") // Chaharshanbeh
-carbon.Parse("2020-08-05 13:14:15").Persian().ToWeekString("fa") // چهارشنبه
+carbon.Parse("2020-08-05").Persian().ToWeekString() // Chaharshanbeh
+carbon.Parse("2020-08-05").Persian().ToWeekString("en") // Chaharshanbeh
+carbon.Parse("2020-08-05").Persian().ToWeekString("fa") // چهارشنبه
// Get persian short week as string
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortWeekString() // Cha
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortWeekString("en") // Cha
-carbon.Parse("2020-08-05 13:14:15").Persian().ToShortWeekString("fa") // د
+carbon.Parse("2020-08-05").Persian().ToShortWeekString() // Cha
+carbon.Parse("2020-08-05").Persian().ToShortWeekString("en") // Cha
+carbon.Parse("2020-08-05").Persian().ToShortWeekString("fa") // د
```
##### Convert `Persian` calendar to `Gregorian` calendar
```go
-carbon.CreateFromPersian(1, 1, 1, 0, 0, 0).ToDateTimeString() // 2016-03-20 00:00:00
-carbon.CreateFromPersian(622, 1, 1, 0, 0, 0).ToDateTimeString() // 1243-03-21 00:00:00
-carbon.CreateFromPersian(1395, 1, 1, 0, 0, 0).ToDateTimeString() // 2016-03-20 00:00:00
-carbon.CreateFromPersian(9377, 1, 1, 0, 0, 0).ToDateTimeString() // 9998-03-19 00:00:00
+carbon.CreateFromPersian(1, 1, 1).ToDateTimeString() // 2016-03-20 00:00:00
+carbon.CreateFromPersian(622, 1, 1).ToDateTimeString() // 1243-03-21 00:00:00
+carbon.CreateFromPersian(1395, 1, 1).ToDateTimeString() // 2016-03-20 00:00:00
+carbon.CreateFromPersian(9377, 1, 1).ToDateTimeString() // 9998-03-19 00:00:00
```
##### Comparison
```go
// Whether is a valid persian date
-carbon.CreateFromPersian(1, 1, 1, 0, 0, 0).IsValid() // true
-carbon.CreateFromPersian(622, 1, 1, 0, 0, 0).IsValid() // true
-carbon.CreateFromPersian(9377, 1, 1, 0, 0, 0).IsValid() // true
-carbon.CreateFromPersian(0, 0, 0, 0, 0, 0).IsValid() // false
-carbon.CreateFromPersian(2024, 0, 1, 0, 0, 0).IsValid() // false
-carbon.CreateFromPersian(2024, 1, 0, 0, 0, 0).IsValid() // false
+carbon.CreateFromPersian(1, 1, 1).IsValid() // true
+carbon.CreateFromPersian(622, 1, 1).IsValid() // true
+carbon.CreateFromPersian(9377, 1, 1).IsValid() // true
+carbon.CreateFromPersian(0, 0, 0, 0).IsValid() // false
+carbon.CreateFromPersian(2024, 0, 1).IsValid() // false
+carbon.CreateFromPersian(2024, 1, 0).IsValid() // false
// Whether is a persian leap year
-carbon.CreateFromPersian(1395, 1, 1, 0, 0, 0).IsLeapYear() // true
-carbon.CreateFromPersian(9377, 1, 1, 0, 0, 0).IsLeapYear() // true
-carbon.CreateFromPersian(622, 1, 1, 0, 0, 0).IsLeapYear() // false
-carbon.CreateFromPersian(9999, 1, 1, 0, 0, 0).IsLeapYear() // false
+carbon.CreateFromPersian(1395, 1, 1).IsLeapYear() // true
+carbon.CreateFromPersian(9377, 1, 1).IsLeapYear() // true
+carbon.CreateFromPersian(622, 1, 1).IsLeapYear() // false
+carbon.CreateFromPersian(9999, 1, 1).IsLeapYear() // false
```
\ No newline at end of file
diff --git a/vendor/github.com/dromara/carbon/v2/calendar/persian/persian.go b/vendor/github.com/dromara/carbon/v2/calendar/persian/persian.go
index 8b2b7ae0..d0fd348f 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/persian/persian.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar/persian/persian.go
@@ -10,6 +10,13 @@ import (
"github.com/dromara/carbon/v2/calendar/julian"
)
+type Locale string
+
+const EnLocale Locale = "en"
+const FaLocale Locale = "fa"
+
+const defaultLocale = EnLocale
+
var (
EnMonths = []string{"Farvardin", "Ordibehesht", "Khordad", "Tir", "Mordad", "Shahrivar", "Mehr", "Aban", "Azar", "Dey", "Bahman", "Esfand"}
ShortEnMonths = []string{"Far", "Ord", "Kho", "Tir", "Mor", "Sha", "Meh", "Aba", "Aza", "Dey", "Bah", "Esf"}
@@ -22,78 +29,54 @@ var (
FaWeeks = []string{"نجشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"}
ShortFaWeeks = []string{"پ", "چ", "س", "د", "ی", "ش", "ج"}
-
- InvalidDateError = func() error {
- return fmt.Errorf("invalid persian date, please make sure the date is valid")
- }
)
-// Gregorian defines a Gregorian struct.
-// 定义 Gregorian 结构体
-type Gregorian struct {
- calendar.Gregorian
+// ErrInvalidPersian returns a invalid persian date.
+var ErrInvalidPersian = func() error {
+ return fmt.Errorf("invalid persian date, please make sure the persian date is valid")
}
// Persian defines a Persian struct.
-// 定义 Persian 结构体
type Persian struct {
- year, month, day, hour, minute, second int
- Error error
+ year, month, day int
+ Error error
+}
+
+// NewPersian returns a new Persian instance.
+func NewPersian(year, month, day int) *Persian {
+ p := new(Persian)
+ p.year, p.month, p.day = year, month, day
+ if !p.IsValid() {
+ p.Error = ErrInvalidPersian()
+ }
+ return p
}
// MaxValue returns a Persian instance for the greatest supported date.
-// 返回 Persian 的最大值
-func MaxValue() Persian {
- return Persian{
- year: 9377,
- month: 12,
- day: 31,
- hour: 23,
- minute: 59,
- second: 59,
+func MaxValue() *Persian {
+ return &Persian{
+ year: 9377,
+ month: 12,
+ day: 31,
}
}
// MinValue returns a Persian instance for the lowest supported date.
-// 返回 Persian 的最小值
-func MinValue() Persian {
- return Persian{
- year: 1,
- month: 1,
- day: 1,
- hour: 0,
- minute: 0,
- second: 0,
+func MinValue() *Persian {
+ return &Persian{
+ year: 1,
+ month: 1,
+ day: 1,
}
}
-// FromGregorian creates a Gregorian instance from time.Time.
-// 从标准 time.Time 创建 Gregorian 实例
-func FromGregorian(t time.Time) (g Gregorian) {
+// FromStdTime creates a Persian instance from standard time.Time.
+func FromStdTime(t time.Time) *Persian {
+ p := new(Persian)
if t.IsZero() {
- return
+ return nil
}
- g.Time = t
- return
-}
-
-// FromPersian creates a Persian instance from persian datetime.
-// 从 波斯日期 创建 Persian 实例
-func FromPersian(year, month, day, hour, minute, second int) (p Persian) {
- p.year, p.month, p.day = year, month, day
- p.hour, p.minute, p.second = hour, minute, second
- if !p.IsValid() {
- p.Error = InvalidDateError()
- return
- }
- return
-}
-
-// ToPersian converts Gregorian instance to Persian instance.
-// 将 Gregorian 实例转化为 Persian 实例
-func (g Gregorian) ToPersian() (p Persian) {
- p.hour, p.minute, p.second = g.Hour(), g.Minute(), g.Second()
- gjdn := getGregorianJdn(g.Year(), g.Month(), g.Day())
+ gjdn := int(julian.FromStdTime(time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())).JD(0))
pjdn := getPersianJdn(475, 1, 1)
diff := gjdn - pjdn
@@ -109,21 +92,23 @@ func (g Gregorian) ToPersian() (p Persian) {
}
pjdn = getPersianJdn(p.year, p.month, 1)
p.day = gjdn - pjdn + 1
- if !p.IsValid() {
- p.Error = InvalidDateError()
- return
- }
- return
+ return p
}
// ToGregorian converts Persian instance to Gregorian instance.
-// 将 Persian 实例转化为 Gregorian 实例
-func (p Persian) ToGregorian() (g Gregorian) {
+func (p *Persian) ToGregorian(timezone ...string) *calendar.Gregorian {
+ g := new(calendar.Gregorian)
if !p.IsValid() {
- return
+ return g
+ }
+ loc := time.UTC
+ if len(timezone) > 0 {
+ loc, g.Error = time.LoadLocation(timezone[0])
+ }
+ if g.Error != nil {
+ return g
}
jdn := getPersianJdn(p.year, p.month, p.day)
-
l := jdn + 68569
n := 4 * l / 146097
l = l - (146097*n+3)/4
@@ -135,161 +120,129 @@ func (p Persian) ToGregorian() (g Gregorian) {
m := j + 2 - 12*l
y := 100*(n-49) + i + l
- g.Time = time.Date(y, time.Month(m), d, p.hour, p.minute, p.second, 0, time.Local)
- return
+ g.Time = time.Date(y, time.Month(m), d, 0, 0, 0, 0, loc)
+ return g
}
// Year gets lunar year like 2020.
-// 获取年份,如 2020
-func (p Persian) Year() int {
- if p.Error != nil {
+func (p *Persian) Year() int {
+ if !p.IsValid() {
return 0
}
return p.year
}
// Month gets lunar month like 8.
-// 获取月份,如 8
-func (p Persian) Month() int {
- if p.Error != nil {
+func (p *Persian) Month() int {
+ if !p.IsValid() {
return 0
}
return p.month
}
// Day gets lunar day like 5.
-// 获取日,如 5
-func (p Persian) Day() int {
- if p.Error != nil {
+func (p *Persian) Day() int {
+ if !p.IsValid() {
return 0
}
return p.day
}
-// Hour gets current hour like 13.
-// 获取小时,如 13
-func (p Persian) Hour() int {
- if p.Error != nil {
- return 0
- }
- return p.hour
-}
-
-// Minute gets current minute like 14.
-// 获取分钟数,如 14
-func (p Persian) Minute() int {
- if p.Error != nil {
- return 0
- }
- return p.minute
-}
-
-// Second gets current second like 15.
-// 获取秒数,如 15
-func (p Persian) Second() int {
- if p.Error != nil {
- return 0
- }
- return p.second
-}
-
-// String implements Stringer interface and outputs a string in YYYY-MM-DD HH::ii::ss format like "1402-11-11 00:00:00".
-// 实现 Stringer 接口, 输出 YYYY-MM-DD HH::ii::ss 格式字符串,如 "1402-11-11 00:00:00"
-func (p Persian) String() string {
+// String implements "Stringer" interface for Persian.
+func (p *Persian) String() string {
if !p.IsValid() {
return ""
}
- return fmt.Sprintf("%d-%02d-%02d %02d:%02d:%02d", p.year, p.month, p.day, p.hour, p.minute, p.second)
+ return fmt.Sprintf("%04d-%02d-%02d", p.year, p.month, p.day)
}
// ToMonthString outputs a string in persian month format like "فروردین".
-// 获取完整月份字符串,如 "فروردین"
-func (p Persian) ToMonthString(locale ...string) (month string) {
+func (p *Persian) ToMonthString(locale ...Locale) (month string) {
if !p.IsValid() {
return ""
}
- loc := "en"
+ loc := defaultLocale
if len(locale) > 0 {
loc = locale[0]
}
switch loc {
- case "en":
+ case EnLocale:
return EnMonths[p.month-1]
- case "fa":
+ case FaLocale:
return FaMonths[p.month-1]
}
return ""
}
// ToShortMonthString outputs a short string in persian month format like "فروردین".
-// 获取缩写月份字符串,如 "فروردین"
-func (p Persian) ToShortMonthString(locale ...string) (month string) {
+func (p *Persian) ToShortMonthString(locale ...Locale) (month string) {
if !p.IsValid() {
return ""
}
- loc := "en"
+ loc := defaultLocale
if len(locale) > 0 {
loc = locale[0]
}
switch loc {
- case "en":
+ case EnLocale:
return ShortEnMonths[p.month-1]
- case "fa":
+ case FaLocale:
return ShortFaMonths[p.month-1]
}
return ""
}
// ToWeekString outputs a string in week layout like "چهارشنبه".
-// 输出完整星期字符串,如 "چهارشنبه"
-func (p Persian) ToWeekString(locale ...string) (month string) {
+func (p *Persian) ToWeekString(locale ...Locale) (month string) {
if !p.IsValid() {
return ""
}
- loc := "en"
+ loc := defaultLocale
if len(locale) > 0 {
loc = locale[0]
}
+ week := p.ToGregorian().Time.Weekday()
switch loc {
- case "en":
- return EnWeeks[p.ToGregorian().Week()]
- case "fa":
- return FaWeeks[p.ToGregorian().Week()]
+ case EnLocale:
+ return EnWeeks[week]
+ case FaLocale:
+ return FaWeeks[week]
}
return ""
}
// ToShortWeekString outputs a short string in week layout like "چهارشنبه".
-// 输出缩写星期字符串,如 "چهارشنبه"
-func (p Persian) ToShortWeekString(locale ...string) (month string) {
+func (p *Persian) ToShortWeekString(locale ...Locale) (month string) {
if !p.IsValid() {
return ""
}
- loc := "en"
+ loc := defaultLocale
if len(locale) > 0 {
loc = locale[0]
}
+ week := p.ToGregorian().Time.Weekday()
switch loc {
- case "en":
- return ShortEnWeeks[p.ToGregorian().Week()]
- case "fa":
- return ShortFaWeeks[p.ToGregorian().Week()]
+ case EnLocale:
+ return ShortEnWeeks[week]
+ case FaLocale:
+ return ShortFaWeeks[week]
}
return ""
}
// IsValid reports whether is a valid persian date.
-// 是否是有效的日期
-func (p Persian) IsValid() bool {
- if p.Year() >= MinValue().year && p.Year() <= MaxValue().year && p.month >= MinValue().month && p.month <= MaxValue().month && p.day >= MinValue().day && p.day <= MaxValue().day {
+func (p *Persian) IsValid() bool {
+ if p == nil || p.Error != nil {
+ return false
+ }
+ if p.year >= MinValue().year && p.year <= MaxValue().year {
return true
}
return false
}
// IsLeapYear reports whether is a persian leap year.
-// 是否是闰年
-func (p Persian) IsLeapYear() bool {
+func (p *Persian) IsLeapYear() bool {
if !p.IsValid() {
return false
}
@@ -297,7 +250,6 @@ func (p Persian) IsLeapYear() bool {
}
// gets Julian day number in Persian calendar
-// 获取波斯历儒略日计数
func getPersianJdn(year, month, day int) int {
year = year - 473
if year >= 0 {
@@ -312,10 +264,3 @@ func getPersianJdn(year, month, day int) int {
}
return day + md + (epy*682-110)/2816 + (epy-1)*365 + year/2820*1029983 + 1948320
}
-
-// gets Julian day number in Gregorian calendar
-// 获取公历儒略日计数
-func getGregorianJdn(year, month, day int) int {
- jdn := julian.FromGregorian(time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.Local)).ToJulian().JD(0)
- return int(jdn)
-}
diff --git a/vendor/github.com/dromara/carbon/v2/carbon.go b/vendor/github.com/dromara/carbon/v2/carbon.go
index 321e0842..7adf675c 100644
--- a/vendor/github.com/dromara/carbon/v2/carbon.go
+++ b/vendor/github.com/dromara/carbon/v2/carbon.go
@@ -1,483 +1,63 @@
// @Package carbon
-// @Description a simple, semantic and developer-friendly golang package for datetime
+// @Description a simple, semantic and developer-friendly time package for golang
// @Page github.com/dromara/carbon
// @Developer gouguoyin
// @Blog www.gouguoyin.com
// @Email 245629560@qq.com
-// Package carbon is a simple, semantic and developer-friendly golang package for datetime.
+// Package carbon is a simple, semantic and developer-friendly time package for golang.
package carbon
import (
"time"
)
-// Version current version
-// 当前版本号
-const Version = "2.5.2"
-
-// timezone constants
-// 时区常量
-const (
- Local = "Local" // 本地时间
- UTC = "UTC" // 世界协调时间
- GMT = "GMT" // 格林尼治标准时间
- CST = "CST" // 中国标准时间
- EET = "EET" // 欧洲东部标准时间
- WET = "WET" // 欧洲西部标准时间
- CET = "CET" // 欧洲中部标准时间
- EST = "EST" // 美国东部标准时间
- MST = "MST" // 美国山地标准时间
-
- Cuba = "Cuba" // 古巴
- Egypt = "Egypt" // 埃及
- Eire = "Eire" // 爱尔兰
- Greenwich = "Greenwich" // 格林尼治
- Iceland = "Iceland" // 冰岛
- Iran = "Iran" // 伊朗
- Israel = "Israel" // 以色列
- Jamaica = "Jamaica" // 牙买加
- Japan = "Japan" // 日本
- Libya = "Libya" // 利比亚
- Poland = "Poland" // 波兰
- Portugal = "Portugal" // 葡萄牙
- PRC = "PRC" // 中国
- Singapore = "Singapore" // 新加坡
- Turkey = "Turkey" // 土耳其
-
- Shanghai = "Asia/Shanghai" // 上海
- Chongqing = "Asia/Chongqing" // 重庆
- Harbin = "Asia/Harbin" // 哈尔滨
- Urumqi = "Asia/Urumqi" // 乌鲁木齐
- HongKong = "Asia/Hong_Kong" // 香港
- Macao = "Asia/Macao" // 澳门
- Taipei = "Asia/Taipei" // 台北
- Tokyo = "Asia/Tokyo" // 东京
- HoChiMinh = "Asia/Ho_Chi_Minh" // 胡志明
- Hanoi = "Asia/Hanoi" // 河内
- Saigon = "Asia/Saigon" // 西贡
- Seoul = "Asia/Seoul" // 首尔
- Pyongyang = "Asia/Pyongyang" // 平壤
- Bangkok = "Asia/Bangkok" // 曼谷
- Dubai = "Asia/Dubai" // 迪拜
- Qatar = "Asia/Qatar" // 卡塔尔
- Bangalore = "Asia/Bangalore" // 班加罗尔
- Kolkata = "Asia/Kolkata" // 加尔各答
- Mumbai = "Asia/Mumbai" // 孟买
- MexicoCity = "America/Mexico_City" // 墨西哥
- NewYork = "America/New_York" // 纽约
- LosAngeles = "America/Los_Angeles" // 洛杉矶
- Chicago = "America/Chicago" // 芝加哥
- SaoPaulo = "America/Sao_Paulo" // 圣保罗
- Moscow = "Europe/Moscow" // 莫斯科
- London = "Europe/London" // 伦敦
- Berlin = "Europe/Berlin" // 柏林
- Paris = "Europe/Paris" // 巴黎
- Rome = "Europe/Rome" // 罗马
- Sydney = "Australia/Sydney" // 悉尼
- Melbourne = "Australia/Melbourne" // 墨尔本
- Darwin = "Australia/Darwin" // 达尔文
-)
-
-// month constants
-// 月份常量
-const (
- January = "January" // 一月
- February = "February" // 二月
- March = "March" // 三月
- April = "April" // 四月
- May = "May" // 五月
- June = "June" // 六月
- July = "July" // 七月
- August = "August" // 八月
- September = "September" // 九月
- October = "October" // 十月
- November = "November" // 十一月
- December = "December" // 十二月
-)
-
-// week constants
-// 星期常量
-const (
- Monday = "Monday" // 周一
- Tuesday = "Tuesday" // 周二
- Wednesday = "Wednesday" // 周三
- Thursday = "Thursday" // 周四
- Friday = "Friday" // 周五
- Saturday = "Saturday" // 周六
- Sunday = "Sunday" // 周日
-)
-
-// number constants
-// 数字常量
-const (
- YearsPerMillennium = 1000 // 每千年1000年
- YearsPerCentury = 100 // 每世纪100年
- YearsPerDecade = 10 // 每十年10年
- QuartersPerYear = 4 // 每年4个季度
- MonthsPerYear = 12 // 每年12月
- MonthsPerQuarter = 3 // 每季度3月
- WeeksPerNormalYear = 52 // 每常规年52周
- weeksPerLongYear = 53 // 每长年53周
- WeeksPerMonth = 4 // 每月4周
- DaysPerLeapYear = 366 // 每闰年366天
- DaysPerNormalYear = 365 // 每常规年365天
- DaysPerWeek = 7 // 每周7天
- HoursPerWeek = 168 // 每周168小时
- HoursPerDay = 24 // 每天24小时
- MinutesPerDay = 1440 // 每天1440分钟
- MinutesPerHour = 60 // 每小时60分钟
- SecondsPerWeek = 604800 // 每周604800秒
- SecondsPerDay = 86400 // 每天86400秒
- SecondsPerHour = 3600 // 每小时3600秒
- SecondsPerMinute = 60 // 每分钟60秒
-)
-
-// layout constants
-// 布局模板常量
-const (
- AtomLayout = RFC3339Layout
- ANSICLayout = time.ANSIC
- CookieLayout = "Monday, 02-Jan-2006 15:04:05 MST"
- KitchenLayout = time.Kitchen
- RssLayout = time.RFC1123Z
- RubyDateLayout = time.RubyDate
- UnixDateLayout = time.UnixDate
- W3cLayout = RFC3339Layout
-
- RFC1036Layout = "Mon, 02 Jan 06 15:04:05 -0700"
- RFC1123Layout = time.RFC1123
- RFC1123ZLayout = time.RFC1123Z
- RFC2822Layout = time.RFC1123Z
- RFC3339Layout = "2006-01-02T15:04:05Z07:00"
- RFC3339MilliLayout = "2006-01-02T15:04:05.999Z07:00"
- RFC3339MicroLayout = "2006-01-02T15:04:05.999999Z07:00"
- RFC3339NanoLayout = "2006-01-02T15:04:05.999999999Z07:00"
- RFC7231Layout = "Mon, 02 Jan 2006 15:04:05 MST"
- RFC822Layout = time.RFC822
- RFC822ZLayout = time.RFC822Z
- RFC850Layout = time.RFC850
-
- ISO8601Layout = "2006-01-02T15:04:05-07:00"
- ISO8601MilliLayout = "2006-01-02T15:04:05.999-07:00"
- ISO8601MicroLayout = "2006-01-02T15:04:05.999999-07:00"
- ISO8601NanoLayout = "2006-01-02T15:04:05.999999999-07:00"
-
- ISO8601ZuluLayout = "2006-01-02T15:04:05Z"
- ISO8601ZuluMilliLayout = "2006-01-02T15:04:05.999Z"
- ISO8601ZuluMicroLayout = "2006-01-02T15:04:05.999999Z"
- ISO8601ZuluNanoLayout = "2006-01-02T15:04:05.999999999Z"
-
- FormattedDateLayout = "Jan 2, 2006"
- FormattedDayDateLayout = "Mon, Jan 2, 2006"
-
- DayDateTimeLayout = "Mon, Jan 2, 2006 3:04 PM"
- DateTimeLayout = "2006-01-02 15:04:05"
- DateTimeMilliLayout = "2006-01-02 15:04:05.999"
- DateTimeMicroLayout = "2006-01-02 15:04:05.999999"
- DateTimeNanoLayout = "2006-01-02 15:04:05.999999999"
- ShortDateTimeLayout = "20060102150405"
- ShortDateTimeMilliLayout = "20060102150405.999"
- ShortDateTimeMicroLayout = "20060102150405.999999"
- ShortDateTimeNanoLayout = "20060102150405.999999999"
-
- DateLayout = "2006-01-02"
- DateMilliLayout = "2006-01-02.999"
- DateMicroLayout = "2006-01-02.999999"
- DateNanoLayout = "2006-01-02.999999999"
- ShortDateLayout = "20060102"
- ShortDateMilliLayout = "20060102.999"
- ShortDateMicroLayout = "20060102.999999"
- ShortDateNanoLayout = "20060102.999999999"
-
- TimeLayout = "15:04:05"
- TimeMilliLayout = "15:04:05.999"
- TimeMicroLayout = "15:04:05.999999"
- TimeNanoLayout = "15:04:05.999999999"
- ShortTimeLayout = "150405"
- ShortTimeMilliLayout = "150405.999"
- ShortTimeMicroLayout = "150405.999999"
- ShortTimeNanoLayout = "150405.999999999"
-)
-
-// format constants
-// 格式模板常量
-const (
- AtomFormat = "Y-m-d\\TH:i:sP"
- ANSICFormat = "D M j H:i:s Y"
- CookieFormat = "l, d-M-Y H:i:s T"
- KitchenFormat = "g:iA"
- RssFormat = "D, d M Y H:i:s O"
- RubyDateFormat = "D M d H:i:s O Y"
- UnixDateFormat = "D M j H:i:s T Y"
-
- RFC1036Format = "D, d M y H:i:s O"
- RFC1123Format = "D, d M Y H:i:s T"
- RFC1123ZFormat = "D, d M Y H:i:s O"
- RFC2822Format = "D, d M Y H:i:s O"
- RFC3339Format = "Y-m-d\\TH:i:sP"
- RFC3339MilliFormat = "Y-m-d\\TH:i:s.vP"
- RFC3339MicroFormat = "Y-m-d\\TH:i:s.uP"
- RFC3339NanoFormat = "Y-m-d\\TH:i:s.xP"
- RFC7231Format = "D, d M Y H:i:s T"
- RFC822Format = "d M y H:i T"
- RFC822ZFormat = "d M y H:i O"
- RFC850Format = "l, d-M-y H:i:s T"
-
- ISO8601Format = "Y-m-d\\TH:i:sP"
- ISO8601MilliFormat = "Y-m-d\\TH:i:s.vP"
- ISO8601MicroFormat = "Y-m-d\\TH:i:s.uP"
- ISO8601NanoFormat = "Y-m-d\\TH:i:s.xP"
-
- ISO8601ZuluFormat = "Y-m-d\\TH:i:s\\Z"
- ISO8601ZuluMilliFormat = "Y-m-d\\TH:i:s.v\\Z"
- ISO8601ZuluMicroFormat = "Y-m-d\\TH:i:s.u\\Z"
- ISO8601ZuluNanoFormat = "Y-m-d\\TH:i:s.x\\Z"
-
- FormattedDateFormat = "M j, Y"
- FormattedDayDateFormat = "D, M j, Y"
-
- DayDateTimeFormat = "D, M j, Y g:i A"
- DateTimeFormat = "Y-m-d H:i:s"
- DateTimeMilliFormat = "Y-m-d H:i:s.v"
- DateTimeMicroFormat = "Y-m-d H:i:s.u"
- DateTimeNanoFormat = "Y-m-d H:i:s.x"
- ShortDateTimeFormat = "YmdHis"
- ShortDateTimeMilliFormat = "YmdHis.v"
- ShortDateTimeMicroFormat = "YmdHis.u"
- ShortDateTimeNanoFormat = "YmdHis.x"
-
- DateFormat = "Y-m-d"
- DateMilliFormat = "Y-m-d.v"
- DateMicroFormat = "Y-m-d.u"
- DateNanoFormat = "Y-m-d.x"
- ShortDateFormat = "Ymd"
- ShortDateMilliFormat = "Ymd.v"
- ShortDateMicroFormat = "Ymd.u"
- ShortDateNanoFormat = "Ymd.x"
-
- TimeFormat = "H:i:s"
- TimeMilliFormat = "H:i:s.v"
- TimeMicroFormat = "H:i:s.u"
- TimeNanoFormat = "H:i:s.x"
- ShortTimeFormat = "His"
- ShortTimeMilliFormat = "His.v"
- ShortTimeMicroFormat = "His.u"
- ShortTimeNanoFormat = "His.x"
-)
+type StdTime = time.Time
+type Weekday = time.Weekday
+type Location = time.Location
+type Duration = time.Duration
// Carbon defines a Carbon struct.
-// 定义 Carbon 结构体
type Carbon struct {
- time time.Time
- testNow int64 // nanosecond timestamp of test now time
- layout string
- weekStartsAt time.Weekday
- loc *time.Location
- lang *Language
- Error error
+ time StdTime
+ weekStartsAt Weekday
+ weekendDays []Weekday
+ loc *Location
+ lang *Language
+ currentLayout string
+ isEmpty bool
+ Error error
}
// NewCarbon returns a new Carbon instance.
-// 初始化 Carbon 结构体
-func NewCarbon() Carbon {
- c := Carbon{lang: NewLanguage()}
- c.loc, c.Error = getLocationByTimezone(defaultTimezone)
- if weekday, ok := weekdays[defaultWeekStartsAt]; ok {
- c.weekStartsAt = weekday
+func NewCarbon(stdTime ...StdTime) *Carbon {
+ c := new(Carbon)
+ c.lang = NewLanguage().SetLocale(DefaultLocale)
+ c.weekStartsAt = DefaultWeekStartsAt
+ c.weekendDays = DefaultWeekendDays
+ c.currentLayout = DefaultLayout
+ if len(stdTime) > 0 {
+ c.time = stdTime[0]
+ c.loc = c.time.Location()
+ return c
}
- c.layout = defaultLayout
+ c.loc, c.Error = parseTimezone(DefaultTimezone)
return c
}
-// DateTime defines a DateTime struct.
-// 定义 DateTime 结构体
-type DateTime struct {
- Carbon
-}
-
-// NewDateTime returns a new DateTime instance.
-// 初始化 DateTime 结构体
-func NewDateTime(carbon Carbon) DateTime {
- return DateTime{Carbon: carbon}
-}
-
-// DateTimeMilli defines a DateTimeMilli struct.
-// 定义 DateTimeMilli 结构体
-type DateTimeMilli struct {
- Carbon
-}
-
-// NewDateTimeMilli returns a new DateTimeMilli instance.
-// 初始化 DateTimeMilli 结构体
-func NewDateTimeMilli(carbon Carbon) DateTimeMilli {
- return DateTimeMilli{Carbon: carbon}
-}
-
-// DateTimeMicro defines a DateTimeMicro struct.
-// 定义 DateTimeMicro 结构体
-type DateTimeMicro struct {
- Carbon
-}
-
-// NewDateTimeMicro returns a new DateTimeMicro instance.
-// 初始化 DateTimeMicro 结构体
-func NewDateTimeMicro(carbon Carbon) DateTimeMicro {
- return DateTimeMicro{Carbon: carbon}
-}
-
-// DateTimeNano defines a DateTimeNano struct.
-// 定义 DateTimeNano 结构体
-type DateTimeNano struct {
- Carbon
-}
-
-// NewDateTimeNano returns a new DateTimeNano instance.
-// 初始化 DateTimeNano 结构体
-func NewDateTimeNano(carbon Carbon) DateTimeNano {
- return DateTimeNano{Carbon: carbon}
-}
-
-// Date defines a Date struct.
-// 定义 Date 结构体
-type Date struct {
- Carbon
-}
-
-// NewDate returns a new Date instance.
-// 初始化 Date 结构体
-func NewDate(carbon Carbon) Date {
- return Date{Carbon: carbon}
-}
-
-// DateMilli defines a DateMilli struct.
-// 定义 DateMilli 结构体
-type DateMilli struct {
- Carbon
-}
-
-// NewDateMilli returns a new DateMilli instance.
-// 初始化 DateMilli 结构体
-func NewDateMilli(carbon Carbon) DateMilli {
- return DateMilli{Carbon: carbon}
-}
-
-// DateMicro defines a DateMicro struct.
-// 定义 DateMicro 结构体
-type DateMicro struct {
- Carbon
-}
-
-// NewDateMicro returns a new DateMicro instance.
-// 初始化 DateMicro 结构体
-func NewDateMicro(carbon Carbon) DateMicro {
- return DateMicro{Carbon: carbon}
-}
-
-// DateNano defines a DateNano struct.
-// 定义 DateNano 结构体
-type DateNano struct {
- Carbon
-}
-
-// NewDateNano returns a new DateNano instance.
-// 初始化 DateNano 结构体
-func NewDateNano(carbon Carbon) DateNano {
- return DateNano{Carbon: carbon}
-}
-
-// Time defines a Time struct.
-// 定义 Time 结构体
-type Time struct {
- Carbon
-}
-
-// NewTime returns a new Time instance.
-// 初始化 Time 结构体
-func NewTime(carbon Carbon) Time {
- return Time{Carbon: carbon}
-}
-
-// TimeMilli defines a TimeMilli struct.
-// 定义 TimeMilli 结构体
-type TimeMilli struct {
- Carbon
-}
-
-// NewTimeMilli returns a new TimeMilli instance.
-// 初始化 TimeMilli 结构体
-func NewTimeMilli(carbon Carbon) TimeMilli {
- return TimeMilli{Carbon: carbon}
-}
-
-// TimeMicro defines a TimeMicro struct.
-// 定义 TimeMicro 结构体
-type TimeMicro struct {
- Carbon
-}
-
-// NewTimeMicro returns a new TimeMicro instance.
-// 初始化 TimeMicro 结构体
-func NewTimeMicro(carbon Carbon) TimeMicro {
- return TimeMicro{Carbon: carbon}
-}
-
-// TimeNano defines a TimeNano struct.
-// 定义 TimeNano 结构体
-type TimeNano struct {
- Carbon
-}
-
-// NewTimeNano returns a new TimeNano instance.
-// 初始化 TimeNano 结构体
-func NewTimeNano(carbon Carbon) TimeNano {
- return TimeNano{Carbon: carbon}
-}
-
-// Timestamp defines a Timestamp struct.
-// 定义 Timestamp 结构体
-type Timestamp struct {
- Carbon
-}
-
-// NewTimestamp returns a new Timestamp instance.
-// 初始化 Timestamp 结构体
-func NewTimestamp(carbon Carbon) Timestamp {
- return Timestamp{Carbon: carbon}
-}
-
-// TimestampMilli defines a TimestampMilli struct.
-// 定义 TimestampMilli 结构体
-type TimestampMilli struct {
- Carbon
-}
-
-// NewTimestampMilli returns a new TimestampMilli instance.
-// 初始化 TimestampMilli 结构体
-func NewTimestampMilli(carbon Carbon) TimestampMilli {
- return TimestampMilli{Carbon: carbon}
-}
-
-// TimestampMicro defines a TimestampMicro struct.
-// 定义 TimestampMicro 结构体
-type TimestampMicro struct {
- Carbon
-}
-
-// NewTimestampMicro returns a new TimestampMicro instance.
-// 初始化 TimestampMicro 结构体
-func NewTimestampMicro(carbon Carbon) TimestampMicro {
- return TimestampMicro{Carbon: carbon}
-}
-
-// TimestampNano defines a TimestampNano struct.
-// 定义 TimestampNano 结构体
-type TimestampNano struct {
- Carbon
-}
-
-// NewTimestampNano returns a new TimestampNano instance.
-// 初始化 TimestampNano 结构体
-func NewTimestampNano(carbon Carbon) TimestampNano {
- return TimestampNano{Carbon: carbon}
+// Copy returns a copy of the Carbon instance.
+func (c *Carbon) Copy() *Carbon {
+ if c.IsNil() {
+ return nil
+ }
+ return &Carbon{
+ time: time.Date(c.Year(), time.Month(c.Month()), c.Day(), c.Hour(), c.Minute(), c.Second(), c.Nanosecond(), c.loc),
+ weekStartsAt: c.weekStartsAt,
+ weekendDays: c.weekendDays,
+ loc: c.loc,
+ lang: c.lang.Copy(),
+ currentLayout: c.currentLayout,
+ isEmpty: c.isEmpty,
+ Error: c.Error,
+ }
}
diff --git a/vendor/github.com/dromara/carbon/v2/comparer.go b/vendor/github.com/dromara/carbon/v2/comparer.go
index 1b7bbffb..9ee646a4 100644
--- a/vendor/github.com/dromara/carbon/v2/comparer.go
+++ b/vendor/github.com/dromara/carbon/v2/comparer.go
@@ -4,79 +4,83 @@ import (
"time"
)
-// IsDST reports whether is daylight saving time.
-// 是否是夏令时
-func (c Carbon) IsDST() bool {
- return c.time.IsDST()
-}
-
-// IsZero reports whether is zero time(0001-01-01 00:00:00 +0000 UTC).
-// 是否是零值时间(0001-01-01 00:00:00 +0000 UTC)
-func (c Carbon) IsZero() bool {
- return c.time.IsZero()
-}
-
-// IsValid reports whether is valid time.
-// 是否是有效时间
-func (c Carbon) IsValid() bool {
- if c.IsZero() {
+// HasError reports whether has error.
+func (c *Carbon) HasError() bool {
+ if c.IsNil() {
return false
}
- if c.Year() >= MinValue().Year() && c.Year() <= MaxValue().Year() && c.Month() > 0 && c.Day() > 0 {
+ return c.Error != nil
+}
+
+// IsNil reports whether is nil pointer.
+func (c *Carbon) IsNil() bool {
+ return c == nil
+}
+
+// IsEmpty reports whether is empty value.
+func (c *Carbon) IsEmpty() bool {
+ if c.IsNil() || c.HasError() {
+ return false
+ }
+ return c.isEmpty
+}
+
+// IsZero reports whether is a zero time(0001-01-01 00:00:00 +0000 UTC).
+func (c *Carbon) IsZero() bool {
+ if c.IsNil() || c.IsEmpty() || c.HasError() {
+ return false
+ }
+ return c.StdTime().IsZero()
+}
+
+// IsEpoch reports whether is a unix epoch time(1970-01-01 00:00:00 +0000 UTC).
+func (c *Carbon) IsEpoch() bool {
+ if c.IsInvalid() {
+ return false
+ }
+ return c.Eq(EpochValue())
+}
+
+// IsValid reports whether is a valid time.
+func (c *Carbon) IsValid() bool {
+ if !c.IsNil() && !c.HasError() && !c.IsEmpty() {
return true
}
return false
}
-// IsInvalid reports whether is invalid time.
-// 是否是无效时间
-func (c Carbon) IsInvalid() bool {
+// IsInvalid reports whether is an invalid time.
+func (c *Carbon) IsInvalid() bool {
return !c.IsValid()
}
+// IsDST reports whether is a daylight saving time.
+func (c *Carbon) IsDST() bool {
+ if c.IsInvalid() {
+ return false
+ }
+ return c.StdTime().IsDST()
+}
+
// IsAM reports whether is before noon.
-// 是否是上午
-func (c Carbon) IsAM() bool {
+func (c *Carbon) IsAM() bool {
+ if c.IsInvalid() {
+ return false
+ }
return c.Format("a") == "am"
}
// IsPM reports whether is after noon.
-// 是否是下午
-func (c Carbon) IsPM() bool {
+func (c *Carbon) IsPM() bool {
+ if c.IsInvalid() {
+ return false
+ }
return c.Format("a") == "pm"
}
-// IsNow reports whether is now time.
-// 是否是当前时间
-func (c Carbon) IsNow() bool {
- if c.Error != nil {
- return false
- }
- return c.Timestamp() == c.Now().Timestamp()
-}
-
-// IsFuture reports whether is future time.
-// 是否是未来时间
-func (c Carbon) IsFuture() bool {
- if c.Error != nil {
- return false
- }
- return c.Timestamp() > c.Now().Timestamp()
-}
-
-// IsPast reports whether is past time.
-// 是否是过去时间
-func (c Carbon) IsPast() bool {
- if c.Error != nil {
- return false
- }
- return c.Timestamp() < c.Now().Timestamp()
-}
-
// IsLeapYear reports whether is a leap year.
-// 是否是闰年
-func (c Carbon) IsLeapYear() bool {
- if c.Error != nil {
+func (c *Carbon) IsLeapYear() bool {
+ if c.IsInvalid() {
return false
}
year := c.Year()
@@ -86,308 +90,310 @@ func (c Carbon) IsLeapYear() bool {
return false
}
-// IsLongYear reports whether is a long year, see https://en.wikipedia.org/wiki/ISO_8601#Week_dates.
-// 是否是长年
-func (c Carbon) IsLongYear() bool {
- if c.Error != nil {
+// IsLongYear reports whether is a long year, refer to https://en.wikipedia.org/wiki/ISO_8601#Week_dates.
+func (c *Carbon) IsLongYear() bool {
+ if c.IsInvalid() {
return false
}
_, w := time.Date(c.Year(), 12, 31, 0, 0, 0, 0, c.loc).ISOWeek()
- return w == weeksPerLongYear
+ return w == WeeksPerLongYear
}
// IsJanuary reports whether is January.
-// 是否是一月
-func (c Carbon) IsJanuary() bool {
- if c.Error != nil {
+func (c *Carbon) IsJanuary() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.January)
}
// IsFebruary reports whether is February.
-// 是否是二月
-func (c Carbon) IsFebruary() bool {
- if c.Error != nil {
+func (c *Carbon) IsFebruary() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.February)
}
// IsMarch reports whether is March.
-// 是否是三月
-func (c Carbon) IsMarch() bool {
- if c.Error != nil {
+func (c *Carbon) IsMarch() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.March)
}
// IsApril reports whether is April.
-// 是否是四月
-func (c Carbon) IsApril() bool {
- if c.Error != nil {
+func (c *Carbon) IsApril() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.April)
}
// IsMay reports whether is May.
-// 是否是五月
-func (c Carbon) IsMay() bool {
- if c.Error != nil {
+func (c *Carbon) IsMay() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.May)
}
// IsJune reports whether is June.
-// 是否是六月
-func (c Carbon) IsJune() bool {
- if c.Error != nil {
+func (c *Carbon) IsJune() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.June)
}
// IsJuly reports whether is July.
-// 是否是七月
-func (c Carbon) IsJuly() bool {
- if c.Error != nil {
+func (c *Carbon) IsJuly() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.July)
}
// IsAugust reports whether is August.
-// 是否是八月
-func (c Carbon) IsAugust() bool {
- if c.Error != nil {
+func (c *Carbon) IsAugust() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.August)
}
// IsSeptember reports whether is September.
-// 是否是九月
-func (c Carbon) IsSeptember() bool {
- if c.Error != nil {
+func (c *Carbon) IsSeptember() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.September)
}
// IsOctober reports whether is October.
-// 是否是十月
-func (c Carbon) IsOctober() bool {
- if c.Error != nil {
+func (c *Carbon) IsOctober() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.October)
}
// IsNovember reports whether is November.
-// 是否是十一月
-func (c Carbon) IsNovember() bool {
- if c.Error != nil {
+func (c *Carbon) IsNovember() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.November)
}
// IsDecember reports whether is December.
-// 是否是十二月
-func (c Carbon) IsDecember() bool {
- if c.Error != nil {
+func (c *Carbon) IsDecember() bool {
+ if c.IsInvalid() {
return false
}
return c.Month() == int(time.December)
}
// IsMonday reports whether is Monday.
-// 是否是周一
-func (c Carbon) IsMonday() bool {
- if c.Error != nil {
+func (c *Carbon) IsMonday() bool {
+ if c.IsInvalid() {
return false
}
return c.StdTime().Weekday() == time.Monday
}
// IsTuesday reports whether is Tuesday.
-// 是否是周二
-func (c Carbon) IsTuesday() bool {
- if c.Error != nil {
+func (c *Carbon) IsTuesday() bool {
+ if c.IsInvalid() {
return false
}
return c.StdTime().Weekday() == time.Tuesday
}
// IsWednesday reports whether is Wednesday.
-// 是否是周三
-func (c Carbon) IsWednesday() bool {
- if c.Error != nil {
+func (c *Carbon) IsWednesday() bool {
+ if c.IsInvalid() {
return false
}
return c.StdTime().Weekday() == time.Wednesday
}
// IsThursday reports whether is Thursday.
-// 是否是周四
-func (c Carbon) IsThursday() bool {
- if c.Error != nil {
+func (c *Carbon) IsThursday() bool {
+ if c.IsInvalid() {
return false
}
return c.StdTime().Weekday() == time.Thursday
}
// IsFriday reports whether is Friday.
-// 是否是周五
-func (c Carbon) IsFriday() bool {
- if c.Error != nil {
+func (c *Carbon) IsFriday() bool {
+ if c.IsInvalid() {
return false
}
return c.StdTime().Weekday() == time.Friday
}
// IsSaturday reports whether is Saturday.
-// 是否是周六
-func (c Carbon) IsSaturday() bool {
- if c.Error != nil {
+func (c *Carbon) IsSaturday() bool {
+ if c.IsInvalid() {
return false
}
return c.StdTime().Weekday() == time.Saturday
}
// IsSunday reports whether is Sunday.
-// 是否是周日
-func (c Carbon) IsSunday() bool {
- if c.Error != nil {
+func (c *Carbon) IsSunday() bool {
+ if c.IsInvalid() {
return false
}
return c.StdTime().Weekday() == time.Sunday
}
// IsWeekday reports whether is weekday.
-// 是否是工作日
-func (c Carbon) IsWeekday() bool {
- if c.Error != nil {
+func (c *Carbon) IsWeekday() bool {
+ if c.IsInvalid() {
return false
}
- return !c.IsSaturday() && !c.IsSunday()
+ return !c.IsWeekend()
}
// IsWeekend reports whether is weekend.
-// 是否是周末
-func (c Carbon) IsWeekend() bool {
- if c.Error != nil {
+func (c *Carbon) IsWeekend() bool {
+ if c.IsInvalid() {
return false
}
- return c.IsSaturday() || c.IsSunday()
+ d := c.StdTime().Weekday()
+ for i := range c.weekendDays {
+ if d == c.weekendDays[i] {
+ return true
+ }
+ }
+ return false
+}
+
+// IsNow reports whether is now time.
+func (c *Carbon) IsNow() bool {
+ if c.IsInvalid() {
+ return false
+ }
+ return c.Timestamp() == Now().SetLocation(c.loc).Timestamp()
+}
+
+// IsFuture reports whether is future time.
+func (c *Carbon) IsFuture() bool {
+ if c.IsInvalid() {
+ return false
+ }
+ if c.IsZero() {
+ return false
+ }
+ return c.Timestamp() > Now().SetLocation(c.loc).Timestamp()
+}
+
+// IsPast reports whether is past time.
+func (c *Carbon) IsPast() bool {
+ if c.IsInvalid() {
+ return false
+ }
+ if c.IsZero() {
+ return true
+ }
+ return c.Timestamp() < Now().SetLocation(c.loc).Timestamp()
}
// IsYesterday reports whether is yesterday.
-// 是否是昨天
-func (c Carbon) IsYesterday() bool {
- if c.Error != nil {
+func (c *Carbon) IsYesterday() bool {
+ if c.IsInvalid() {
return false
}
- return c.ToDateString() == Yesterday().ToDateString()
+ return c.ToDateString() == Yesterday().SetLocation(c.loc).ToDateString()
}
// IsToday reports whether is today.
-// 是否是今天
-func (c Carbon) IsToday() bool {
- if c.Error != nil {
+func (c *Carbon) IsToday() bool {
+ if c.IsInvalid() {
return false
}
- return c.ToDateString() == Now().ToDateString()
+ return c.ToDateString() == Now().SetLocation(c.loc).ToDateString()
}
// IsTomorrow reports whether is tomorrow.
-// 是否是明天
-func (c Carbon) IsTomorrow() bool {
- if c.Error != nil {
+func (c *Carbon) IsTomorrow() bool {
+ if c.IsInvalid() {
return false
}
- return c.ToDateString() == Tomorrow().ToDateString()
+ return c.ToDateString() == Tomorrow().SetLocation(c.loc).ToDateString()
}
// IsSameCentury reports whether is same century.
-// 是否是同一世纪
-func (c Carbon) IsSameCentury(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) IsSameCentury(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Century() == t.Century()
}
// IsSameDecade reports whether is same decade.
-// 是否是同一年代
-func (c Carbon) IsSameDecade(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) IsSameDecade(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Decade() == t.Decade()
}
// IsSameYear reports whether is same year.
-// 是否是同一年
-func (c Carbon) IsSameYear(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) IsSameYear(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Year() == t.Year()
}
// IsSameQuarter reports whether is same quarter.
-// 是否是同一季节
-func (c Carbon) IsSameQuarter(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) IsSameQuarter(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
- return c.Quarter() == t.Quarter()
+ return c.Year() == t.Year() && c.Quarter() == t.Quarter()
}
// IsSameMonth reports whether is same month.
-// 是否是同一月
-func (c Carbon) IsSameMonth(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) IsSameMonth(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Format("Ym") == t.Format("Ym")
}
// IsSameDay reports whether is same day.
-// 是否是同一天
-func (c Carbon) IsSameDay(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) IsSameDay(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Format("Ymd") == t.Format("Ymd")
}
// IsSameHour reports whether is same hour.
-// 是否是同一小时
-func (c Carbon) IsSameHour(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) IsSameHour(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Format("YmdH") == t.Format("YmdH")
}
// IsSameMinute reports whether is same minute.
-// 是否是同一分钟
-func (c Carbon) IsSameMinute(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) IsSameMinute(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Format("YmdHi") == t.Format("YmdHi")
}
// IsSameSecond reports whether is same second.
-// 是否是同一秒
-func (c Carbon) IsSameSecond(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) IsSameSecond(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Format("YmdHis") == t.Format("YmdHis")
@@ -395,9 +401,8 @@ func (c Carbon) IsSameSecond(t Carbon) bool {
}
// Compare compares by an operator.
-// 时间比较
-func (c Carbon) Compare(operator string, t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) Compare(operator string, t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
switch operator {
@@ -418,60 +423,59 @@ func (c Carbon) Compare(operator string, t Carbon) bool {
}
// Gt reports whether greater than.
-// 是否大于
-func (c Carbon) Gt(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) Gt(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.time.After(t.time)
}
// Lt reports whether less than.
-// 是否小于
-func (c Carbon) Lt(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) Lt(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.time.Before(t.time)
}
// Eq reports whether equal.
-// 是否等于
-func (c Carbon) Eq(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) Eq(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.time.Equal(t.time)
}
// Ne reports whether not equal.
-// 是否不等于
-func (c Carbon) Ne(t Carbon) bool {
+func (c *Carbon) Ne(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
+ return false
+ }
return !c.Eq(t)
}
// Gte reports whether greater than or equal.
-// 是否大于等于
-func (c Carbon) Gte(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) Gte(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Gt(t) || c.Eq(t)
}
// Lte reports whether less than or equal.
-// 是否小于等于
-func (c Carbon) Lte(t Carbon) bool {
- if c.Error != nil || t.Error != nil {
+func (c *Carbon) Lte(t *Carbon) bool {
+ if c.IsInvalid() || t.IsInvalid() {
return false
}
return c.Lt(t) || c.Eq(t)
}
// Between reports whether between two times, excluded the start and end time.
-// 是否在两个时间之间(不包括这两个时间)
-func (c Carbon) Between(start Carbon, end Carbon) bool {
- if c.Error != nil || start.Error != nil || end.Error != nil {
+func (c *Carbon) Between(start *Carbon, end *Carbon) bool {
+ if start.Gt(end) {
+ return false
+ }
+ if c.IsInvalid() || start.IsInvalid() || end.IsInvalid() {
return false
}
if c.Gt(start) && c.Lt(end) {
@@ -481,9 +485,14 @@ func (c Carbon) Between(start Carbon, end Carbon) bool {
}
// BetweenIncludedStart reports whether between two times, included the start time.
-// 是否在两个时间之间(包括开始时间)
-func (c Carbon) BetweenIncludedStart(start Carbon, end Carbon) bool {
- if c.Error != nil || start.Error != nil || end.Error != nil {
+func (c *Carbon) BetweenIncludedStart(start *Carbon, end *Carbon) bool {
+ if start.Gt(end) {
+ return false
+ }
+ if c.IsZero() && start.IsZero() {
+ return true
+ }
+ if c.IsInvalid() || start.IsInvalid() || end.IsInvalid() {
return false
}
if c.Gte(start) && c.Lt(end) {
@@ -493,9 +502,14 @@ func (c Carbon) BetweenIncludedStart(start Carbon, end Carbon) bool {
}
// BetweenIncludedEnd reports whether between two times, included the end time.
-// 是否在两个时间之间(包括结束时间)
-func (c Carbon) BetweenIncludedEnd(start Carbon, end Carbon) bool {
- if c.Error != nil || start.Error != nil || end.Error != nil {
+func (c *Carbon) BetweenIncludedEnd(start *Carbon, end *Carbon) bool {
+ if start.Gt(end) {
+ return false
+ }
+ if c.IsZero() && end.IsZero() {
+ return true
+ }
+ if c.IsInvalid() || start.IsInvalid() || end.IsInvalid() {
return false
}
if c.Gt(start) && c.Lte(end) {
@@ -505,9 +519,14 @@ func (c Carbon) BetweenIncludedEnd(start Carbon, end Carbon) bool {
}
// BetweenIncludedBoth reports whether between two times, included the start and end time.
-// 是否在两个时间之间(包括这两个时间)
-func (c Carbon) BetweenIncludedBoth(start Carbon, end Carbon) bool {
- if c.Error != nil || start.Error != nil || end.Error != nil {
+func (c *Carbon) BetweenIncludedBoth(start *Carbon, end *Carbon) bool {
+ if start.Gt(end) {
+ return false
+ }
+ if (c.IsZero() && start.IsZero()) || (c.IsZero() && end.IsZero()) {
+ return true
+ }
+ if c.IsInvalid() || start.IsInvalid() || end.IsInvalid() {
return false
}
if c.Gte(start) && c.Lte(end) {
diff --git a/vendor/github.com/dromara/carbon/v2/constants.go b/vendor/github.com/dromara/carbon/v2/constants.go
new file mode 100644
index 00000000..5396c3d9
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/constants.go
@@ -0,0 +1,290 @@
+package carbon
+
+import (
+ "time"
+)
+
+// Version current version
+const Version = "2.6.7"
+
+// timezone constants
+const (
+ Local = "Local"
+ UTC = "UTC"
+
+ CET = "CET"
+ EET = "EET"
+ EST = "EST"
+ GMT = "GMT"
+ MET = "MET"
+ MST = "MST"
+ UCT = "MST"
+ WET = "WET"
+ Zulu = "Zulu"
+
+ Cuba = "Cuba"
+ Egypt = "Egypt"
+ Eire = "Eire"
+ Greenwich = "Greenwich"
+ Iceland = "Iceland"
+ Iran = "Iran"
+ Israel = "Israel"
+ Jamaica = "Jamaica"
+ Japan = "Japan"
+ Libya = "Libya"
+ Poland = "Poland"
+ Portugal = "Portugal"
+ PRC = "PRC"
+ Singapore = "Singapore"
+ Turkey = "Turkey"
+
+ Shanghai = "Asia/Shanghai"
+ Chongqing = "Asia/Chongqing"
+ Harbin = "Asia/Harbin"
+ Urumqi = "Asia/Urumqi"
+ HongKong = "Asia/Hong_Kong"
+ Macao = "Asia/Macao"
+ Taipei = "Asia/Taipei"
+ Tokyo = "Asia/Tokyo"
+ HoChiMinh = "Asia/Ho_Chi_Minh"
+ Hanoi = "Asia/Hanoi"
+ Saigon = "Asia/Saigon"
+ Seoul = "Asia/Seoul"
+ Pyongyang = "Asia/Pyongyang"
+ Bangkok = "Asia/Bangkok"
+ Dubai = "Asia/Dubai"
+ Qatar = "Asia/Qatar"
+ Bangalore = "Asia/Bangalore"
+ Kolkata = "Asia/Kolkata"
+ Mumbai = "Asia/Mumbai"
+ MexicoCity = "America/Mexico_City"
+ NewYork = "America/New_York"
+ LosAngeles = "America/Los_Angeles"
+ Chicago = "America/Chicago"
+ SaoPaulo = "America/Sao_Paulo"
+ Moscow = "Europe/Moscow"
+ London = "Europe/London"
+ Berlin = "Europe/Berlin"
+ Paris = "Europe/Paris"
+ Rome = "Europe/Rome"
+ Sydney = "Australia/Sydney"
+ Melbourne = "Australia/Melbourne"
+ Darwin = "Australia/Darwin"
+)
+
+// month constants
+const (
+ January = time.January
+ February = time.February
+ March = time.March
+ April = time.April
+ May = time.May
+ June = time.June
+ July = time.July
+ August = time.August
+ September = time.September
+ October = time.October
+ November = time.November
+ December = time.December
+)
+
+// constellation constants
+const (
+ Aries = "Aries"
+ Taurus = "Taurus"
+ Gemini = "Gemini"
+ Cancer = "Cancer"
+ Leo = "Leo"
+ Virgo = "Virgo"
+ Libra = "Libra"
+ Scorpio = "Scorpio"
+ Sagittarius = "Sagittarius"
+ Capricorn = "Capricorn"
+ Aquarius = "Aquarius"
+ Pisces = "Pisces"
+)
+
+// week constants
+const (
+ Monday = time.Monday
+ Tuesday = time.Tuesday
+ Wednesday = time.Wednesday
+ Thursday = time.Thursday
+ Friday = time.Friday
+ Saturday = time.Saturday
+ Sunday = time.Sunday
+)
+
+// season constants
+const (
+ Spring = "Spring"
+ Summer = "Summer"
+ Autumn = "Autumn"
+ Winter = "Winter"
+)
+
+// number constants
+const (
+ EpochYear = 1970
+ YearsPerMillennium = 1000
+ YearsPerCentury = 100
+ YearsPerDecade = 10
+ QuartersPerYear = 4
+ MonthsPerYear = 12
+ MonthsPerQuarter = 3
+ WeeksPerNormalYear = 52
+ WeeksPerLongYear = 53
+ WeeksPerMonth = 4
+ DaysPerLeapYear = 366
+ DaysPerNormalYear = 365
+ DaysPerWeek = 7
+ HoursPerWeek = 168
+ HoursPerDay = 24
+ MinutesPerDay = 1440
+ MinutesPerHour = 60
+ SecondsPerWeek = 604800
+ SecondsPerDay = 86400
+ SecondsPerHour = 3600
+ SecondsPerMinute = 60
+)
+
+// layout constants
+const (
+ AtomLayout = RFC3339Layout
+ ANSICLayout = time.ANSIC
+ CookieLayout = "Monday, 02-Jan-2006 15:04:05 MST"
+ KitchenLayout = time.Kitchen
+ RssLayout = time.RFC1123Z
+ RubyDateLayout = time.RubyDate
+ UnixDateLayout = time.UnixDate
+ W3cLayout = RFC3339Layout
+
+ RFC1036Layout = "Mon, 02 Jan 06 15:04:05 -0700"
+ RFC1123Layout = time.RFC1123
+ RFC1123ZLayout = time.RFC1123Z
+ RFC2822Layout = time.RFC1123Z
+ RFC3339Layout = "2006-01-02T15:04:05Z07:00"
+ RFC3339MilliLayout = "2006-01-02T15:04:05.999Z07:00"
+ RFC3339MicroLayout = "2006-01-02T15:04:05.999999Z07:00"
+ RFC3339NanoLayout = "2006-01-02T15:04:05.999999999Z07:00"
+ RFC7231Layout = "Mon, 02 Jan 2006 15:04:05 MST"
+ RFC822Layout = time.RFC822
+ RFC822ZLayout = time.RFC822Z
+ RFC850Layout = time.RFC850
+
+ ISO8601Layout = "2006-01-02T15:04:05-07:00"
+ ISO8601MilliLayout = "2006-01-02T15:04:05.999-07:00"
+ ISO8601MicroLayout = "2006-01-02T15:04:05.999999-07:00"
+ ISO8601NanoLayout = "2006-01-02T15:04:05.999999999-07:00"
+
+ ISO8601ZuluLayout = "2006-01-02T15:04:05Z"
+ ISO8601ZuluMilliLayout = "2006-01-02T15:04:05.999Z"
+ ISO8601ZuluMicroLayout = "2006-01-02T15:04:05.999999Z"
+ ISO8601ZuluNanoLayout = "2006-01-02T15:04:05.999999999Z"
+
+ FormattedDateLayout = "Jan 2, 2006"
+ FormattedDayDateLayout = "Mon, Jan 2, 2006"
+
+ DayDateTimeLayout = "Mon, Jan 2, 2006 3:04 PM"
+ DateTimeLayout = "2006-01-02 15:04:05"
+ DateTimeMilliLayout = "2006-01-02 15:04:05.999"
+ DateTimeMicroLayout = "2006-01-02 15:04:05.999999"
+ DateTimeNanoLayout = "2006-01-02 15:04:05.999999999"
+ ShortDateTimeLayout = "20060102150405"
+ ShortDateTimeMilliLayout = "20060102150405.999"
+ ShortDateTimeMicroLayout = "20060102150405.999999"
+ ShortDateTimeNanoLayout = "20060102150405.999999999"
+
+ DateLayout = "2006-01-02"
+ DateMilliLayout = "2006-01-02.999"
+ DateMicroLayout = "2006-01-02.999999"
+ DateNanoLayout = "2006-01-02.999999999"
+ ShortDateLayout = "20060102"
+ ShortDateMilliLayout = "20060102.999"
+ ShortDateMicroLayout = "20060102.999999"
+ ShortDateNanoLayout = "20060102.999999999"
+
+ TimeLayout = "15:04:05"
+ TimeMilliLayout = "15:04:05.999"
+ TimeMicroLayout = "15:04:05.999999"
+ TimeNanoLayout = "15:04:05.999999999"
+ ShortTimeLayout = "150405"
+ ShortTimeMilliLayout = "150405.999"
+ ShortTimeMicroLayout = "150405.999999"
+ ShortTimeNanoLayout = "150405.999999999"
+
+ TimestampLayout = "unix"
+ TimestampMilliLayout = "unixMilli"
+ TimestampMicroLayout = "unixMicro"
+ TimestampNanoLayout = "unixNano"
+)
+
+// format constants
+const (
+ AtomFormat = "Y-m-d\\TH:i:sR"
+ ANSICFormat = "D M j H:i:s Y"
+ CookieFormat = "l, d-M-Y H:i:s Z"
+ KitchenFormat = "g:iA"
+ RssFormat = "D, d M Y H:i:s O"
+ RubyDateFormat = "D M d H:i:s O Y"
+ UnixDateFormat = "D M j H:i:s Z Y"
+
+ RFC1036Format = "D, d M y H:i:s O"
+ RFC1123Format = "D, d M Y H:i:s Z"
+ RFC1123ZFormat = "D, d M Y H:i:s O"
+ RFC2822Format = "D, d M Y H:i:s O"
+ RFC3339Format = "Y-m-d\\TH:i:sR"
+ RFC3339MilliFormat = "Y-m-d\\TH:i:s.uR"
+ RFC3339MicroFormat = "Y-m-d\\TH:i:s.vR"
+ RFC3339NanoFormat = "Y-m-d\\TH:i:s.xR"
+ RFC7231Format = "D, d M Y H:i:s Z"
+ RFC822Format = "d M y H:i Z"
+ RFC822ZFormat = "d M y H:i O"
+ RFC850Format = "l, d-M-y H:i:s Z"
+
+ ISO8601Format = "Y-m-d\\TH:i:sP"
+ ISO8601MilliFormat = "Y-m-d\\TH:i:s.uP"
+ ISO8601MicroFormat = "Y-m-d\\TH:i:s.vP"
+ ISO8601NanoFormat = "Y-m-d\\TH:i:s.xP"
+
+ ISO8601ZuluFormat = "Y-m-d\\TH:i:s\\Z"
+ ISO8601ZuluMilliFormat = "Y-m-d\\TH:i:s.u\\Z"
+ ISO8601ZuluMicroFormat = "Y-m-d\\TH:i:s.v\\Z"
+ ISO8601ZuluNanoFormat = "Y-m-d\\TH:i:s.x\\Z"
+
+ FormattedDateFormat = "M j, Y"
+ FormattedDayDateFormat = "D, M j, Y"
+
+ DayDateTimeFormat = "D, M j, Y g:i A"
+ DateTimeFormat = "Y-m-d H:i:s"
+ DateTimeMilliFormat = "Y-m-d H:i:s.u"
+ DateTimeMicroFormat = "Y-m-d H:i:s.v"
+ DateTimeNanoFormat = "Y-m-d H:i:s.x"
+ ShortDateTimeFormat = "YmdHis"
+ ShortDateTimeMilliFormat = "YmdHis.u"
+ ShortDateTimeMicroFormat = "YmdHis.v"
+ ShortDateTimeNanoFormat = "YmdHis.x"
+
+ DateFormat = "Y-m-d"
+ DateMilliFormat = "Y-m-d.u"
+ DateMicroFormat = "Y-m-d.v"
+ DateNanoFormat = "Y-m-d.x"
+ ShortDateFormat = "Ymd"
+ ShortDateMilliFormat = "Ymd.u"
+ ShortDateMicroFormat = "Ymd.v"
+ ShortDateNanoFormat = "Ymd.x"
+
+ TimeFormat = "H:i:s"
+ TimeMilliFormat = "H:i:s.u"
+ TimeMicroFormat = "H:i:s.v"
+ TimeNanoFormat = "H:i:s.x"
+ ShortTimeFormat = "His"
+ ShortTimeMilliFormat = "His.u"
+ ShortTimeMicroFormat = "His.v"
+ ShortTimeNanoFormat = "His.x"
+
+ TimestampFormat = "S"
+ TimestampMilliFormat = "U"
+ TimestampMicroFormat = "V"
+ TimestampNanoFormat = "X"
+)
diff --git a/vendor/github.com/dromara/carbon/v2/constellation.go b/vendor/github.com/dromara/carbon/v2/constellation.go
index 5bfba2d9..f2573396 100644
--- a/vendor/github.com/dromara/carbon/v2/constellation.go
+++ b/vendor/github.com/dromara/carbon/v2/constellation.go
@@ -23,14 +23,10 @@ var constellations = []struct {
}
// Constellation gets constellation name like "Aries", i18n is supported.
-// 获取星座,支持i18n
-func (c Carbon) Constellation() string {
+func (c *Carbon) Constellation() string {
if c.IsInvalid() {
return ""
}
- if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
- }
index := -1
_, month, day := c.Date()
for i := 0; i < len(constellations); i++ {
@@ -42,8 +38,10 @@ func (c Carbon) Constellation() string {
index = i
}
}
+
c.lang.rw.RLock()
defer c.lang.rw.RUnlock()
+
if resources, ok := c.lang.resources["constellations"]; ok {
slice := strings.Split(resources, "|")
if len(slice) == MonthsPerYear {
@@ -54,8 +52,7 @@ func (c Carbon) Constellation() string {
}
// IsAries reports whether is Aries.
-// 是否是白羊座
-func (c Carbon) IsAries() bool {
+func (c *Carbon) IsAries() bool {
if c.IsInvalid() {
return false
}
@@ -70,8 +67,7 @@ func (c Carbon) IsAries() bool {
}
// IsTaurus reports whether is Taurus.
-// 是否是金牛座
-func (c Carbon) IsTaurus() bool {
+func (c *Carbon) IsTaurus() bool {
if c.IsInvalid() {
return false
}
@@ -86,8 +82,7 @@ func (c Carbon) IsTaurus() bool {
}
// IsGemini reports whether is Gemini.
-// 是否是双子座
-func (c Carbon) IsGemini() bool {
+func (c *Carbon) IsGemini() bool {
if c.IsInvalid() {
return false
}
@@ -102,8 +97,7 @@ func (c Carbon) IsGemini() bool {
}
// IsCancer reports whether is Cancer.
-// 是否是巨蟹座
-func (c Carbon) IsCancer() bool {
+func (c *Carbon) IsCancer() bool {
if c.IsInvalid() {
return false
}
@@ -118,8 +112,7 @@ func (c Carbon) IsCancer() bool {
}
// IsLeo reports whether is Leo.
-// 是否是狮子座
-func (c Carbon) IsLeo() bool {
+func (c *Carbon) IsLeo() bool {
if c.IsInvalid() {
return false
}
@@ -134,8 +127,7 @@ func (c Carbon) IsLeo() bool {
}
// IsVirgo reports whether is Virgo.
-// 是否是处女座
-func (c Carbon) IsVirgo() bool {
+func (c *Carbon) IsVirgo() bool {
if c.IsInvalid() {
return false
}
@@ -150,8 +142,7 @@ func (c Carbon) IsVirgo() bool {
}
// IsLibra reports whether is Libra.
-// 是否是天秤座
-func (c Carbon) IsLibra() bool {
+func (c *Carbon) IsLibra() bool {
if c.IsInvalid() {
return false
}
@@ -166,8 +157,7 @@ func (c Carbon) IsLibra() bool {
}
// IsScorpio reports whether is Scorpio.
-// 是否是天蝎座
-func (c Carbon) IsScorpio() bool {
+func (c *Carbon) IsScorpio() bool {
if c.IsInvalid() {
return false
}
@@ -182,8 +172,7 @@ func (c Carbon) IsScorpio() bool {
}
// IsSagittarius reports whether is Sagittarius.
-// 是否是射手座
-func (c Carbon) IsSagittarius() bool {
+func (c *Carbon) IsSagittarius() bool {
if c.IsInvalid() {
return false
}
@@ -198,8 +187,7 @@ func (c Carbon) IsSagittarius() bool {
}
// IsCapricorn reports whether is Capricorn.
-// 是否是摩羯座
-func (c Carbon) IsCapricorn() bool {
+func (c *Carbon) IsCapricorn() bool {
if c.IsInvalid() {
return false
}
@@ -214,8 +202,7 @@ func (c Carbon) IsCapricorn() bool {
}
// IsAquarius reports whether is Aquarius.
-// 是否是水瓶座
-func (c Carbon) IsAquarius() bool {
+func (c *Carbon) IsAquarius() bool {
if c.IsInvalid() {
return false
}
@@ -230,8 +217,7 @@ func (c Carbon) IsAquarius() bool {
}
// IsPisces reports whether is Pisces.
-// 是否是双鱼座
-func (c Carbon) IsPisces() bool {
+func (c *Carbon) IsPisces() bool {
if c.IsInvalid() {
return false
}
diff --git a/vendor/github.com/dromara/carbon/v2/creator.go b/vendor/github.com/dromara/carbon/v2/creator.go
index cc496a28..b85fdf38 100644
--- a/vendor/github.com/dromara/carbon/v2/creator.go
+++ b/vendor/github.com/dromara/carbon/v2/creator.go
@@ -5,250 +5,184 @@ import (
)
// CreateFromStdTime creates a Carbon instance from standard time.Time.
-// 从标准的 time.Time 创建 Carbon 实例
-func CreateFromStdTime(tt time.Time, timezone ...string) Carbon {
- c := NewCarbon()
- c.loc = tt.Location()
+func CreateFromStdTime(stdTime StdTime, timezone ...string) *Carbon {
+ if len(timezone) == 0 {
+ return NewCarbon(stdTime)
+ }
+ var (
+ loc *Location
+ err error
+ )
+ if loc, err = parseTimezone(timezone[0]); err != nil {
+ return &Carbon{Error: err}
+ }
+ return NewCarbon(stdTime.In(loc))
+}
+
+// CreateFromTimestamp creates a Carbon instance from a given timestamp with second precision.
+func CreateFromTimestamp(timestamp int64, timezone ...string) *Carbon {
+ var (
+ tz string
+ loc *Location
+ err error
+ )
if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
}
- c.time = tt
- return c
+ if loc, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
+ }
+ return NewCarbon(time.Unix(timestamp, 0).In(loc))
}
-// CreateFromTimestamp creates a Carbon instance from a given timestamp with second.
-// 从给定的秒级时间戳创建 Carbon 实例
-func (c Carbon) CreateFromTimestamp(timestamp int64, timezone ...string) Carbon {
+// CreateFromTimestampMilli creates a Carbon instance from a given timestamp with millisecond precision.
+func CreateFromTimestampMilli(timestampMilli int64, timezone ...string) *Carbon {
+ var (
+ tz string
+ loc *Location
+ err error
+ )
if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
}
- if c.Error != nil {
- return c
+ if loc, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
}
- c.time = time.Unix(timestamp, 0)
- return c
+ return NewCarbon(time.Unix(timestampMilli/1e3, (timestampMilli%1e3)*1e6).In(loc))
}
-// CreateFromTimestamp creates a Carbon instance from a given timestamp with second.
-// 从给定的秒级时间戳创建 Carbon 实例
-func CreateFromTimestamp(timestamp int64, timezone ...string) Carbon {
- return NewCarbon().CreateFromTimestamp(timestamp, timezone...)
-}
-
-// CreateFromTimestampMilli creates a Carbon instance from a given timestamp with millisecond.
-// 从给定的毫秒级时间戳创建 Carbon 实例
-func (c Carbon) CreateFromTimestampMilli(timestamp int64, timezone ...string) Carbon {
+// CreateFromTimestampMicro creates a Carbon instance from a given timestamp with microsecond precision.
+func CreateFromTimestampMicro(timestampMicro int64, timezone ...string) *Carbon {
+ var (
+ tz string
+ loc *Location
+ err error
+ )
if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
}
- if c.Error != nil {
- return c
+ if loc, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
}
- c.time = time.Unix(timestamp/1e3, (timestamp%1e3)*1e6)
- return c
+ return NewCarbon(time.Unix(timestampMicro/1e6, (timestampMicro%1e6)*1e3).In(loc))
}
-// CreateFromTimestampMilli creates a Carbon instance from a given timestamp with millisecond.
-// 从给定的毫秒级时间戳创建 Carbon 实例
-func CreateFromTimestampMilli(timestamp int64, timezone ...string) Carbon {
- return NewCarbon().CreateFromTimestampMilli(timestamp, timezone...)
-}
-
-// CreateFromTimestampMicro creates a Carbon instance from a given timestamp with microsecond.
-// 从给定的微秒级时间戳创建 Carbon 实例
-func (c Carbon) CreateFromTimestampMicro(timestamp int64, timezone ...string) Carbon {
+// CreateFromTimestampNano creates a Carbon instance from a given timestamp with nanosecond precision.
+func CreateFromTimestampNano(timestampNano int64, timezone ...string) *Carbon {
+ var (
+ tz string
+ loc *Location
+ err error
+ )
if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
}
- if c.Error != nil {
- return c
+ if loc, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
}
- c.time = time.Unix(timestamp/1e6, (timestamp%1e6)*1e3)
- return c
-}
-
-// CreateFromTimestampMicro creates a Carbon instance from a given timestamp with microsecond.
-// 从给定的微秒级时间戳创建 Carbon 实例
-func CreateFromTimestampMicro(timestamp int64, timezone ...string) Carbon {
- return NewCarbon().CreateFromTimestampMicro(timestamp, timezone...)
-}
-
-// CreateFromTimestampNano creates a Carbon instance from a given timestamp with nanosecond.
-// 从给定的纳秒级时间戳创建 Carbon 实例
-func (c Carbon) CreateFromTimestampNano(timestamp int64, timezone ...string) Carbon {
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
- if c.Error != nil {
- return c
- }
- c.time = time.Unix(timestamp/1e9, timestamp%1e9)
- return c
-}
-
-// CreateFromTimestampNano creates a Carbon instance from a given timestamp with nanosecond.
-// 从给定的纳秒级时间戳创建 Carbon 实例
-func CreateFromTimestampNano(timestamp int64, timezone ...string) Carbon {
- return NewCarbon().CreateFromTimestampNano(timestamp, timezone...)
+ return NewCarbon(time.Unix(timestampNano/1e9, timestampNano%1e9).In(loc))
}
// CreateFromDateTime creates a Carbon instance from a given date and time.
-// 从给定的年、月、日、时、分、秒创建 Carbon 实例
-func (c Carbon) CreateFromDateTime(year, month, day, hour, minute, second int, timezone ...string) Carbon {
- return c.create(year, month, day, hour, minute, second, 0, timezone...)
-}
-
-// CreateFromDateTime creates a Carbon instance from a given date and time.
-// 从给定的年、月、日、时、分、秒创建 Carbon 实例
-func CreateFromDateTime(year, month, day, hour, minute, second int, timezone ...string) Carbon {
- return NewCarbon().CreateFromDateTime(year, month, day, hour, minute, second, timezone...)
+func CreateFromDateTime(year, month, day, hour, minute, second int, timezone ...string) *Carbon {
+ return create(year, month, day, hour, minute, second, 0, timezone...)
}
// CreateFromDateTimeMilli creates a Carbon instance from a given date, time and millisecond.
-// 从给定的年、月、日、时、分、秒、毫秒创建 Carbon 实例
-func (c Carbon) CreateFromDateTimeMilli(year, month, day, hour, minute, second, millisecond int, timezone ...string) Carbon {
- return c.create(year, month, day, hour, minute, second, millisecond*1e6, timezone...)
-}
-
-// CreateFromDateTimeMilli creates a Carbon instance from a given date, time and millisecond.
-// 从给定的年、月、日、时、分、秒、毫秒创建 Carbon 实例
-func CreateFromDateTimeMilli(year, month, day, hour, minute, second, millisecond int, timezone ...string) Carbon {
- return NewCarbon().CreateFromDateTimeMilli(year, month, day, hour, minute, second, millisecond, timezone...)
+func CreateFromDateTimeMilli(year, month, day, hour, minute, second, millisecond int, timezone ...string) *Carbon {
+ return create(year, month, day, hour, minute, second, millisecond*1e6, timezone...)
}
// CreateFromDateTimeMicro creates a Carbon instance from a given date, time and microsecond.
-// 从给定的年、月、日、时、分、秒、微秒创建 Carbon 实例
-func (c Carbon) CreateFromDateTimeMicro(year, month, day, hour, minute, second, microsecond int, timezone ...string) Carbon {
- return c.create(year, month, day, hour, minute, second, microsecond*1e3, timezone...)
-}
-
-// CreateFromDateTimeMicro creates a Carbon instance from a given date, time and microsecond.
-// 从给定的年、月、日、时、分、秒、微秒创建 Carbon 实例
-func CreateFromDateTimeMicro(year, month, day, hour, minute, second, microsecond int, timezone ...string) Carbon {
- return NewCarbon().CreateFromDateTimeMicro(year, month, day, hour, minute, second, microsecond, timezone...)
+func CreateFromDateTimeMicro(year, month, day, hour, minute, second, microsecond int, timezone ...string) *Carbon {
+ return create(year, month, day, hour, minute, second, microsecond*1e3, timezone...)
}
// CreateFromDateTimeNano creates a Carbon instance from a given date, time and nanosecond.
-// 从给定的年、月、日、时、分、秒、纳秒创建 Carbon 实例
-func (c Carbon) CreateFromDateTimeNano(year, month, day, hour, minute, second, nanosecond int, timezone ...string) Carbon {
- return c.create(year, month, day, hour, minute, second, nanosecond, timezone...)
-}
-
-// CreateFromDateTimeNano creates a Carbon instance from a given date, time and nanosecond.
-// 从给定的年、月、日、时、分、秒、纳秒创建 Carbon 实例
-func CreateFromDateTimeNano(year, month, day, hour, minute, second, nanosecond int, timezone ...string) Carbon {
- return NewCarbon().CreateFromDateTimeNano(year, month, day, hour, minute, second, nanosecond, timezone...)
+func CreateFromDateTimeNano(year, month, day, hour, minute, second, nanosecond int, timezone ...string) *Carbon {
+ return create(year, month, day, hour, minute, second, nanosecond, timezone...)
}
// CreateFromDate creates a Carbon instance from a given date.
-// 从给定的年、月、日创建 Carbon 实例
-func (c Carbon) CreateFromDate(year, month, day int, timezone ...string) Carbon {
- return c.create(year, month, day, 0, 0, 0, 0, timezone...)
-}
-
-// CreateFromDate creates a Carbon instance from a given date.
-// 从给定的年、月、日创建 Carbon 实例
-func CreateFromDate(year, month, day int, timezone ...string) Carbon {
- return NewCarbon().CreateFromDate(year, month, day, timezone...)
+func CreateFromDate(year, month, day int, timezone ...string) *Carbon {
+ return create(year, month, day, 0, 0, 0, 0, timezone...)
}
// CreateFromDateMilli creates a Carbon instance from a given date and millisecond.
-// 从给定的年、月、日、毫秒创建 Carbon 实例
-func (c Carbon) CreateFromDateMilli(year, month, day, millisecond int, timezone ...string) Carbon {
- return c.create(year, month, day, 0, 0, 0, millisecond*1e6, timezone...)
-}
-
-// CreateFromDateMilli creates a Carbon instance from a given date and millisecond.
-// 从给定的年、月、日、毫秒创建 Carbon 实例
-func CreateFromDateMilli(year, month, day, millisecond int, timezone ...string) Carbon {
- return NewCarbon().CreateFromDateMilli(year, month, day, millisecond, timezone...)
+func CreateFromDateMilli(year, month, day, millisecond int, timezone ...string) *Carbon {
+ return create(year, month, day, 0, 0, 0, millisecond*1e6, timezone...)
}
// CreateFromDateMicro creates a Carbon instance from a given date and microsecond.
-// 从给定的年、月、日、微秒创建 Carbon 实例
-func (c Carbon) CreateFromDateMicro(year, month, day, microsecond int, timezone ...string) Carbon {
- return c.create(year, month, day, 0, 0, 0, microsecond*1e3, timezone...)
-}
-
-// CreateFromDateMicro creates a Carbon instance from a given date and microsecond.
-// 从给定的年、月、日、微秒创建 Carbon 实例
-func CreateFromDateMicro(year, month, day, microsecond int, timezone ...string) Carbon {
- return NewCarbon().CreateFromDateMicro(year, month, day, microsecond, timezone...)
+func CreateFromDateMicro(year, month, day, microsecond int, timezone ...string) *Carbon {
+ return create(year, month, day, 0, 0, 0, microsecond*1e3, timezone...)
}
// CreateFromDateNano creates a Carbon instance from a given date and nanosecond.
-// 从给定的年、月、日、纳秒创建 Carbon 实例
-func (c Carbon) CreateFromDateNano(year, month, day, nanosecond int, timezone ...string) Carbon {
- return c.create(year, month, day, 0, 0, 0, nanosecond, timezone...)
-}
-
-// CreateFromDateNano creates a Carbon instance from a given date and nanosecond.
-// 从给定的年、月、日、纳秒创建 Carbon 实例
-func CreateFromDateNano(year, month, day, nanosecond int, timezone ...string) Carbon {
- return NewCarbon().CreateFromDateNano(year, month, day, nanosecond, timezone...)
+func CreateFromDateNano(year, month, day, nanosecond int, timezone ...string) *Carbon {
+ return create(year, month, day, 0, 0, 0, nanosecond, timezone...)
}
// CreateFromTime creates a Carbon instance from a given time(year, month and day are taken from the current time).
-// 从给定的时、分、秒创建 Carbon 实例(年、月、日取自当前时间)
-func (c Carbon) CreateFromTime(hour, minute, second int, timezone ...string) Carbon {
- year, month, day := c.Now(timezone...).Date()
- return c.create(year, month, day, hour, minute, second, 0, timezone...)
-}
-
-// CreateFromTime creates a Carbon instance from a given time(year, month and day are taken from the current time).
-// 从给定的时、分、秒创建 Carbon 实例(年、月、日取自当前时间)
-func CreateFromTime(hour, minute, second int, timezone ...string) Carbon {
- return NewCarbon().CreateFromTime(hour, minute, second, timezone...)
+func CreateFromTime(hour, minute, second int, timezone ...string) *Carbon {
+ year, month, day := Now(timezone...).Date()
+ return create(year, month, day, hour, minute, second, 0, timezone...)
}
// CreateFromTimeMilli creates a Carbon instance from a given time and millisecond(year, month and day are taken from the current time).
-// 从给定的时、分、秒、毫秒创建 Carbon 实例(年、月、日取自当前时间)
-func (c Carbon) CreateFromTimeMilli(hour, minute, second, millisecond int, timezone ...string) Carbon {
- year, month, day := c.Now(timezone...).Date()
- return c.create(year, month, day, hour, minute, second, millisecond*1e6, timezone...)
-}
-
-// CreateFromTimeMilli creates a Carbon instance from a given time and millisecond(year, month and day are taken from the current time).
-// 从给定的时、分、秒、毫秒创建 Carbon 实例(年、月、日取自当前时间)
-func CreateFromTimeMilli(hour, minute, second, millisecond int, timezone ...string) Carbon {
- return NewCarbon().CreateFromTimeMilli(hour, minute, second, millisecond, timezone...)
+func CreateFromTimeMilli(hour, minute, second, millisecond int, timezone ...string) *Carbon {
+ year, month, day := Now(timezone...).Date()
+ return create(year, month, day, hour, minute, second, millisecond*1e6, timezone...)
}
// CreateFromTimeMicro creates a Carbon instance from a given time and microsecond(year, month and day are taken from the current time).
-// 从给定的时、分、秒、微秒创建 Carbon 实例(年、月、日取自当前时间)
-func (c Carbon) CreateFromTimeMicro(hour, minute, second, microsecond int, timezone ...string) Carbon {
- year, month, day := c.Now(timezone...).Date()
- return c.create(year, month, day, hour, minute, second, microsecond*1e3, timezone...)
-}
-
-// CreateFromTimeMicro creates a Carbon instance from a given time and microsecond(year, month and day are taken from the current time).
-// 从给定的时、分、秒、微秒创建 Carbon 实例(年、月、日取自当前时间)
-func CreateFromTimeMicro(hour, minute, second, microsecond int, timezone ...string) Carbon {
- return NewCarbon().CreateFromTimeMicro(hour, minute, second, microsecond, timezone...)
+func CreateFromTimeMicro(hour, minute, second, microsecond int, timezone ...string) *Carbon {
+ year, month, day := Now(timezone...).Date()
+ return create(year, month, day, hour, minute, second, microsecond*1e3, timezone...)
}
// CreateFromTimeNano creates a Carbon instance from a given time and nanosecond(year, month and day are taken from the current time).
-// 从给定的时、分、秒、纳秒创建 Carbon 实例(年、月、日取自当前时间)
-func (c Carbon) CreateFromTimeNano(hour, minute, second, nanosecond int, timezone ...string) Carbon {
- year, month, day := c.Now(timezone...).Date()
- return c.create(year, month, day, hour, minute, second, nanosecond, timezone...)
+func CreateFromTimeNano(hour, minute, second, nanosecond int, timezone ...string) *Carbon {
+ year, month, day := Now(timezone...).Date()
+ return create(year, month, day, hour, minute, second, nanosecond, timezone...)
}
-// CreateFromTimeNano creates a Carbon instance from a given time and nanosecond(year, month and day are taken from the current time).
-// 从给定的时、分、秒、纳秒创建 Carbon 实例(年、月、日取自当前时间)
-func CreateFromTimeNano(hour, minute, second, nanosecond int, timezone ...string) Carbon {
- return NewCarbon().CreateFromTimeNano(hour, minute, second, nanosecond, timezone...)
-}
-
-// creates a Carbon instance from a given date, time and nanosecond.
-// 从给定的年、月、日、时、分、秒、纳秒创建 Carbon 实例
-func (c Carbon) create(year, month, day, hour, minute, second, nanosecond int, timezone ...string) Carbon {
+// creates a new Carbon instance from a given date, time and nanosecond.
+func create(year, month, day, hour, minute, second, nanosecond int, timezone ...string) *Carbon {
+ var (
+ tz string
+ loc *Location
+ err error
+ )
if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
}
- if c.Error != nil {
- return c
+ if loc, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
+ }
+ return NewCarbon(time.Date(year, time.Month(month), day, hour, minute, second, nanosecond, loc))
+}
+
+// creates a new Carbon instance from a given date, time and nanosecond based on the existing Carbon.
+func (c *Carbon) create(year, month, day, hour, minute, second, nanosecond int) *Carbon {
+ return &Carbon{
+ time: time.Date(year, time.Month(month), day, hour, minute, second, nanosecond, c.loc),
+ weekStartsAt: c.weekStartsAt,
+ weekendDays: c.weekendDays,
+ loc: c.loc,
+ lang: c.lang.Copy(),
+ currentLayout: c.currentLayout,
+ isEmpty: c.isEmpty,
+ Error: c.Error,
}
- c.time = time.Date(year, time.Month(month), day, hour, minute, second, nanosecond, c.loc)
- return c
}
diff --git a/vendor/github.com/dromara/carbon/v2/database.go b/vendor/github.com/dromara/carbon/v2/database.go
deleted file mode 100644
index 3069eb73..00000000
--- a/vendor/github.com/dromara/carbon/v2/database.go
+++ /dev/null
@@ -1,890 +0,0 @@
-package carbon
-
-import (
- "bytes"
- "database/sql/driver"
- "errors"
- "fmt"
- "strconv"
- "time"
-)
-
-// returns a failed scan error.
-// 失败的扫描错误
-var failedScanError = func(src interface{}) error {
- return errors.New(fmt.Sprintf("failed to scan value: %v", src))
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (c *Carbon) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *c = Parse(string(v))
- case string:
- *c = Parse(v)
- case time.Time:
- *c = CreateFromStdTime(v)
- }
- if c.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (c Carbon) Value() (driver.Value, error) {
- if c.IsZero() {
- return nil, nil
- }
- return c.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for Carbon struct.
-// 实现 json.Marshaler 接口
-func (c Carbon) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, c.Layout(c.layout))), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for Carbon struct.
-// 实现 json.Unmarshaler 接口
-func (c *Carbon) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- *c = ParseByLayout(value, c.layout)
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *DateTime) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewDateTime(Parse(string(v)))
- case string:
- *t = NewDateTime(Parse(v))
- case time.Time:
- *t = NewDateTime(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *DateTime) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for DateTime struct.
-// 实现 MarshalJSON 接口
-func (t DateTime) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToDateTimeString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for DateTime struct.
-// 实现 UnmarshalJSON 接口
-func (t *DateTime) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- c := ParseByLayout(value, DateTimeLayout)
- if c.Error == nil {
- *t = NewDateTime(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *DateTimeMilli) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewDateTimeMilli(Parse(string(v)))
- case string:
- *t = NewDateTimeMilli(Parse(v))
- case time.Time:
- *t = NewDateTimeMilli(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *DateTimeMilli) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for DateTimeMilli struct.
-// 实现 MarshalJSON 接口
-func (t DateTimeMilli) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToDateTimeMilliString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for DateTimeMilli struct.
-// 实现 UnmarshalJSON 接口
-func (t *DateTimeMilli) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- c := ParseByLayout(value, DateTimeMilliLayout)
- if c.Error == nil {
- *t = NewDateTimeMilli(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *DateTimeMicro) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewDateTimeMicro(Parse(string(v)))
- case string:
- *t = NewDateTimeMicro(Parse(v))
- case time.Time:
- *t = NewDateTimeMicro(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *DateTimeMicro) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for DateTimeMicro struct.
-// 实现 MarshalJSON 接口
-func (t DateTimeMicro) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToDateTimeMicroString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for DateTimeMicro struct.
-// 实现 UnmarshalJSON 接口
-func (t *DateTimeMicro) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- c := ParseByLayout(value, DateTimeMicroLayout)
- if c.Error == nil {
- *t = NewDateTimeMicro(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *DateTimeNano) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewDateTimeNano(Parse(string(v)))
- case string:
- *t = NewDateTimeNano(Parse(v))
- case time.Time:
- *t = NewDateTimeNano(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *DateTimeNano) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for DateTimeNano struct.
-// 实现 MarshalJSON 接口
-func (t DateTimeNano) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToDateTimeNanoString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for DateTimeNano struct.
-// 实现 UnmarshalJSON 接口
-func (t *DateTimeNano) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- c := ParseByLayout(value, DateTimeNanoLayout)
- if c.Error == nil {
- *t = NewDateTimeNano(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *Date) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewDate(Parse(string(v)))
- case string:
- *t = NewDate(Parse(v))
- case time.Time:
- *t = NewDate(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *Date) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for Date struct.
-// 实现 MarshalJSON 接口
-func (t Date) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToDateString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for Date struct.
-// 实现 UnmarshalJSON 接口
-func (t *Date) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- c := ParseByLayout(value, DateLayout)
- if c.Error == nil {
- *t = NewDate(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *DateMilli) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewDateMilli(Parse(string(v)))
- case string:
- *t = NewDateMilli(Parse(v))
- case time.Time:
- *t = NewDateMilli(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *DateMilli) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for DateMilli struct.
-// 实现 MarshalJSON 接口
-func (t DateMilli) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToDateMilliString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for DateMilli struct.
-// 实现 UnmarshalJSON 接口
-func (t *DateMilli) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- c := ParseByLayout(value, DateMilliLayout)
- if c.Error == nil {
- *t = NewDateMilli(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *DateMicro) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewDateMicro(Parse(string(v)))
- case string:
- *t = NewDateMicro(Parse(v))
- case time.Time:
- *t = NewDateMicro(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *DateMicro) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for DateMicro struct.
-// 实现 MarshalJSON 接口
-func (t DateMicro) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToDateMicroString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for DateMicro struct.
-// 实现 UnmarshalJSON 接口
-func (t *DateMicro) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- c := ParseByLayout(value, DateMicroLayout)
- if c.Error == nil {
- *t = NewDateMicro(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *DateNano) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewDateNano(Parse(string(v)))
- case string:
- *t = NewDateNano(Parse(v))
- case time.Time:
- *t = NewDateNano(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *DateNano) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for DateNano struct.
-// 实现 MarshalJSON 接口
-func (t DateNano) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToDateNanoString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for DateNano struct.
-// 实现 UnmarshalJSON 接口
-func (t *DateNano) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- c := ParseByLayout(value, DateNanoLayout)
- if c.Error == nil {
- *t = NewDateNano(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *Time) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewTime(Parse(string(v)))
- case string:
- *t = NewTime(Parse(v))
- case time.Time:
- *t = NewTime(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *Time) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for Time struct.
-// 实现 MarshalJSON 接口
-func (t Time) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToTimeString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for Time struct.
-// 实现 UnmarshalJSON 接口
-func (t *Time) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- year, month, day := Now().Date()
- c := ParseByLayout(fmt.Sprintf("%d-%02d-%02d %s", year, month, day, value), DateTimeLayout)
- fmt.Println("c", c)
- if c.Error == nil {
- *t = NewTime(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *TimeMilli) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewTimeMilli(Parse(string(v)))
- case string:
- *t = NewTimeMilli(Parse(v))
- case time.Time:
- *t = NewTimeMilli(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *TimeMilli) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for TimeMilli struct.
-// 实现 MarshalJSON 接口
-func (t TimeMilli) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToTimeMilliString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for TimeMilli struct.
-// 实现 UnmarshalJSON 接口
-func (t *TimeMilli) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- year, month, day := Now().Date()
- c := ParseByLayout(fmt.Sprintf("%d-%02d-%02d %s", year, month, day, value), DateTimeMilliLayout)
- if c.Error == nil {
- *t = NewTimeMilli(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *TimeMicro) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewTimeMicro(Parse(string(v)))
- case string:
- *t = NewTimeMicro(Parse(v))
- case time.Time:
- *t = NewTimeMicro(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *TimeMicro) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for TimeMicro struct.
-// 实现 MarshalJSON 接口
-func (t TimeMicro) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToTimeMicroString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for TimeMicro struct.
-// 实现 UnmarshalJSON 接口
-func (t *TimeMicro) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- year, month, day := Now().Date()
- c := ParseByLayout(fmt.Sprintf("%d-%02d-%02d %s", year, month, day, value), DateTimeMicroLayout)
- if c.Error == nil {
- *t = NewTimeMicro(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *TimeNano) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewTimeNano(Parse(string(v)))
- case string:
- *t = NewTimeNano(Parse(v))
- case time.Time:
- *t = NewTimeNano(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *TimeNano) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for TimeNano struct.
-// 实现 MarshalJSON 接口
-func (t TimeNano) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, t.ToTimeNanoString())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for TimeNano struct.
-// 实现 UnmarshalJSON 接口
-func (t *TimeNano) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- year, month, day := Now().Date()
- c := ParseByLayout(fmt.Sprintf("%d-%02d-%02d %s", year, month, day, value), DateTimeNanoLayout)
- if c.Error == nil {
- *t = NewTimeNano(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *Timestamp) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewTimestamp(Parse(string(v)))
- case string:
- *t = NewTimestamp(Parse(v))
- case time.Time:
- *t = NewTimestamp(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *Timestamp) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for Timestamp struct.
-// 实现 MarshalJSON 接口
-func (t Timestamp) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`%d`, t.Timestamp())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for Timestamp struct.
-// 实现 UnmarshalJSON 接口
-func (t *Timestamp) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- ts, _ := strconv.ParseInt(value, 10, 64)
- c := CreateFromTimestamp(ts)
- if c.Error == nil {
- *t = NewTimestamp(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *TimestampMilli) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewTimestampMilli(Parse(string(v)))
- case string:
- *t = NewTimestampMilli(Parse(v))
- case time.Time:
- *t = NewTimestampMilli(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *TimestampMilli) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for TimestampMilli struct.
-// 实现 MarshalJSON 接口
-func (t TimestampMilli) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`%d`, t.TimestampMilli())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for TimestampMilli struct.
-// 实现 UnmarshalJSON 接口
-func (t *TimestampMilli) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- ts, _ := strconv.ParseInt(value, 10, 64)
- c := CreateFromTimestampMilli(ts)
- if c.Error == nil {
- *t = NewTimestampMilli(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *TimestampMicro) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewTimestampMicro(Parse(string(v)))
- case string:
- *t = NewTimestampMicro(Parse(v))
- case time.Time:
- *t = NewTimestampMicro(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *TimestampMicro) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface MarshalJSON for TimestampMicro struct.
-// 实现 MarshalJSON 接口
-func (t TimestampMicro) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`%d`, t.TimestampMicro())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for TimestampMicro struct.
-// 实现 UnmarshalJSON 接口
-func (t *TimestampMicro) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- ts, _ := strconv.ParseInt(value, 10, 64)
- c := CreateFromTimestampMicro(ts)
- if c.Error == nil {
- *t = NewTimestampMicro(c)
- }
- return c.Error
-}
-
-// Scan an interface used by Scan in package database/sql for Scanning value from database to local golang variable.
-func (t *TimestampNano) Scan(src interface{}) error {
- switch v := src.(type) {
- case []byte:
- *t = NewTimestampNano(Parse(string(v)))
- case string:
- *t = NewTimestampNano(Parse(v))
- case time.Time:
- *t = NewTimestampNano(CreateFromStdTime(v))
- }
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
-}
-
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *TimestampNano) Value() (driver.Value, error) {
- if t.IsZero() {
- return nil, nil
- }
- return t.StdTime(), nil
-}
-
-// MarshalJSON implements the interface json.Marshal for TimestampNano struct.
-// 实现 MarshalJSON 接口
-func (t TimestampNano) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`%d`, t.TimestampNano())), nil
-}
-
-// UnmarshalJSON implements the interface json.Unmarshal for TimestampNano struct.
-// 实现 UnmarshalJSON 接口
-func (t *TimestampNano) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
- return nil
- }
- ts, _ := strconv.ParseInt(value, 10, 64)
- c := CreateFromTimestampNano(ts)
- if c.Error == nil {
- *t = NewTimestampNano(c)
- }
- return c.Error
-}
-
-// Int64 outputs timestamp with second.
-// 输出秒级时间戳
-func (t Timestamp) Int64() int64 {
- return t.Timestamp()
-}
-
-// Int64 outputs timestamp with millisecond.
-// 输出豪秒级时间戳
-func (t TimestampMilli) Int64() int64 {
- return t.TimestampMilli()
-}
-
-// Int64 outputs timestamp with microsecond.
-// 输出微秒级时间戳
-func (t TimestampMicro) Int64() int64 {
- return t.TimestampMicro()
-}
-
-// Int64 outputs timestamp with nanosecond.
-// 输出纳秒级时间戳
-func (t TimestampNano) Int64() int64 {
- return t.TimestampNano()
-}
-
-// String implements the interface Stringer for DateTime struct.
-// 实现 Stringer 接口
-func (t DateTime) String() string {
- return t.ToDateTimeString()
-}
-
-// String implements the interface Stringer for DateTimeMilli struct.
-// 实现 Stringer 接口
-func (t DateTimeMilli) String() string {
- return t.ToDateTimeMilliString()
-}
-
-// String implements the interface Stringer for DateTimeMicro struct.
-// 实现 Stringer 接口
-func (t DateTimeMicro) String() string {
- return t.ToDateTimeMicroString()
-}
-
-// String implements the interface Stringer for DateTimeNano struct.
-// 实现 Stringer 接口
-func (t DateTimeNano) String() string {
- return t.ToDateTimeNanoString()
-}
-
-// String implements the interface Stringer for Date struct.
-// 实现 Stringer 接口
-func (t Date) String() string {
- return t.ToDateString()
-}
-
-// String implements the interface Stringer for DateMilli struct.
-// 实现 Stringer 接口
-func (t DateMilli) String() string {
- return t.ToDateMilliString()
-}
-
-// String implements the interface Stringer for DateMicro struct.
-// 实现 Stringer 接口
-func (t DateMicro) String() string {
- return t.ToDateMicroString()
-}
-
-// String implements the interface Stringer for DateNano struct.
-// 实现 Stringer 接口
-func (t DateNano) String() string {
- return t.ToDateNanoString()
-}
-
-// String implements the interface Stringer for Time struct.
-// 实现 Stringer 接口
-func (t Time) String() string {
- return t.ToTimeString()
-}
-
-// String implements the interface Stringer for TimeMilli struct.
-// 实现 Stringer 接口
-func (t TimeMilli) String() string {
- return t.ToTimeMilliString()
-}
-
-// String implements the interface Stringer for TimeMicro struct.
-// 实现 Stringer 接口
-func (t TimeMicro) String() string {
- return t.ToTimeMicroString()
-}
-
-// String implements the interface Stringer for TimeNano struct.
-// 实现 Stringer 接口
-func (t TimeNano) String() string {
- return t.ToTimeNanoString()
-}
-
-// String implements the interface Stringer for Timestamp struct.
-// 实现 Stringer 接口
-func (t Timestamp) String() string {
- return strconv.FormatInt(t.Timestamp(), 10)
-}
-
-// String implements the interface Stringer for TimestampMilli struct.
-// 实现 Stringer 接口
-func (t TimestampMilli) String() string {
- return strconv.FormatInt(t.TimestampMilli(), 10)
-}
-
-// String implements the interface Stringer for TimestampMicro struct.
-// 实现 Stringer 接口
-func (t TimestampMicro) String() string {
- return strconv.FormatInt(t.TimestampMicro(), 10)
-}
-
-// String implements the interface Stringer for TimestampNano struct.
-// 实现 Stringer 接口
-func (t TimestampNano) String() string {
- return strconv.FormatInt(t.TimestampNano(), 10)
-}
diff --git a/vendor/github.com/dromara/carbon/v2/default.go b/vendor/github.com/dromara/carbon/v2/default.go
index aab8ca60..f3cddb2b 100644
--- a/vendor/github.com/dromara/carbon/v2/default.go
+++ b/vendor/github.com/dromara/carbon/v2/default.go
@@ -1,45 +1,58 @@
package carbon
var (
- // default layout
- // 默认布局模板
- defaultLayout = DateTimeLayout
+ // DefaultLayout default layout
+ DefaultLayout = DateTimeLayout
- // default timezone
- // 默认时区
- defaultTimezone = Local
+ // DefaultTimezone default timezone
+ DefaultTimezone = UTC
- // default week start date
- // 默认一周开始日期
- defaultWeekStartsAt = Sunday
+ // DefaultLocale default language locale
+ DefaultLocale = "en"
- // default language locale
- // 默认语言区域
- defaultLocale = "en"
+ // DefaultWeekStartsAt default start date of the week
+ DefaultWeekStartsAt = Monday
+
+ // DefaultWeekendDays default weekend days of the week
+ DefaultWeekendDays = []Weekday{
+ Saturday, Sunday,
+ }
)
-// Default defines a Default struct.
-// 定义 Default 结构体
type Default struct {
Layout string
Timezone string
- WeekStartsAt string
Locale string
+ WeekStartsAt Weekday
+ WeekendDays []Weekday
}
// SetDefault sets default.
-// 设置全局默认值
func SetDefault(d Default) {
if d.Layout != "" {
- defaultLayout = d.Layout
+ DefaultLayout = d.Layout
}
if d.Timezone != "" {
- defaultTimezone = d.Timezone
- }
- if d.WeekStartsAt != "" {
- defaultWeekStartsAt = d.WeekStartsAt
+ DefaultTimezone = d.Timezone
}
if d.Locale != "" {
- defaultLocale = d.Locale
+ DefaultLocale = d.Locale
+ }
+ if d.WeekStartsAt.String() != "" {
+ DefaultWeekStartsAt = d.WeekStartsAt
+ }
+ if len(d.WeekendDays) > 0 {
+ DefaultWeekendDays = d.WeekendDays
+ }
+}
+
+// ResetDefault resets default.
+func ResetDefault() {
+ DefaultLayout = DateTimeLayout
+ DefaultTimezone = UTC
+ DefaultLocale = "en"
+ DefaultWeekStartsAt = Monday
+ DefaultWeekendDays = []Weekday{
+ Saturday, Sunday,
}
}
diff --git a/vendor/github.com/dromara/carbon/v2/difference.go b/vendor/github.com/dromara/carbon/v2/difference.go
index 414be971..31dd5458 100644
--- a/vendor/github.com/dromara/carbon/v2/difference.go
+++ b/vendor/github.com/dromara/carbon/v2/difference.go
@@ -6,20 +6,20 @@ import (
"time"
)
-const (
- minDuration time.Duration = -1 << 63
- maxDuration time.Duration = 1<<63 - 1
-)
-
// DiffInYears gets the difference in years.
-// 相差多少年
-func (c Carbon) DiffInYears(carbon ...Carbon) int64 {
- start, end := c, c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
+func (c *Carbon) DiffInYears(carbon ...*Carbon) int64 {
+ start := c
+ if start.IsInvalid() {
+ return 0
}
+ var end *Carbon
if len(carbon) > 0 {
end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
+ }
+ if end.IsInvalid() {
+ return 0
}
dy, dm, dd := end.Year()-start.Year(), end.Month()-start.Month(), end.Day()-start.Day()
if dm < 0 || (dm == 0 && dd < 0) {
@@ -32,20 +32,24 @@ func (c Carbon) DiffInYears(carbon ...Carbon) int64 {
}
// DiffAbsInYears gets the difference in years with absolute value.
-// 相差多少年(绝对值)
-func (c Carbon) DiffAbsInYears(carbon ...Carbon) int64 {
+func (c *Carbon) DiffAbsInYears(carbon ...*Carbon) int64 {
return getAbsValue(c.DiffInYears(carbon...))
}
// DiffInMonths gets the difference in months.
-// 相差多少月
-func (c Carbon) DiffInMonths(carbon ...Carbon) int64 {
- start, end := c, c.Now()
- if start.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
+func (c *Carbon) DiffInMonths(carbon ...*Carbon) int64 {
+ start := c
+ if start.IsInvalid() {
+ return 0
}
+ var end *Carbon
if len(carbon) > 0 {
end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
+ }
+ if end.IsInvalid() {
+ return 0
}
if start.Month() == end.Month() && start.Year() == end.Year() {
return 0
@@ -56,182 +60,207 @@ func (c Carbon) DiffInMonths(carbon ...Carbon) int64 {
start, end = end, start
sign = -1
}
- months := getDiffInMonths(start, end, 0)
+ months := getDiffInMonths(start, end)
return months * int64(sign)
}
// DiffAbsInMonths gets the difference in months with absolute value.
-// 相差多少月(绝对值)
-func (c Carbon) DiffAbsInMonths(carbon ...Carbon) int64 {
+func (c *Carbon) DiffAbsInMonths(carbon ...*Carbon) int64 {
return getAbsValue(c.DiffInMonths(carbon...))
}
// DiffInWeeks gets the difference in weeks.
-// 相差多少周
-func (c Carbon) DiffInWeeks(carbon ...Carbon) int64 {
- start, end := c, c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
+func (c *Carbon) DiffInWeeks(carbon ...*Carbon) int64 {
+ start := c
+ if start.IsInvalid() {
+ return 0
}
+ var end *Carbon
if len(carbon) > 0 {
end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
+ }
+ if end.IsInvalid() {
+ return 0
}
return int64(math.Floor(float64((end.Timestamp() - start.Timestamp()) / (7 * 24 * 3600))))
}
// DiffAbsInWeeks gets the difference in weeks with absolute value.
-// 相差多少周(绝对值)
-func (c Carbon) DiffAbsInWeeks(carbon ...Carbon) int64 {
+func (c *Carbon) DiffAbsInWeeks(carbon ...*Carbon) int64 {
return getAbsValue(c.DiffInWeeks(carbon...))
}
// DiffInDays gets the difference in days.
-// 相差多少天
-func (c Carbon) DiffInDays(carbon ...Carbon) int64 {
- start, end := c, c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
+func (c *Carbon) DiffInDays(carbon ...*Carbon) int64 {
+ start := c
+ if start.IsInvalid() {
+ return 0
}
+ var end *Carbon
if len(carbon) > 0 {
end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
+ }
+ if end.IsInvalid() {
+ return 0
}
return int64(math.Floor(float64((end.Timestamp() - start.Timestamp()) / (24 * 3600))))
}
// DiffAbsInDays gets the difference in days with absolute value.
-// 相差多少天(绝对值)
-func (c Carbon) DiffAbsInDays(carbon ...Carbon) int64 {
+func (c *Carbon) DiffAbsInDays(carbon ...*Carbon) int64 {
return getAbsValue(c.DiffInDays(carbon...))
}
// DiffInHours gets the difference in hours.
-// 相差多少小时
-func (c Carbon) DiffInHours(carbon ...Carbon) int64 {
- end := c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
+func (c *Carbon) DiffInHours(carbon ...*Carbon) int64 {
+ start := c
+ if start.IsInvalid() {
+ return 0
}
+ var end *Carbon
if len(carbon) > 0 {
end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
}
- return c.DiffInSeconds(end) / SecondsPerHour
+ if end.IsInvalid() {
+ return 0
+ }
+ return start.DiffInSeconds(end) / SecondsPerHour
}
// DiffAbsInHours gets the difference in hours with absolute value.
-// 相差多少小时(绝对值)
-func (c Carbon) DiffAbsInHours(carbon ...Carbon) int64 {
+func (c *Carbon) DiffAbsInHours(carbon ...*Carbon) int64 {
return getAbsValue(c.DiffInHours(carbon...))
}
// DiffInMinutes gets the difference in minutes.
-// 相差多少分钟
-func (c Carbon) DiffInMinutes(carbon ...Carbon) int64 {
- end := c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
+func (c *Carbon) DiffInMinutes(carbon ...*Carbon) int64 {
+ start := c
+ if start.IsInvalid() {
+ return 0
}
+ var end *Carbon
if len(carbon) > 0 {
end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
}
- return c.DiffInSeconds(end) / SecondsPerMinute
+ if end.IsInvalid() {
+ return 0
+ }
+ return start.DiffInSeconds(end) / SecondsPerMinute
}
// DiffAbsInMinutes gets the difference in minutes with absolute value.
-// 相差多少分钟(绝对值)
-func (c Carbon) DiffAbsInMinutes(carbon ...Carbon) int64 {
+func (c *Carbon) DiffAbsInMinutes(carbon ...*Carbon) int64 {
return getAbsValue(c.DiffInMinutes(carbon...))
}
// DiffInSeconds gets the difference in seconds.
-// 相差多少秒
-func (c Carbon) DiffInSeconds(carbon ...Carbon) int64 {
- end := c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
+func (c *Carbon) DiffInSeconds(carbon ...*Carbon) int64 {
+ start := c
+ if start.IsInvalid() {
+ return 0
}
+ var end *Carbon
if len(carbon) > 0 {
end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
}
- return end.Timestamp() - c.Timestamp()
+ if end.IsInvalid() {
+ return 0
+ }
+ return end.Timestamp() - start.Timestamp()
}
// DiffAbsInSeconds gets the difference in seconds with absolute value.
-// 相差多少秒(绝对值)
-func (c Carbon) DiffAbsInSeconds(carbon ...Carbon) int64 {
+func (c *Carbon) DiffAbsInSeconds(carbon ...*Carbon) int64 {
return getAbsValue(c.DiffInSeconds(carbon...))
}
// DiffInString gets the difference in string, i18n is supported.
-// 相差字符串,支持i18n
-func (c Carbon) DiffInString(carbon ...Carbon) string {
- end := c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
- }
- if len(carbon) > 0 {
- end = carbon[0]
- }
- if c.Error != nil || end.Error != nil {
+func (c *Carbon) DiffInString(carbon ...*Carbon) string {
+ start := c
+ if start.IsInvalid() {
return ""
}
- unit, value := c.diff(end)
+ var end *Carbon
+ if len(carbon) > 0 {
+ end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
+ }
+ if end.IsInvalid() {
+ return ""
+ }
+ unit, value := start.diff(end)
return c.lang.translate(unit, value)
}
// DiffAbsInString gets the difference in string with absolute value, i18n is supported.
-// 相差字符串,支持i18n(绝对值)
-func (c Carbon) DiffAbsInString(carbon ...Carbon) string {
- end := c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
- }
- if len(carbon) > 0 {
- end = carbon[0]
- }
- if c.Error != nil || end.Error != nil {
+func (c *Carbon) DiffAbsInString(carbon ...*Carbon) string {
+ start := c
+ if start.IsInvalid() {
return ""
}
- unit, value := c.diff(end)
+ var end *Carbon
+ if len(carbon) > 0 {
+ end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
+ }
+ if end.IsInvalid() {
+ return ""
+ }
+ unit, value := start.diff(end)
return c.lang.translate(unit, getAbsValue(value))
}
// DiffInDuration gets the difference in duration.
-// 相差时长
-func (c Carbon) DiffInDuration(carbon ...Carbon) time.Duration {
- end := c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
+func (c *Carbon) DiffInDuration(carbon ...*Carbon) Duration {
+ start := c
+ if start.IsInvalid() {
+ return 0
}
+ var end *Carbon
if len(carbon) > 0 {
end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
}
- return end.StdTime().Sub(c.StdTime())
+ if end.IsInvalid() {
+ return 0
+ }
+ return end.StdTime().Sub(start.StdTime())
}
// DiffAbsInDuration gets the difference in duration with absolute value.
-// 相差时长(绝对值)
-func (c Carbon) DiffAbsInDuration(carbon ...Carbon) time.Duration {
- d := c.DiffInDuration(carbon...)
- if d >= 0 {
- return d
- }
- return -d
+func (c *Carbon) DiffAbsInDuration(carbon ...*Carbon) Duration {
+ return c.DiffInDuration(carbon...).Abs()
}
// DiffForHumans gets the difference in a human-readable format, i18n is supported.
-// 获取对人类友好的可读格式时间差,支持i18n
-func (c Carbon) DiffForHumans(carbon ...Carbon) string {
- end := c.Now()
- if c.IsSetTestNow() {
- end = CreateFromTimestampNano(c.testNow, c.Location())
- }
- if len(carbon) > 0 {
- end = carbon[0]
- }
- if c.Error != nil || end.Error != nil {
+func (c *Carbon) DiffForHumans(carbon ...*Carbon) string {
+ start := c
+ if start.IsInvalid() {
return ""
}
- unit, value := c.diff(end)
+ var end *Carbon
+ if len(carbon) > 0 {
+ end = carbon[0]
+ } else {
+ end = Now().SetLocation(c.loc)
+ }
+ if end.IsInvalid() {
+ return ""
+ }
+ unit, value := start.diff(end)
translation := c.lang.translate(unit, getAbsValue(value))
if unit == "now" {
return translation
@@ -249,8 +278,7 @@ func (c Carbon) DiffForHumans(carbon ...Carbon) string {
}
// gets the difference for unit and value.
-// 获取相差单位和差值
-func (c Carbon) diff(end Carbon) (unit string, value int64) {
+func (c *Carbon) diff(end *Carbon) (unit string, value int64) {
switch true {
case c.DiffAbsInYears(end) > 0:
unit = "year"
@@ -280,13 +308,15 @@ func (c Carbon) diff(end Carbon) (unit string, value int64) {
return
}
-func getDiffInMonths(start, end Carbon, months int64) int64 {
- next := start.AddDays(start.DaysInMonth())
- days := next.DiffInDays(end)
- seconds := next.DiffInSeconds(end)
- if days < 0 || (days == 0 && seconds < 0) {
- return months
+func getDiffInMonths(start, end *Carbon) int64 {
+ if start.IsInvalid() || end.IsInvalid() {
+ return 0
}
- months += 1
- return getDiffInMonths(next, end, months)
+ sy, sm, d, h, i, s, ns := start.DateTimeNano()
+ ey, em, _ := end.Date()
+ dm := (ey-sy)*12 + (em - sm)
+ if time.Date(sy, time.Month(sm+dm), d, h, i, s, ns, start.StdTime().Location()).After(end.StdTime()) {
+ return int64(dm - 1)
+ }
+ return int64(dm)
}
diff --git a/vendor/github.com/dromara/carbon/v2/errors.go b/vendor/github.com/dromara/carbon/v2/errors.go
index 0f2ca0b5..73df0936 100644
--- a/vendor/github.com/dromara/carbon/v2/errors.go
+++ b/vendor/github.com/dromara/carbon/v2/errors.go
@@ -4,38 +4,94 @@ import (
"fmt"
)
-// returns an invalid timezone error.
-// 无效的时区错误
-var invalidTimezoneError = func(timezone string) error {
- return fmt.Errorf("invalid timezone %q, please see the file %q for all valid timezones", timezone, "$GOROOT/lib/time/zoneinfo.zip")
-}
+var (
+ // ErrFailedParse failed to parse error.
+ ErrFailedParse = func(value any) error {
+ return fmt.Errorf("failed to parse %v as carbon", value)
+ }
-// returns an invalid location error.
-// 无效的地区错误
-var invalidLocationError = func() error {
- return fmt.Errorf("invalid location, please make sure the location is valid")
-}
+ // ErrFailedScan failed to scan error.
+ ErrFailedScan = func(value any) error {
+ return fmt.Errorf("failed to scan %v as carbon", value)
+ }
-// returns an invalid duration error.
-// 无效的时长错误
-var invalidDurationError = func(duration string) error {
- return fmt.Errorf("invalid duration %q, please make sure the duration is valid", duration)
-}
+ // ErrInvalidTimestamp invalid timestamp error.
+ ErrInvalidTimestamp = func(value string) error {
+ return fmt.Errorf("invalid timestamp %v", value)
+ }
-// returns an invalid value error.
-// 无效的时间字符串错误
-var invalidValueError = func(value string) error {
- return fmt.Errorf("cannot parse string %q as carbon, please make sure the value is valid", value)
-}
+ // ErrNilLocation nil location error.
+ ErrNilLocation = func() error {
+ return fmt.Errorf("location cannot be nil")
+ }
-// returns an invalid layout error.
-// 无效的布局模板错误
-var invalidLayoutError = func(value, layout string) error {
- return fmt.Errorf("cannot parse string %q as carbon by layout %q, please make sure the value and layout match", value, layout)
-}
+ // ErrNilLanguage nil language error.
+ ErrNilLanguage = func() error {
+ return fmt.Errorf("language cannot be nil")
+ }
-// returns an invalid format error.
-// 无效的格式模板错误
-var invalidFormatError = func(value, format string) error {
- return fmt.Errorf("cannot parse string %q as carbon by format %q, please make sure the value and format match", value, format)
-}
+ // ErrInvalidLanguage invalid language error.
+ ErrInvalidLanguage = func(lang *Language) error {
+ return fmt.Errorf("invalid Language %v", lang)
+ }
+
+ // ErrEmptyLocale empty locale error.
+ ErrEmptyLocale = func() error {
+ return fmt.Errorf("locale cannot be empty")
+ }
+
+ // ErrNotExistLocale not exist locale error.
+ ErrNotExistLocale = func(locale string) error {
+ return fmt.Errorf("locale %q doesn't exist", locale)
+ }
+
+ // ErrEmptyResources empty resources error.
+ ErrEmptyResources = func() error {
+ return fmt.Errorf("resources cannot be empty")
+ }
+
+ // ErrInvalidResourcesError invalid resources error.
+ ErrInvalidResourcesError = func(resources map[string]string) error {
+ return fmt.Errorf("invalid resources %v", resources)
+ }
+
+ // ErrEmptyTimezone empty timezone error.
+ ErrEmptyTimezone = func() error {
+ return fmt.Errorf("timezone cannot be empty")
+ }
+
+ // ErrInvalidTimezone invalid timezone error.
+ ErrInvalidTimezone = func(timezone string) error {
+ return fmt.Errorf("invalid timezone %q, please see the file %q for all valid timezones", timezone, "$GOROOT/lib/time/zoneinfo.zip")
+ }
+
+ // ErrEmptyDuration empty duration error.
+ ErrEmptyDuration = func() error {
+ return fmt.Errorf("duration cannot be empty")
+ }
+
+ // ErrInvalidDuration invalid duration error.
+ ErrInvalidDuration = func(duration string) error {
+ return fmt.Errorf("invalid duration %q", duration)
+ }
+
+ // ErrEmptyLayout empty layout error.
+ ErrEmptyLayout = func() error {
+ return fmt.Errorf("layout cannot be empty")
+ }
+
+ // ErrMismatchedLayout mismatched layout error.
+ ErrMismatchedLayout = func(value, layout string) error {
+ return fmt.Errorf("value %q and layout %q are mismatched", value, layout)
+ }
+
+ // ErrEmptyFormat empty format error.
+ ErrEmptyFormat = func() error {
+ return fmt.Errorf("format cannot be empty")
+ }
+
+ // ErrMismatchedFormat mismatched format error.
+ ErrMismatchedFormat = func(value, format string) error {
+ return fmt.Errorf("value %q and format %q are mismatched", value, format)
+ }
+)
diff --git a/vendor/github.com/dromara/carbon/v2/extremum.go b/vendor/github.com/dromara/carbon/v2/extremum.go
index 22a39a78..ed98f61e 100644
--- a/vendor/github.com/dromara/carbon/v2/extremum.go
+++ b/vendor/github.com/dromara/carbon/v2/extremum.go
@@ -1,52 +1,55 @@
package carbon
-// MaxValue returns a Carbon instance for the greatest supported date.
-// 返回 Carbon 的最大值
-func MaxValue() Carbon {
- return NewCarbon().create(9999, 12, 31, 23, 59, 59, 999999999, UTC)
+import "time"
+
+const (
+ minDuration Duration = -1 << 63
+ maxDuration Duration = 1<<63 - 1
+)
+
+// ZeroValue returns the zero value of Carbon instance.
+func ZeroValue() *Carbon {
+ return MinValue()
}
-// MinValue returns a Carbon instance for the lowest supported date.
-// 返回 Carbon 的最小值
-func MinValue() Carbon {
- return NewCarbon().create(-9998, 1, 1, 0, 0, 0, 0, UTC)
+// EpochValue returns the unix epoch value of Carbon instance.
+func EpochValue() *Carbon {
+ return NewCarbon(time.Date(EpochYear, time.January, 1, 0, 0, 0, 0, time.UTC))
}
-// Closest returns the closest Carbon instance from the given Carbon instance.
-// 返回离给定 carbon 实例最近的 Carbon 实例
-func (c Carbon) Closest(c1 Carbon, c2 Carbon) Carbon {
- if c1.Error != nil {
- return c2
- }
- if c2.Error != nil {
- return c1
- }
- if c.DiffAbsInSeconds(c1) < c.DiffAbsInSeconds(c2) {
- return c1
- }
- return c2
+// MaxValue returns the maximum value of Carbon instance.
+func MaxValue() *Carbon {
+ return NewCarbon(time.Date(9999, time.December, 31, 23, 59, 59, 999999999, time.UTC))
}
-// Farthest returns the farthest Carbon instance from the given Carbon instance.
-// 返回离给定 carbon 实例最远的 Carbon 实例
-func (c Carbon) Farthest(c1 Carbon, c2 Carbon) Carbon {
- if c1.IsZero() || c1.IsInvalid() {
- return c2
- }
- if c2.IsZero() || c2.IsInvalid() {
- return c1
- }
- if c.DiffAbsInSeconds(c1) > c.DiffAbsInSeconds(c2) {
- return c1
- }
- return c2
+// MinValue returns the minimum value of Carbon instance.
+func MinValue() *Carbon {
+ return NewCarbon(time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC))
}
-// Max returns the maximum Carbon instance from the given Carbon instance (second-precision).
-// 返回最大的 Carbon 实例
-func Max(c1 Carbon, c2 ...Carbon) (c Carbon) {
+// MaxDuration returns the maximum value of duration instance.
+func MaxDuration() Duration {
+ return maxDuration
+}
+
+// MinDuration returns the minimum value of duration instance.
+func MinDuration() Duration {
+ return minDuration
+}
+
+// Max returns the maximum Carbon instance from some given Carbon instances.
+func Max(c1 *Carbon, c2 ...*Carbon) (c *Carbon) {
c = c1
+ if c.IsInvalid() {
+ return
+ }
+ if len(c2) == 0 {
+ return
+ }
for i := range c2 {
+ if c2[i].IsInvalid() {
+ return c2[i]
+ }
if c2[i].Gte(c) {
c = c2[i]
}
@@ -54,14 +57,82 @@ func Max(c1 Carbon, c2 ...Carbon) (c Carbon) {
return
}
-// Min returns the minimum Carbon instance from the given Carbon instance (second-precision).
-// 返回最小的 Carbon 实例
-func Min(c1 Carbon, c2 ...Carbon) (c Carbon) {
+// Min returns the minimum Carbon instance from some given Carbon instances.
+func Min(c1 *Carbon, c2 ...*Carbon) (c *Carbon) {
c = c1
+ if c.IsInvalid() {
+ return
+ }
+ if len(c2) == 0 {
+ return
+ }
for i := range c2 {
+ if c2[i].IsInvalid() {
+ return c2[i]
+ }
if c2[i].Lte(c) {
c = c2[i]
}
}
return
}
+
+// Closest returns the closest Carbon instance from some given Carbon instances.
+func (c *Carbon) Closest(c1 *Carbon, c2 ...*Carbon) *Carbon {
+ if c.IsInvalid() {
+ return c
+ }
+ if c1.IsInvalid() {
+ return c1
+ }
+ if len(c2) == 0 {
+ return c1
+ }
+ args := append([]*Carbon{c1}, c2...)
+ for i := range args {
+ if args[i].IsInvalid() {
+ return args[i]
+ }
+ }
+ closest := args[0]
+ minDiff := c.DiffAbsInSeconds(closest)
+ for i := range args[1:] {
+ arg := args[1:][i]
+ diff := c.DiffAbsInSeconds(arg)
+ if diff < minDiff {
+ minDiff = diff
+ closest = arg
+ }
+ }
+ return closest
+}
+
+// Farthest returns the farthest Carbon instance from some given Carbon instances.
+func (c *Carbon) Farthest(c1 *Carbon, c2 ...*Carbon) *Carbon {
+ if c.IsInvalid() {
+ return c
+ }
+ if c1.IsInvalid() {
+ return c1
+ }
+ if len(c2) == 0 {
+ return c1
+ }
+ args := append([]*Carbon{c1}, c2...)
+ for i := range args {
+ if args[i].IsInvalid() {
+ return args[i]
+ }
+ }
+ farthest := args[0]
+ maxDiff := c.DiffAbsInSeconds(farthest)
+ for i := range args[1:] {
+ arg := args[1:][i]
+ diff := c.DiffAbsInSeconds(arg)
+ if diff > maxDiff {
+ maxDiff = diff
+ farthest = arg
+ }
+ }
+ return farthest
+}
diff --git a/vendor/github.com/dromara/carbon/v2/frozen.go b/vendor/github.com/dromara/carbon/v2/frozen.go
new file mode 100644
index 00000000..3d50e767
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/frozen.go
@@ -0,0 +1,46 @@
+package carbon
+
+import "sync"
+
+// FrozenNow defines a FrozenNow struct.
+type FrozenNow struct {
+ isFrozen bool
+ testNow *Carbon
+ rw *sync.RWMutex
+}
+
+var frozenNow = &FrozenNow{
+ rw: new(sync.RWMutex),
+}
+
+// SetTestNow sets a test Carbon instance for now.
+func SetTestNow(c *Carbon) {
+ frozenNow.rw.Lock()
+ defer frozenNow.rw.Unlock()
+
+ frozenNow.isFrozen = true
+ frozenNow.testNow = c
+}
+
+// CleanTestNow clears the test Carbon instance for now.
+//
+// Deprecated: it will be removed in the future, use "ClearTestNow" instead.
+func CleanTestNow() {
+ ClearTestNow()
+}
+
+// ClearTestNow clears the test Carbon instance for now.
+func ClearTestNow() {
+ frozenNow.rw.Lock()
+ defer frozenNow.rw.Unlock()
+
+ frozenNow.isFrozen = false
+}
+
+// IsTestNow reports whether is testing time.
+func IsTestNow() bool {
+ frozenNow.rw.Lock()
+ defer frozenNow.rw.Unlock()
+
+ return frozenNow.isFrozen
+}
diff --git a/vendor/github.com/dromara/carbon/v2/getter.go b/vendor/github.com/dromara/carbon/v2/getter.go
index 112848c8..933ea11b 100644
--- a/vendor/github.com/dromara/carbon/v2/getter.go
+++ b/vendor/github.com/dromara/carbon/v2/getter.go
@@ -5,18 +5,19 @@ import (
)
// StdTime gets standard time.Time.
-// 获取标准 time.Time
-func (c Carbon) StdTime() time.Time {
- if c.time.IsZero() {
+func (c *Carbon) StdTime() StdTime {
+ if c.IsInvalid() {
+ return StdTime{}
+ }
+ if c.loc == nil {
return c.time
}
return c.time.In(c.loc)
}
// DaysInYear gets total days in year like 365.
-// 获取本年的总天数
-func (c Carbon) DaysInYear() int {
- if c.Error != nil {
+func (c *Carbon) DaysInYear() int {
+ if c.IsInvalid() {
return 0
}
if c.IsLeapYear() {
@@ -26,58 +27,48 @@ func (c Carbon) DaysInYear() int {
}
// DaysInMonth gets total days in month like 30.
-// 获取本月的总天数
-func (c Carbon) DaysInMonth() int {
- if c.Error != nil {
+func (c *Carbon) DaysInMonth() int {
+ if c.IsInvalid() {
return 0
}
return c.EndOfMonth().StdTime().Day()
}
// MonthOfYear gets month of year like 12.
-// 获取本年的第几月
-func (c Carbon) MonthOfYear() int {
- if c.Error != nil {
+func (c *Carbon) MonthOfYear() int {
+ if c.IsInvalid() {
return 0
}
return int(c.StdTime().Month())
}
// DayOfYear gets day of year like 365.
-// 获取本年的第几天
-func (c Carbon) DayOfYear() int {
- if c.Error != nil {
+func (c *Carbon) DayOfYear() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().YearDay()
}
// DayOfMonth gets day of month like 30.
-// 获取本月的第几天
-func (c Carbon) DayOfMonth() int {
- if c.Error != nil {
+func (c *Carbon) DayOfMonth() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Day()
}
-// DayOfWeek gets day of week like 6.
-// 获取本周的第几天
-func (c Carbon) DayOfWeek() int {
- if c.Error != nil {
+// DayOfWeek gets day of week like 6, start from 1.
+func (c *Carbon) DayOfWeek() int {
+ if c.IsInvalid() {
return 0
}
- day := int(c.StdTime().Weekday())
- if day == 0 {
- return DaysPerWeek
- }
- return day
+ return (int(c.StdTime().Weekday())+DaysPerWeek-int(c.weekStartsAt))%DaysPerWeek + 1
}
-// WeekOfYear gets week of year like 1, see https://en.wikipedia.org/wiki/ISO_8601#Week_dates.
-// 获取本年的第几周
-func (c Carbon) WeekOfYear() int {
- if c.Error != nil {
+// WeekOfYear gets week of year like 1, refer to https://en.wikipedia.org/wiki/ISO_8601#Week_dates.
+func (c *Carbon) WeekOfYear() int {
+ if c.IsInvalid() {
return 0
}
_, week := c.StdTime().ISOWeek()
@@ -85,9 +76,8 @@ func (c Carbon) WeekOfYear() int {
}
// WeekOfMonth gets week of month like 1.
-// 获取本月的第几周
-func (c Carbon) WeekOfMonth() int {
- if c.Error != nil {
+func (c *Carbon) WeekOfMonth() int {
+ if c.IsInvalid() {
return 0
}
days := c.Day() + c.StartOfMonth().DayOfWeek() - 1
@@ -98,9 +88,8 @@ func (c Carbon) WeekOfMonth() int {
}
// DateTime gets current year, month, day, hour, minute, and second like 2020, 8, 5, 13, 14, 15.
-// 获取当前年、月、日、时、分、秒
-func (c Carbon) DateTime() (year, month, day, hour, minute, second int) {
- if c.Error != nil {
+func (c *Carbon) DateTime() (year, month, day, hour, minute, second int) {
+ if c.IsInvalid() {
return
}
year, month, day = c.Date()
@@ -109,9 +98,8 @@ func (c Carbon) DateTime() (year, month, day, hour, minute, second int) {
}
// DateTimeMilli gets current year, month, day, hour, minute, second and millisecond like 2020, 8, 5, 13, 14, 15, 999.
-// 获取当前年、月、日、时、分、秒、毫秒
-func (c Carbon) DateTimeMilli() (year, month, day, hour, minute, second, millisecond int) {
- if c.Error != nil {
+func (c *Carbon) DateTimeMilli() (year, month, day, hour, minute, second, millisecond int) {
+ if c.IsInvalid() {
return
}
year, month, day, hour, minute, second = c.DateTime()
@@ -119,9 +107,8 @@ func (c Carbon) DateTimeMilli() (year, month, day, hour, minute, second, millise
}
// DateTimeMicro gets current year, month, day, hour, minute, second and microsecond like 2020, 8, 5, 13, 14, 15, 999999.
-// 获取当前年、月、日、时、分、秒、微秒
-func (c Carbon) DateTimeMicro() (year, month, day, hour, minute, second, microsecond int) {
- if c.Error != nil {
+func (c *Carbon) DateTimeMicro() (year, month, day, hour, minute, second, microsecond int) {
+ if c.IsInvalid() {
return
}
year, month, day, hour, minute, second = c.DateTime()
@@ -129,9 +116,8 @@ func (c Carbon) DateTimeMicro() (year, month, day, hour, minute, second, microse
}
// DateTimeNano gets current year, month, day, hour, minute, second and nanosecond like 2020, 8, 5, 13, 14, 15, 999999999.
-// 获取当前年、月、日、时、分、秒、纳秒
-func (c Carbon) DateTimeNano() (year, month, day, hour, minute, second, nanosecond int) {
- if c.Error != nil {
+func (c *Carbon) DateTimeNano() (year, month, day, hour, minute, second, nanosecond int) {
+ if c.IsInvalid() {
return
}
year, month, day, hour, minute, second = c.DateTime()
@@ -139,9 +125,8 @@ func (c Carbon) DateTimeNano() (year, month, day, hour, minute, second, nanoseco
}
// Date gets current year, month, and day like 2020, 8, 5.
-// 获取当前年、月、日
-func (c Carbon) Date() (year, month, day int) {
- if c.Error != nil {
+func (c *Carbon) Date() (year, month, day int) {
+ if c.IsInvalid() {
return
}
var tm time.Month
@@ -150,9 +135,8 @@ func (c Carbon) Date() (year, month, day int) {
}
// DateMilli gets current year, month, day and millisecond like 2020, 8, 5, 999.
-// 获取当前年、月、日、毫秒
-func (c Carbon) DateMilli() (year, month, day, millisecond int) {
- if c.Error != nil {
+func (c *Carbon) DateMilli() (year, month, day, millisecond int) {
+ if c.IsInvalid() {
return
}
year, month, day = c.Date()
@@ -160,9 +144,8 @@ func (c Carbon) DateMilli() (year, month, day, millisecond int) {
}
// DateMicro gets current year, month, day and microsecond like 2020, 8, 5, 999999.
-// 获取当前年、月、日、微秒
-func (c Carbon) DateMicro() (year, month, day, microsecond int) {
- if c.Error != nil {
+func (c *Carbon) DateMicro() (year, month, day, microsecond int) {
+ if c.IsInvalid() {
return
}
year, month, day = c.Date()
@@ -170,9 +153,8 @@ func (c Carbon) DateMicro() (year, month, day, microsecond int) {
}
// DateNano gets current year, month, day and nanosecond like 2020, 8, 5, 999999999.
-// 获取当前年、月、日、纳秒
-func (c Carbon) DateNano() (year, month, day, nanosecond int) {
- if c.Error != nil {
+func (c *Carbon) DateNano() (year, month, day, nanosecond int) {
+ if c.IsInvalid() {
return
}
year, month, day = c.Date()
@@ -180,18 +162,16 @@ func (c Carbon) DateNano() (year, month, day, nanosecond int) {
}
// Time gets current hour, minute, and second like 13, 14, 15.
-// 获取当前时、分、秒
-func (c Carbon) Time() (hour, minute, second int) {
- if c.Error != nil {
+func (c *Carbon) Time() (hour, minute, second int) {
+ if c.IsInvalid() {
return
}
return c.StdTime().Clock()
}
// TimeMilli gets current hour, minute, second and millisecond like 13, 14, 15, 999.
-// 获取当前时、分、秒、毫秒
-func (c Carbon) TimeMilli() (hour, minute, second, millisecond int) {
- if c.Error != nil {
+func (c *Carbon) TimeMilli() (hour, minute, second, millisecond int) {
+ if c.IsInvalid() {
return
}
hour, minute, second = c.Time()
@@ -199,9 +179,8 @@ func (c Carbon) TimeMilli() (hour, minute, second, millisecond int) {
}
// TimeMicro gets current hour, minute, second and microsecond like 13, 14, 15, 999999.
-// 获取当前时、分、秒、微秒
-func (c Carbon) TimeMicro() (hour, minute, second, microsecond int) {
- if c.Error != nil {
+func (c *Carbon) TimeMicro() (hour, minute, second, microsecond int) {
+ if c.IsInvalid() {
return
}
hour, minute, second = c.Time()
@@ -209,9 +188,8 @@ func (c Carbon) TimeMicro() (hour, minute, second, microsecond int) {
}
// TimeNano gets current hour, minute, second and nanosecond like 13, 14, 15, 999999999.
-// 获取当前时、分、秒、纳秒
-func (c Carbon) TimeNano() (hour, minute, second, nanosecond int) {
- if c.Error != nil {
+func (c *Carbon) TimeNano() (hour, minute, second, nanosecond int) {
+ if c.IsInvalid() {
return
}
hour, minute, second = c.Time()
@@ -219,36 +197,32 @@ func (c Carbon) TimeNano() (hour, minute, second, nanosecond int) {
}
// Century gets current century like 21.
-// 获取当前世纪
-func (c Carbon) Century() int {
- if c.Error != nil {
+func (c *Carbon) Century() int {
+ if c.IsInvalid() {
return 0
}
return c.Year()/YearsPerCentury + 1
}
// Decade gets current decade like 20.
-// 获取当前年代
-func (c Carbon) Decade() int {
- if c.Error != nil {
+func (c *Carbon) Decade() int {
+ if c.IsInvalid() {
return 0
}
return c.Year() % YearsPerCentury / YearsPerDecade * YearsPerDecade
}
// Year gets current year like 2020.
-// 获取当前年
-func (c Carbon) Year() int {
- if c.Error != nil {
+func (c *Carbon) Year() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Year()
}
// Quarter gets current quarter like 3.
-// 获取当前季度
-func (c Carbon) Quarter() (quarter int) {
- if c.Error != nil {
+func (c *Carbon) Quarter() (quarter int) {
+ if c.IsInvalid() {
return
}
month := c.Month()
@@ -266,141 +240,123 @@ func (c Carbon) Quarter() (quarter int) {
}
// Month gets current month like 8.
-// 获取当前月
-func (c Carbon) Month() int {
+func (c *Carbon) Month() int {
return c.MonthOfYear()
}
// Week gets current week like 6, start from 0.
-// 获取当前周(从0开始)
-func (c Carbon) Week() int {
- if c.Error != nil {
+func (c *Carbon) Week() int {
+ if c.IsInvalid() {
return -1
}
- return (c.DayOfWeek() + DaysPerWeek - int(c.weekStartsAt)) % DaysPerWeek
+ return c.DayOfWeek() - 1
}
// Day gets current day like 5.
-// 获取当前日
-func (c Carbon) Day() int {
+func (c *Carbon) Day() int {
return c.DayOfMonth()
}
// Hour gets current hour like 13.
-// 获取当前小时
-func (c Carbon) Hour() int {
- if c.Error != nil {
+func (c *Carbon) Hour() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Hour()
}
// Minute gets current minute like 14.
-// 获取当前分钟数
-func (c Carbon) Minute() int {
- if c.Error != nil {
+func (c *Carbon) Minute() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Minute()
}
-// Second gets current second like 15.
-// 获取当前秒数
-func (c Carbon) Second() int {
- if c.Error != nil {
+// Second gets current second like 9.
+func (c *Carbon) Second() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Second()
}
// Millisecond gets current millisecond like 999.
-// 获取当前毫秒数
-func (c Carbon) Millisecond() int {
- if c.Error != nil {
+func (c *Carbon) Millisecond() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Nanosecond() / 1e6
}
// Microsecond gets current microsecond like 999999.
-// 获取当前微秒数
-func (c Carbon) Microsecond() int {
- if c.Error != nil {
+func (c *Carbon) Microsecond() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Nanosecond() / 1e3
}
// Nanosecond gets current nanosecond like 999999999.
-// 获取当前纳秒数
-func (c Carbon) Nanosecond() int {
- if c.Error != nil {
+func (c *Carbon) Nanosecond() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Nanosecond()
}
-// Timestamp gets timestamp with second like 1596604455.
-// 输出秒级时间戳
-func (c Carbon) Timestamp() int64 {
- if c.Error != nil {
+// Timestamp gets timestamp with second precision like 1596604455.
+func (c *Carbon) Timestamp() int64 {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Unix()
}
-// TimestampMilli gets timestamp with millisecond like 1596604455000.
-// 获取毫秒级时间戳
-func (c Carbon) TimestampMilli() int64 {
- if c.Error != nil {
+// TimestampMilli gets timestamp with millisecond precision like 1596604455000.
+func (c *Carbon) TimestampMilli() int64 {
+ if c.IsInvalid() {
return 0
}
- t := c.StdTime()
- return t.Unix()*1e3 + int64(t.Nanosecond())/1e6
+ return c.StdTime().UnixMilli()
}
-// TimestampMicro gets timestamp with microsecond like 1596604455000000.
-// 获取微秒级时间戳
-func (c Carbon) TimestampMicro() int64 {
- if c.Error != nil {
+// TimestampMicro gets timestamp with microsecond precision like 1596604455000000.
+func (c *Carbon) TimestampMicro() int64 {
+ if c.IsInvalid() {
return 0
}
- t := c.StdTime()
- return t.Unix()*1e6 + int64(t.Nanosecond())/1e3
+ return c.StdTime().UnixMicro()
}
-// TimestampNano gets timestamp with nanosecond like 1596604455000000000.
-// 获取纳秒级时间戳
-func (c Carbon) TimestampNano() int64 {
- if c.Error != nil {
+// TimestampNano gets timestamp with nanosecond precision like 1596604455000000000.
+func (c *Carbon) TimestampNano() int64 {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().UnixNano()
}
-// Location gets location name like "PRC".
-// 获取位置
-func (c Carbon) Location() string {
- if c.Error != nil {
+// Timezone gets timezone location like "Asia/Shanghai".
+func (c *Carbon) Timezone() string {
+ if c.IsInvalid() {
return ""
}
return c.loc.String()
}
-// Timezone gets timezone name like "CST".
-// 获取时区
-func (c Carbon) Timezone() string {
- if c.Error != nil {
+// ZoneName gets timezone name like "CST".
+func (c *Carbon) ZoneName() string {
+ if c.IsInvalid() {
return ""
}
name, _ := c.StdTime().Zone()
return name
}
-// Offset gets offset seconds from the UTC timezone like 28800.
-// 获取距离UTC时区的偏移量,单位秒
-func (c Carbon) Offset() int {
- if c.Error != nil {
+// ZoneOffset gets timezone offset seconds from the UTC timezone like 28800.
+func (c *Carbon) ZoneOffset() int {
+ if c.IsInvalid() {
return 0
}
_, offset := c.StdTime().Zone()
@@ -408,25 +364,44 @@ func (c Carbon) Offset() int {
}
// Locale gets locale name like "zh-CN".
-// 获取语言区域
-func (c Carbon) Locale() string {
- if c.Error != nil {
+func (c *Carbon) Locale() string {
+ if c.IsInvalid() {
return ""
}
return c.lang.locale
}
-// Age gets age like 18.
-// 获取年龄
-func (c Carbon) Age() int {
- if c.Error != nil {
+// WeekStartsAt returns start day of the week.
+func (c *Carbon) WeekStartsAt() Weekday {
+ if c.IsInvalid() {
return 0
}
- now := c.Now()
- if c.IsSetTestNow() {
- now = CreateFromTimestampNano(c.testNow, c.Location())
+ return c.weekStartsAt
+}
+
+// WeekEndsAt returns end day of the week.
+func (c *Carbon) WeekEndsAt() Weekday {
+ if c.IsInvalid() {
+ return 0
}
- if c.TimestampNano() > now.TimestampNano() {
+ return Weekday((int(c.weekStartsAt) + DaysPerWeek - 1) % 7)
+}
+
+// CurrentLayout returns the layout used for parsing the time string.
+func (c *Carbon) CurrentLayout() string {
+ if c.IsInvalid() {
+ return ""
+ }
+ return c.currentLayout
+}
+
+// Age gets age like 18.
+func (c *Carbon) Age() int {
+ if c.IsInvalid() {
+ return 0
+ }
+ now := Now().SetLocation(c.loc)
+ if c.Gte(now) {
return 0
}
return int(c.DiffInYears(now))
diff --git a/vendor/github.com/dromara/carbon/v2/helper.go b/vendor/github.com/dromara/carbon/v2/helper.go
index 92d8e8b8..ef2fa34a 100644
--- a/vendor/github.com/dromara/carbon/v2/helper.go
+++ b/vendor/github.com/dromara/carbon/v2/helper.go
@@ -2,24 +2,13 @@ package carbon
import (
"bytes"
+ "fmt"
+ "strconv"
"time"
)
-// week days
-// 工作日
-var weekdays = map[string]time.Weekday{
- Monday: time.Monday,
- Tuesday: time.Tuesday,
- Wednesday: time.Wednesday,
- Thursday: time.Thursday,
- Friday: time.Friday,
- Saturday: time.Saturday,
- Sunday: time.Sunday,
-}
-
-// common formatting symbols
-// 常规格式化符号
-var formats = map[byte]string{
+// format map
+var formatMap = map[byte]string{
'd': "02", // Day: Day of the month, 2 digits with leading zeros. Eg: 01 to 31.
'D': "Mon", // Day: A textual representation of a day, three letters. Eg: Mon through Sun.
'j': "2", // Day: Day of the month without leading zeros. Eg: 1 to 31.
@@ -39,52 +28,69 @@ var formats = map[byte]string{
's': "05", // Time: Seconds with leading zeros. Eg: 00 through 59.
'O': "-0700", // Zone: Difference to Greenwich time (GMT) in hours. Eg: +0200.
'P': "-07:00", // Zone: Difference to Greenwich time (GMT) with colon between hours and minutes. Eg: +02:00.
- 'T': "MST", // Zone: Timezone abbreviation. Eg: UTC, EST, MDT ...
+ 'Q': "Z0700", // Zone: ISO8601 timezone. Eg: Z, +0200.
+ 'R': "Z07:00", // Zone: ISO8601 colon timezone. Eg: Z, +02:00.
+ 'Z': "MST", // Zone: Zone name. Eg: UTC, EST, MDT ...
- 'U': "timestamp", // Timestamp with second. Eg: 1699677240.
- 'V': "timestampMilli", // TimestampMilli with second. Eg: 1596604455666.
- 'X': "timestampMicro", // TimestampMicro with second. Eg: 1596604455666666.
- 'Z': "timestampNano", // TimestampNano with second. Eg: 1596604455666666666.
+ 'u': "999", // Second: Millisecond. Eg: 999.
+ 'v': "999999", // Second: Microsecond. Eg: 999999.
+ 'x': "999999999", // Second: Nanosecond. Eg: 999999999.
+
+ 'S': TimestampLayout, // Timestamp: Timestamp with second precision. Eg: 1699677240.
+ 'U': TimestampMilliLayout, // Timestamp: Timestamp with millisecond precision. Eg: 1596604455666.
+ 'V': TimestampMicroLayout, // Timestamp: Timestamp with microsecond precision. Eg: 1596604455666666.
+ 'X': TimestampNanoLayout, // Timestamp: Timestamp with nanosecond precision. Eg: 1596604455666666666.
}
-// common layout symbols
-// 常规布局模板符号
-var layouts = []string{
- DayDateTimeLayout,
- DateTimeLayout, DateTimeNanoLayout, ShortDateTimeLayout, ShortDateTimeNanoLayout,
- DateLayout, DateNanoLayout, ShortDateLayout, ShortDateNanoLayout,
- ISO8601Layout, ISO8601NanoLayout,
- RFC822Layout, RFC822ZLayout, RFC850Layout, RFC1123Layout, RFC1123ZLayout, RFC3339Layout, RFC3339NanoLayout, RFC1036Layout, RFC7231Layout,
- KitchenLayout,
- CookieLayout,
- ANSICLayout,
- UnixDateLayout,
- RubyDateLayout,
+// default layouts
+var defaultLayouts = []string{
+ DateTimeLayout, DateLayout, TimeLayout, DayDateTimeLayout,
+
+ "2006-01-02 15:04:05 -0700 MST", "2006-01-02T15:04:05Z07:00", "2006-01-02T15:04:05-07:00", "2006-01-02T15:04:05-0700", "2006-01-02T15:04:05",
+
+ ISO8601Layout, RFC1036Layout, RFC822Layout, RFC822ZLayout, RFC850Layout, RFC1123Layout, RFC1123ZLayout, RFC3339Layout, RFC7231Layout,
+ KitchenLayout, CookieLayout, ANSICLayout, UnixDateLayout, RubyDateLayout,
+
+ ShortDateTimeLayout, ShortDateLayout, ShortTimeLayout,
+
+ DateTimeMilliLayout, DateTimeMicroLayout, DateTimeNanoLayout,
+ DateMilliLayout, DateMicroLayout, DateNanoLayout,
+ TimeMilliLayout, TimeMicroLayout, TimeNanoLayout,
+
+ ShortDateTimeMilliLayout, ShortDateTimeMicroLayout, ShortDateTimeNanoLayout,
+ ShortDateMilliLayout, ShortDateMicroLayout, ShortDateNanoLayout,
+ ShortTimeMilliLayout, ShortTimeMicroLayout, ShortTimeNanoLayout,
+
+ ISO8601MilliLayout, ISO8601MicroLayout, ISO8601NanoLayout,
+ RFC3339MilliLayout, RFC3339MicroLayout, RFC3339NanoLayout,
+
+ "15:04:05-07", // postgres time with time zone type
+ "2006-01-02 15:04:05-07", // postgres timestamp with time zone type
+ "2006-01-02 15:04:05-07:00", // sqlite text type
+ "2006-01-02 15:04:05.999999999 -07:00", // sqlserver datetimeoffset type
"2006",
+ "2006-1-2 15:4:5 -0700 MST", "2006-1-2 3:4:5 -0700 MST",
"2006-1", "2006-1-2", "2006-1-2 15", "2006-1-2 15:4", "2006-1-2 15:4:5", "2006-1-2 15:4:5.999999999",
"2006.1", "2006.1.2", "2006.1.2 15", "2006.1.2 15:4", "2006.1.2 15:4:5", "2006.1.2 15:4:5.999999999",
"2006/1", "2006/1/2", "2006/1/2 15", "2006/1/2 15:4", "2006/1/2 15:4:5", "2006/1/2 15:4:5.999999999",
- "2006-01-02 15:04:05 -0700 MST",
"2006-01-02 15:04:05PM MST", "2006-01-02 15:04:05.999999999PM MST", "2006-1-2 15:4:5PM MST", "2006-1-2 15:4:5.999999999PM MST",
"2006-01-02 15:04:05 PM MST", "2006-01-02 15:04:05.999999999 PM MST", "2006-1-2 15:4:5 PM MST", "2006-1-2 15:4:5.999999999 PM MST",
"1/2/2006", "1/2/2006 15", "1/2/2006 15:4", "1/2/2006 15:4:5", "1/2/2006 15:4:5.999999999",
- "2006-1-2 15:4:5 -0700 MST", "2006-1-2 15:4:5.999999999 -0700 MST", "2006-1-2 15:04:05 -0700 MST", "2006-1-2 15:04:05.999999999 -0700 MST",
- "2006-01-02T15:04:05", "2006-01-02T15:04:05.999999999", "2006-1-2T3:4:5", "2006-1-2T3:4:5.999999999",
- "2006-01-02T15:04:05Z07", "2006-01-02T15:04:05.999999999Z07", "2006-1-2T15:4:5Z07", "2006-1-2T15:4:5.999999999Z07",
- "2006-01-02T15:04:05Z07:00", "2006-01-02T15:04:05.999999999Z07:00", "2006-1-2T15:4:5Z07:00", "2006-1-2T15:4:5.999999999Z07:00",
- "2006-01-02T15:04:05-07:00", "2006-01-02T15:04:05.999999999-07:00", "2006-1-2T15:4:5-07:00", "2006-1-2T15:4:5.999999999-07:00",
- "2006-01-02T15:04:05-0700", "2006-01-02T15:04:05.999999999-0700", "2006-1-2T3:4:5-0700", "2006-1-2T3:4:5.999999999-0700",
+ "2006-1-2 15:4:5.999999999 -0700 MST", "2006-1-2 15:04:05 -0700 MST", "2006-1-2 15:04:05.999999999 -0700 MST",
+ "2006-01-02T15:04:05.999999999", "2006-1-2T3:4:5", "2006-1-2T3:4:5.999999999",
+ "2006-01-02T15:04:05.999999999Z07", "2006-1-2T15:4:5Z07", "2006-1-2T15:4:5.999999999Z07",
+ "2006-01-02T15:04:05.999999999Z07:00", "2006-1-2T15:4:5Z07:00", "2006-1-2T15:4:5.999999999Z07:00",
+ "2006-01-02T15:04:05.999999999-07:00", "2006-1-2T15:4:5-07:00", "2006-1-2T15:4:5.999999999-07:00",
+ "2006-01-02T15:04:05.999999999-0700", "2006-1-2T3:4:5-0700", "2006-1-2T3:4:5.999999999-0700",
"20060102150405-07:00", "20060102150405.999999999-07:00",
- "20060102150405Z07", "20060102150405.999999999Z07",
"20060102150405Z07:00", "20060102150405.999999999Z07:00",
}
// converts format to layout.
-// format 转 layout
func format2layout(format string) string {
- buffer := bytes.NewBuffer(nil)
+ buffer := &bytes.Buffer{}
for i := 0; i < len(format); i++ {
- if layout, ok := formats[format[i]]; ok {
+ if layout, ok := formatMap[format[i]]; ok {
buffer.WriteString(layout)
} else {
switch format[i] {
@@ -100,28 +106,40 @@ func format2layout(format string) string {
return buffer.String()
}
-// gets a Location instance by a timezone string.
-// 通过时区获取 Location 实例
-func getLocationByTimezone(timezone string) (*time.Location, error) {
- loc, err := time.LoadLocation(timezone)
- if err != nil {
- err = invalidTimezoneError(timezone)
+// parses a timezone string as a time.Location instance.
+func parseTimezone(timezone string) (loc *Location, err error) {
+ if timezone == "" {
+ return nil, ErrEmptyTimezone()
}
- return loc, err
+ if loc, err = time.LoadLocation(timezone); err != nil {
+ err = fmt.Errorf("%w: %w", ErrInvalidTimezone(timezone), err)
+ }
+ return
}
-// parses as a Duration instance by a duration string.
-// 通过时长解析
-func parseByDuration(duration string) (time.Duration, error) {
- td, err := time.ParseDuration(duration)
- if err != nil {
- err = invalidDurationError(duration)
+// parses a duration string as a time.Duration instance.
+func parseDuration(duration string) (dur Duration, err error) {
+ if duration == "" {
+ return 0, ErrEmptyDuration()
}
- return td, err
+ if dur, err = time.ParseDuration(duration); err != nil {
+ err = fmt.Errorf("%w: %w", ErrInvalidDuration(duration), err)
+ }
+ return
+}
+
+// parses a timestamp string as a int64 format timestamp.
+func parseTimestamp(timestamp string) (ts int64, err error) {
+ if ts, err = strconv.ParseInt(timestamp, 10, 64); err != nil {
+ err = fmt.Errorf("%w: %w", ErrInvalidTimestamp(timestamp), err)
+ }
+ return
}
// gets absolute value.
-// 获取绝对值
func getAbsValue(value int64) int64 {
- return (value ^ value>>31) - value>>31
+ if value < 0 {
+ return -value
+ }
+ return value
}
diff --git a/vendor/github.com/dromara/carbon/v2/interfaces.go b/vendor/github.com/dromara/carbon/v2/interfaces.go
new file mode 100644
index 00000000..4f356560
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/interfaces.go
@@ -0,0 +1,24 @@
+package carbon
+
+// DataTyper defines a DataTyper interface
+type DataTyper interface {
+ DataType() string
+}
+
+// LayoutTyper defines a LayoutTyper interface
+type LayoutTyper interface {
+ ~string
+ Layout() string
+}
+
+// FormatTyper defines a FormatTyper interface.
+type FormatTyper interface {
+ ~string
+ Format() string
+}
+
+// TimestampTyper defines a TimestampTyper interface.
+type TimestampTyper interface {
+ ~int64
+ Precision() string
+}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/ar.json b/vendor/github.com/dromara/carbon/v2/lang/ar.json
index 26d78f5f..c6bda974 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/ar.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/ar.json
@@ -1,21 +1,22 @@
{
- "name": "Arabic",
- "months": "يناير|فبراير|مارس|أبريل|مايو|يونيو|يوليو|أغسطس|سبتمبر|أكتوبر|نوفمبر|ديسمبر",
- "short_months": "يناير|فبراير|مارس|أبريل|مايو|يونيو|يوليو|أغسطس|سبتمبر|أكتوبر|نوفمبر|ديسمبر",
- "weeks": "الأحد|الإثنين|الثلاثاء|الأربعاء|الخميس|الجمعة|السبت",
- "short_weeks": "أحد|إثنين|ثلاثاء|أربعاء|خميس|جمعة|سبت",
- "seasons": "الربيع|الصيف|الخريف|الشتاء",
- "constellations": "الحمل|الثور|الجوزاء|السرطان|الأسد|العذراء|الميزان|العقرب|القوس|الجدي|الدلو|الحوت",
- "year": "1 سنة|%d سنوات",
- "month": "1 شهر|%d أشهر",
- "week": "1 أسبوع|%d أسابيع",
- "day": "1 يوم|%d أيام",
- "hour": "1 ساعة|%d ساعات",
- "minute": "1 دقيقة|%d دقائق",
- "second": "1 ثانية|%d ثواني",
- "now": "الآن",
- "ago": "%s مضت",
- "from_now": "من %s",
- "before": "%s قبل",
- "after": "%s بعد"
+ "name": "Arabic",
+ "author": "https://github.com/zumoshi",
+ "months": "يناير|فبراير|مارس|أبريل|مايو|يونيو|يوليو|أغسطس|سبتمبر|أكتوبر|نوفمبر|ديسمبر",
+ "short_months": "يناير|فبراير|مارس|أبريل|مايو|يونيو|يوليو|أغسطس|سبتمبر|أكتوبر|نوفمبر|ديسمبر",
+ "weeks": "الأحد|الإثنين|الثلاثاء|الأربعاء|الخميس|الجمعة|السبت",
+ "short_weeks": "أحد|إثنين|ثلاثاء|أربعاء|خميس|جمعة|سبت",
+ "seasons": "الربيع|الصيف|الخريف|الشتاء",
+ "constellations": "الحمل|الثور|الجوزاء|السرطان|الأسد|العذراء|الميزان|العقرب|القوس|الجدي|الدلو|الحوت",
+ "year": "1 سنة|%d سنوات",
+ "month": "1 شهر|%d أشهر",
+ "week": "1 أسبوع|%d أسابيع",
+ "day": "1 يوم|%d أيام",
+ "hour": "1 ساعة|%d ساعات",
+ "minute": "1 دقيقة|%d دقائق",
+ "second": "1 ثانية|%d ثواني",
+ "now": "الآن",
+ "ago": "%s مضت",
+ "from_now": "من %s",
+ "before": "%s قبل",
+ "after": "%s بعد"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/bg.json b/vendor/github.com/dromara/carbon/v2/lang/bg.json
index 8bd3fa7f..9e2d016c 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/bg.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/bg.json
@@ -1,21 +1,22 @@
{
- "name": "Български",
- "months": "Януари|Февруари|Март|Април|Май|Юни|Юли|Август|Септември|Октомври|Ноември|Декември",
- "short_months": "Ян|Фев|Март|Апр|Май|Юни|Юли|Авг|Сеп|Окт|Ноем|Дек",
- "weeks": "Неделя|Понеделник|Вторник|Сряда|Четвъртък|Петък|Събота",
- "short_weeks": "Нд|Пн|Вт|Ср|Чт|Пт|Сб",
- "seasons": "Пролет|Лято|Есен|Зима",
- "constellations": "Овен|Телец|Близнаци|Рак|Лъв|Дева|Везни|Скорпион|Стрелец|Козирог|Водолей|Риби",
- "year": "1 година|%d години",
- "month": "1 месец|%d месеца",
- "week": "1 седмица|%d седмици",
- "day": "1 ден|%d дни",
- "hour": "1 час|%d часа",
- "minute": "1 минута|%d минути",
- "second": "1 секунда|%d секунди",
- "now": "в момента",
- "ago": "%s преди",
- "from_now": "%s от сега",
- "before": "%s преди",
- "after": "%s след"
+ "name": "Bulgarian",
+ "author": "https://github.com/yuksbg",
+ "months": "Януари|Февруари|Март|Април|Май|Юни|Юли|Август|Септември|Октомври|Ноември|Декември",
+ "short_months": "Ян|Фев|Март|Апр|Май|Юни|Юли|Авг|Сеп|Окт|Ноем|Дек",
+ "weeks": "Неделя|Понеделник|Вторник|Сряда|Четвъртък|Петък|Събота",
+ "short_weeks": "Нд|Пн|Вт|Ср|Чт|Пт|Сб",
+ "seasons": "Пролет|Лято|Есен|Зима",
+ "constellations": "Овен|Телец|Близнаци|Рак|Лъв|Дева|Везни|Скорпион|Стрелец|Козирог|Водолей|Риби",
+ "year": "1 година|%d години",
+ "month": "1 месец|%d месеца",
+ "week": "1 седмица|%d седмици",
+ "day": "1 ден|%d дни",
+ "hour": "1 час|%d часа",
+ "minute": "1 минута|%d минути",
+ "second": "1 секунда|%d секунди",
+ "now": "в момента",
+ "ago": "%s преди",
+ "from_now": "%s от сега",
+ "before": "%s преди",
+ "after": "%s след"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/de.json b/vendor/github.com/dromara/carbon/v2/lang/de.json
index fa5d809b..a320eb44 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/de.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/de.json
@@ -1,21 +1,22 @@
{
- "name": "German",
- "months": "Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember",
- "short_months": "Jan|Feb|Mär|Apr|Mai|Jun|Jul|Aug|Sep|Okt|Nov|Dez",
- "weeks": "Sonntag|Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag",
- "short_weeks": "So|Mo|Di|Mi|Do|Fr|Sa",
- "seasons": "Frühling|Sommer|Herbst|Winter",
- "constellations": "Widder|Stier|Zwilling|Krebs|Löwe|Jungfrau|Waage|Skorpion|Schütze|Steinbock|Wassermann|Fisch",
- "year": "1 Jahr|%d Jahre",
- "month": "1 Monat|%d Monate",
- "week": "1 Woche|%d Wochen",
- "day": "1 Tag|%d Tage",
- "hour": "1 Stunde|%d Stunden",
- "minute": "1 Minute|%d Minuten",
- "second": "1 Sekunde|%d Sekunden",
- "now": "gerade eben",
- "ago": "vor %s",
- "from_now": "%s ab jetzt",
- "before": "%s davor",
- "after": "%s danach"
-}
\ No newline at end of file
+ "name": "German",
+ "author": "https://github.com/benzammour",
+ "months": "Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember",
+ "short_months": "Jan|Feb|Mär|Apr|Mai|Jun|Jul|Aug|Sep|Okt|Nov|Dez",
+ "weeks": "Sonntag|Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag",
+ "short_weeks": "So|Mo|Di|Mi|Do|Fr|Sa",
+ "seasons": "Frühling|Sommer|Herbst|Winter",
+ "constellations": "Widder|Stier|Zwilling|Krebs|Löwe|Jungfrau|Waage|Skorpion|Schütze|Steinbock|Wassermann|Fisch",
+ "year": "1 Jahr|%d Jahre",
+ "month": "1 Monat|%d Monate",
+ "week": "1 Woche|%d Wochen",
+ "day": "1 Tag|%d Tage",
+ "hour": "1 Stunde|%d Stunden",
+ "minute": "1 Minute|%d Minuten",
+ "second": "1 Sekunde|%d Sekunden",
+ "now": "gerade eben",
+ "ago": "vor %s",
+ "from_now": "%s ab jetzt",
+ "before": "%s davor",
+ "after": "%s danach"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/dk.json b/vendor/github.com/dromara/carbon/v2/lang/dk.json
index a4230316..ca6f1785 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/dk.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/dk.json
@@ -1,21 +1,22 @@
{
- "name": "Dansk",
- "months": "januar|februar|marts|april|maj|juni|juli|august|september|oktober|november|december",
- "short_months": "jan|feb|mar|apr|maj|jun|jul|aug|sep|okt|nov|dec",
- "weeks": "søndag|mandag|tirsdag|onsdag|torsdag|fredag|lørdag",
- "short_weeks": "søn|man|tir|ons|tor|fre|lør",
- "seasons": "forår|sommer|efterår|vinter",
- "constellations": "vædder|tyr|tvilling|krebs|løve|jomfru|vægt|skorpion|skytte|stenbuk|vandmand|fisk",
- "year": "1 år|%d år",
- "month": "1 måned|%d måneder",
- "week": "1 uge|%d uger",
- "day": "1 dag|%d dage",
- "hour": "1 time|%d timer",
- "minute": "1 minut|%d minutter",
- "second": "1 sekund|%d sekunder",
- "now": "lige nu",
- "ago": "%s siden",
- "from_now": "om %s",
- "before": "%s før",
- "after": "%s efter"
+ "name": "Dansk",
+ "author": "https://github.com/Munk91",
+ "months": "januar|februar|marts|april|maj|juni|juli|august|september|oktober|november|december",
+ "short_months": "jan|feb|mar|apr|maj|jun|jul|aug|sep|okt|nov|dec",
+ "weeks": "søndag|mandag|tirsdag|onsdag|torsdag|fredag|lørdag",
+ "short_weeks": "søn|man|tir|ons|tor|fre|lør",
+ "seasons": "forår|sommer|efterår|vinter",
+ "constellations": "vædder|tyr|tvilling|krebs|løve|jomfru|vægt|skorpion|skytte|stenbuk|vandmand|fisk",
+ "year": "1 år|%d år",
+ "month": "1 måned|%d måneder",
+ "week": "1 uge|%d uger",
+ "day": "1 dag|%d dage",
+ "hour": "1 time|%d timer",
+ "minute": "1 minut|%d minutter",
+ "second": "1 sekund|%d sekunder",
+ "now": "lige nu",
+ "ago": "%s siden",
+ "from_now": "om %s",
+ "before": "%s før",
+ "after": "%s efter"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/en.json b/vendor/github.com/dromara/carbon/v2/lang/en.json
index 6dbc46a2..d25ee7a3 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/en.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/en.json
@@ -1,21 +1,22 @@
{
- "name": "English",
- "months": "January|February|March|April|May|June|July|August|September|October|November|December",
- "short_months": "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",
- "weeks": "Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday",
- "short_weeks": "Sun|Mon|Tue|Wed|Thu|Fri|Sat",
- "seasons": "Spring|Summer|Autumn|Winter",
- "constellations": "Aries|Taurus|Gemini|Cancer|Leo|Virgo|Libra|Scorpio|Sagittarius|Capricorn|Aquarius|Pisces",
- "year": "1 year|%d years",
- "month": "1 month|%d months",
- "week": "1 week|%d weeks",
- "day": "1 day|%d days",
- "hour": "1 hour|%d hours",
- "minute": "1 minute|%d minutes",
- "second": "1 second|%d seconds",
- "now": "just now",
- "ago": "%s ago",
- "from_now": "%s from now",
- "before": "%s before",
- "after": "%s after"
-}
\ No newline at end of file
+ "name": "English",
+ "author": "https://github.com/gouguoyin",
+ "months": "January|February|March|April|May|June|July|August|September|October|November|December",
+ "short_months": "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",
+ "weeks": "Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday",
+ "short_weeks": "Sun|Mon|Tue|Wed|Thu|Fri|Sat",
+ "seasons": "Spring|Summer|Autumn|Winter",
+ "constellations": "Aries|Taurus|Gemini|Cancer|Leo|Virgo|Libra|Scorpio|Sagittarius|Capricorn|Aquarius|Pisces",
+ "year": "1 year|%d years",
+ "month": "1 month|%d months",
+ "week": "1 week|%d weeks",
+ "day": "1 day|%d days",
+ "hour": "1 hour|%d hours",
+ "minute": "1 minute|%d minutes",
+ "second": "1 second|%d seconds",
+ "now": "just now",
+ "ago": "%s ago",
+ "from_now": "%s from now",
+ "before": "%s before",
+ "after": "%s after"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/es.json b/vendor/github.com/dromara/carbon/v2/lang/es.json
index 3b8ac7d2..15f9bd2b 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/es.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/es.json
@@ -1,21 +1,22 @@
{
- "name": "Spanish",
- "months": "Enero|Febrero|Marzo|Abril|Mayo|Junio|Julio|Agosto|Septiembre|Octubre|Noviembre|Diciembre",
- "short_months": "Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic",
- "weeks": "Domingo|Lunes|Martes|Miércoles|Jueves|Viernes|Sábado",
- "short_weeks": "Dom|Lun|Mar|Mie|Jue|Vie|Sab",
- "seasons": "Primavera|Verano|Otoño|Invierno",
- "constellations": "Aries|Tauro|Geminis|Cancer|Leo|Virgo|Libra|Escorpio|Sagitario|Capricornio|Acuario|Piscis",
- "year": "1 año|%d años",
- "month": "1 mes|%d meses",
- "week": "1 semana|%d semanas",
- "day": "1 día|%d días",
- "hour": "1 hora|%d horas",
- "minute": "1 minuto|%d minutos",
- "second": "1 segundo|%d segundos",
- "now": "ahora",
- "ago": "hace %s",
- "from_now": "%s desde ahora",
- "before": "%s antes",
- "after": "%s después"
+ "name": "Spanish",
+ "author": "https://github.com/hgisinger",
+ "months": "Enero|Febrero|Marzo|Abril|Mayo|Junio|Julio|Agosto|Septiembre|Octubre|Noviembre|Diciembre",
+ "short_months": "Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic",
+ "weeks": "Domingo|Lunes|Martes|Miércoles|Jueves|Viernes|Sábado",
+ "short_weeks": "Dom|Lun|Mar|Mie|Jue|Vie|Sab",
+ "seasons": "Primavera|Verano|Otoño|Invierno",
+ "constellations": "Aries|Tauro|Geminis|Cancer|Leo|Virgo|Libra|Escorpio|Sagitario|Capricornio|Acuario|Piscis",
+ "year": "1 año|%d años",
+ "month": "1 mes|%d meses",
+ "week": "1 semana|%d semanas",
+ "day": "1 día|%d días",
+ "hour": "1 hora|%d horas",
+ "minute": "1 minuto|%d minutos",
+ "second": "1 segundo|%d segundos",
+ "now": "ahora",
+ "ago": "hace %s",
+ "from_now": "%s desde ahora",
+ "before": "%s antes",
+ "after": "%s después"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/fa.json b/vendor/github.com/dromara/carbon/v2/lang/fa.json
index 7d10d9d2..c5319832 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/fa.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/fa.json
@@ -1,21 +1,22 @@
{
- "name": "Farsi",
- "months": "ژانویه|فوریه|مارس|آوریل|مه|ژوئن|ژوئیه|اوت|سپتامبر|اکتبر|نوامبر|دسامبر",
- "short_months": "ژانویه|فوریه|مارس|آوریل|مه|ژوئن|ژوئیه|اوت|سپتامبر|اکتبر|نوامبر|دسامبر",
- "weeks": "یکشنبه|دوشنبه|سهشنبه|چهارشنبه|پنجشنبه|جمعه|شنبه",
- "short_weeks": "یکشنبه|دوشنبه|سهشنبه|چهارشنبه|پنجشنبه|جمعه|شنبه",
- "seasons": "بهار|تابستان|پاییز|زمستان",
- "constellations": "قوچ|گاو نر|دو پیکر|خرچنگ|شیر|خوشه|ترازو|عقرب|کماندار|بز|آبریز|ماهی",
- "year": "1 سال|%d سال",
- "month": "1 ماه|%d ماه",
- "week": "1 هفته|%d هفته",
- "day": "1 روز|%d روز",
- "hour": "1 ساعت|%d ساعت",
- "minute": "1 دقیقه|%d دقیقه",
- "second": "1 ثانیه|%d ثانیه",
- "now": "همین الان",
- "ago": "%s پیش",
- "from_now": "در %s",
- "before": "%s قبل",
- "after": "%s بعد"
+ "name": "Farsi",
+ "author": "https://github.com/erfanMomeniii",
+ "months": "ژانویه|فوریه|مارس|آوریل|مه|ژوئن|ژوئیه|اوت|سپتامبر|اکتبر|نوامبر|دسامبر",
+ "short_months": "ژانویه|فوریه|مارس|آوریل|مه|ژوئن|ژوئیه|اوت|سپتامبر|اکتبر|نوامبر|دسامبر",
+ "weeks": "یکشنبه|دوشنبه|سهشنبه|چهارشنبه|پنجشنبه|جمعه|شنبه",
+ "short_weeks": "یکشنبه|دوشنبه|سهشنبه|چهارشنبه|پنجشنبه|جمعه|شنبه",
+ "seasons": "بهار|تابستان|پاییز|زمستان",
+ "constellations": "قوچ|گاو نر|دو پیکر|خرچنگ|شیر|خوشه|ترازو|عقرب|کماندار|بز|آبریز|ماهی",
+ "year": "1 سال|%d سال",
+ "month": "1 ماه|%d ماه",
+ "week": "1 هفته|%d هفته",
+ "day": "1 روز|%d روز",
+ "hour": "1 ساعت|%d ساعت",
+ "minute": "1 دقیقه|%d دقیقه",
+ "second": "1 ثانیه|%d ثانیه",
+ "now": "همین الان",
+ "ago": "%s پیش",
+ "from_now": "در %s",
+ "before": "%s قبل",
+ "after": "%s بعد"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/fr.json b/vendor/github.com/dromara/carbon/v2/lang/fr.json
index 4fd0f57b..d8120872 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/fr.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/fr.json
@@ -1,21 +1,22 @@
{
- "name": "French",
- "months": "Janvier|Février|Mars|Avril|Mai|Juin|Juillet|Août|Septembre|Octobre|Novembre|Décembre",
- "short_months": "Janv|Févr|Mars|Avril|Mai|Juin|Juil|Août|Sept|Oct|Nov|Déc",
- "weeks": "Dimanche|Lundi|Mardi|Mercredi|Jeudi|Vendredi|Samedi",
- "short_weeks": "Dim|Lun|Mar|Mer|Jeu|Ven|Sam",
- "seasons": "Le Printemps|L’été|L’Automne|L’Hiver",
- "constellations": "Bélier|Taureau|Gémeaux|Cancer|Lion|Vierge|Balance|Scorpion|Sagittaire|Capricorne|Verseau|Poissons",
- "year": "1 an|%d ans",
- "month": "1 mois|%d mois",
- "week": "1 semaine|%d semaines",
- "day": "1 jour|%d jours",
- "hour": "1 heure|%d heures",
- "minute": "1 minute|%d minutes",
- "second": "1 seconde|%d secondes",
- "now": "maintenant",
- "ago": "il y a %s",
- "from_now": "%s à partir de maintenant",
- "before": "avant %s",
- "after": "après %s"
+ "name": "French",
+ "author": "https://github.com/hollowaykeanho",
+ "months": "Janvier|Février|Mars|Avril|Mai|Juin|Juillet|Août|Septembre|Octobre|Novembre|Décembre",
+ "short_months": "Janv|Févr|Mars|Avril|Mai|Juin|Juil|Août|Sept|Oct|Nov|Déc",
+ "weeks": "Dimanche|Lundi|Mardi|Mercredi|Jeudi|Vendredi|Samedi",
+ "short_weeks": "Dim|Lun|Mar|Mer|Jeu|Ven|Sam",
+ "seasons": "Le Printemps|L’été|L’Automne|L’Hiver",
+ "constellations": "Bélier|Taureau|Gémeaux|Cancer|Lion|Vierge|Balance|Scorpion|Sagittaire|Capricorne|Verseau|Poissons",
+ "year": "1 an|%d ans",
+ "month": "1 mois|%d mois",
+ "week": "1 semaine|%d semaines",
+ "day": "1 jour|%d jours",
+ "hour": "1 heure|%d heures",
+ "minute": "1 minute|%d minutes",
+ "second": "1 seconde|%d secondes",
+ "now": "maintenant",
+ "ago": "il y a %s",
+ "from_now": "%s à partir de maintenant",
+ "before": "avant %s",
+ "after": "après %s"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/hi.json b/vendor/github.com/dromara/carbon/v2/lang/hi.json
index 72b44bad..bd5d148d 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/hi.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/hi.json
@@ -1,21 +1,22 @@
{
- "name": "Hindi",
- "months": "जनवरी|फ़रवरी|मार्च|अप्रैल|मई|जून|जुलाई|अगस्त|सितंबर|अक्टूबर|नवंबर|दिसंबर",
- "short_months": "जन|फ़र|मार्च|अप्रैल|मई|जून|जुलाई|अगस्त|सितंबर|अक्टूबर|नवंबर|दिसंबर",
- "weeks": "रविवार|सोमवार|मंगलवार|बुधवार|गुरुवार|शुक्रवार|शनिवार",
- "short_weeks": "रवि|सोम|मंगल|बुध|गुरु|शुक्र|शनि",
- "seasons": "वसंत|ग्रीष्म|पतझड़|शीत",
- "constellations": "मेष|वृषभ|मिथुन|कर्क|सिंह|कन्या|तुला|वृश्चिक|धनु|मकर|कुंभ|मीन",
- "year": "1 वर्ष|%d वर्ष",
- "month": "1 महीना|%d महीने",
- "week": "1 सप्ताह|%d सप्ताह",
- "day": "1 दिन|%d दिन",
- "hour": "1 घंटा|%d घंटे",
- "minute": "1 मिनट|%d मिनट",
- "second": "1 सेकंड|%d सेकंड",
- "now": "अभी",
- "ago": "%s पहले",
- "from_now": "%s बाद",
- "before": "%s पहले",
- "after": "%s बाद"
+ "name": "Hindi",
+ "author": "https://github.com/chauhan17nitin",
+ "months": "जनवरी|फ़रवरी|मार्च|अप्रैल|मई|जून|जुलाई|अगस्त|सितंबर|अक्टूबर|नवंबर|दिसंबर",
+ "short_months": "जन|फ़र|मार्च|अप्रैल|मई|जून|जुलाई|अगस्त|सितंबर|अक्टूबर|नवंबर|दिसंबर",
+ "weeks": "रविवार|सोमवार|मंगलवार|बुधवार|गुरुवार|शुक्रवार|शनिवार",
+ "short_weeks": "रवि|सोम|मंगल|बुध|गुरु|शुक्र|शनि",
+ "seasons": "वसंत|ग्रीष्म|पतझड़|शीत",
+ "constellations": "मेष|वृषभ|मिथुन|कर्क|सिंह|कन्या|तुला|वृश्चिक|धनु|मकर|कुंभ|मीन",
+ "year": "1 वर्ष|%d वर्ष",
+ "month": "1 महीना|%d महीने",
+ "week": "1 सप्ताह|%d सप्ताह",
+ "day": "1 दिन|%d दिन",
+ "hour": "1 घंटा|%d घंटे",
+ "minute": "1 मिनट|%d मिनट",
+ "second": "1 सेकंड|%d सेकंड",
+ "now": "अभी",
+ "ago": "%s पहले",
+ "from_now": "%s बाद",
+ "before": "%s पहले",
+ "after": "%s बाद"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/hu.json b/vendor/github.com/dromara/carbon/v2/lang/hu.json
index edcf23f1..2f88ebfd 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/hu.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/hu.json
@@ -1,21 +1,22 @@
{
- "name": "Hungarian",
- "months": "január|február|március|április|május|június|július|augusztus|szeptember|október|november|december",
- "short_months": "jan.|febr.|márc.|ápr.|máj.|jún.|júl.|aug.|szept.|okt.|nov.|dec.",
- "weeks": "Vasárnap|Hétfő|Kedd|Szerda|Csütörtök|Péntek|Szombat",
- "short_weeks": "Vas|Hét|Ke|Sze|Csü|Pé|Szo",
- "seasons": "Tavasz|Nyár|Ősz|Tél",
- "constellations": "Kos|Bika|Ikrek|Rák|Oroszlán|Szűz|Mérleg|Skorpió|Nyilas|Bak|Vízöntő|Halak",
- "year": "1 év|%d év",
- "month": "1 hónap|%d hónap",
- "week": "1 hét|%d hét",
- "day": "1 nap|%d nap",
- "hour": "1 óra|%d óra",
- "minute": "1 perc|%d perc",
- "second": "1 másodperc|%d másodperc",
- "now": "most",
- "ago": "%s",
- "from_now": "%s múlva",
- "before": "%s korábban",
- "after": "%s később"
+ "name": "Hungarian",
+ "author": "https://github.com/kenlas",
+ "months": "január|február|március|április|május|június|július|augusztus|szeptember|október|november|december",
+ "short_months": "jan.|febr.|márc.|ápr.|máj.|jún.|júl.|aug.|szept.|okt.|nov.|dec.",
+ "weeks": "Vasárnap|Hétfő|Kedd|Szerda|Csütörtök|Péntek|Szombat",
+ "short_weeks": "Vas|Hét|Ke|Sze|Csü|Pé|Szo",
+ "seasons": "Tavasz|Nyár|Ősz|Tél",
+ "constellations": "Kos|Bika|Ikrek|Rák|Oroszlán|Szűz|Mérleg|Skorpió|Nyilas|Bak|Vízöntő|Halak",
+ "year": "1 év|%d év",
+ "month": "1 hónap|%d hónap",
+ "week": "1 hét|%d hét",
+ "day": "1 nap|%d nap",
+ "hour": "1 óra|%d óra",
+ "minute": "1 perc|%d perc",
+ "second": "1 másodperc|%d másodperc",
+ "now": "most",
+ "ago": "%s",
+ "from_now": "%s múlva",
+ "before": "%s korábban",
+ "after": "%s később"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/id.json b/vendor/github.com/dromara/carbon/v2/lang/id.json
index e57fdfce..76a718ea 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/id.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/id.json
@@ -1,21 +1,22 @@
{
- "name": "Indonesian",
- "months": "Januari|Februari|Maret|April|Mei|Juni|Juli|Agustus|September|Oktober|November|Desember",
- "short_months": "Jan|Feb|Mar|Apr|Mei|Jun|Jul|Agt|Sep|Okt|Nov|Des",
- "weeks": "Minggu|Senin|Selasa|Rabu|Kamis|Jumaat|Sabtu",
- "short_weeks": "Min|Sen|Sel|Rab|Kam|Jum|Sab",
- "seasons": "Musim Semi|Musim Panas|Musim Gugur|Musim Salju",
- "constellations": "Aries|Taurus|Gemini|Cancer|Leo|Virgo|Libra|Scorpio|Sagitarius|Capricorn|Aquarius|Pisces",
- "year": "1 tahun|%d tahun",
- "month": "1 bulan|%d bulan",
- "week": "1 minggu|%d minggu",
- "day": "1 hari|%d hari",
- "hour": "1 jam|%d jam",
- "minute": "1 menit|%d menit",
- "second": "1 detik|%d detik",
- "now": "baru saja",
- "ago": "%s yang lalu",
- "from_now": "%s dari sekarang",
- "before": "%s sebelum",
- "after": "%s sesudah"
+ "name": "Indonesian",
+ "author": "https://github.com/justpoypoy",
+ "months": "Januari|Februari|Maret|April|Mei|Juni|Juli|Agustus|September|Oktober|November|Desember",
+ "short_months": "Jan|Feb|Mar|Apr|Mei|Jun|Jul|Agt|Sep|Okt|Nov|Des",
+ "weeks": "Minggu|Senin|Selasa|Rabu|Kamis|Jumaat|Sabtu",
+ "short_weeks": "Min|Sen|Sel|Rab|Kam|Jum|Sab",
+ "seasons": "Musim Semi|Musim Panas|Musim Gugur|Musim Salju",
+ "constellations": "Aries|Taurus|Gemini|Cancer|Leo|Virgo|Libra|Scorpio|Sagitarius|Capricorn|Aquarius|Pisces",
+ "year": "1 tahun|%d tahun",
+ "month": "1 bulan|%d bulan",
+ "week": "1 minggu|%d minggu",
+ "day": "1 hari|%d hari",
+ "hour": "1 jam|%d jam",
+ "minute": "1 menit|%d menit",
+ "second": "1 detik|%d detik",
+ "now": "baru saja",
+ "ago": "%s yang lalu",
+ "from_now": "%s dari sekarang",
+ "before": "%s sebelum",
+ "after": "%s sesudah"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/it.json b/vendor/github.com/dromara/carbon/v2/lang/it.json
index a2164f45..9ef6c8f2 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/it.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/it.json
@@ -1,20 +1,21 @@
{
- "name": "Italian",
- "months": "Gennaio|Febbraio|Marzo|Aprile|Maggio|Giugno|Luglio|Agosto|Settembre|Ottobre|Novembre|Dicembre",
- "short_months": "Gen|Feb|Mar|Apr|Mag|Giu|Lug|Ago|Set|Ott|Nov|Dic",
- "weeks": "Domenica|Lunedí|Martedí|Mercoledí|Giovedí|Venerdí|Sabato",
- "short_weeks": "Dom|Lun|Mar|Mer|Gio|Ven|Sab",
- "seasons": "Primavera|Estate|Autunno|Inverno",
- "year": "1 anno|%d anni",
- "month": "1 mese|%d mesi",
- "week": "1 settimana|%d settimane",
- "day": "1 giorno|%d giorni",
- "hour": "1 ora|%d ore",
- "minute": "1 minuto|%d minuti",
- "second": "1 secondo|%d secondi",
- "now": "proprio ora",
- "ago": "%s fa",
- "from_now": "%s da adesso",
- "before": "%s prima",
- "after": "%s dopo"
+ "name": "Italian",
+ "author": "https://github.com/nicoloHevelop",
+ "months": "Gennaio|Febbraio|Marzo|Aprile|Maggio|Giugno|Luglio|Agosto|Settembre|Ottobre|Novembre|Dicembre",
+ "short_months": "Gen|Feb|Mar|Apr|Mag|Giu|Lug|Ago|Set|Ott|Nov|Dic",
+ "weeks": "Domenica|Lunedí|Martedí|Mercoledí|Giovedí|Venerdí|Sabato",
+ "short_weeks": "Dom|Lun|Mar|Mer|Gio|Ven|Sab",
+ "seasons": "Primavera|Estate|Autunno|Inverno",
+ "year": "1 anno|%d anni",
+ "month": "1 mese|%d mesi",
+ "week": "1 settimana|%d settimane",
+ "day": "1 giorno|%d giorni",
+ "hour": "1 ora|%d ore",
+ "minute": "1 minuto|%d minuti",
+ "second": "1 secondo|%d secondi",
+ "now": "proprio ora",
+ "ago": "%s fa",
+ "from_now": "%s da adesso",
+ "before": "%s prima",
+ "after": "%s dopo"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/jp.json b/vendor/github.com/dromara/carbon/v2/lang/jp.json
index e5808401..f38711b2 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/jp.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/jp.json
@@ -1,21 +1,22 @@
{
- "name": "Japanese",
- "months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
- "short_months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
- "weeks": "日曜日|月曜日|火曜日|水曜日|木曜日|金曜日|土曜日",
- "short_weeks": "日|月|火|水|木|金|土",
- "seasons": "春|夏|秋|冬",
- "constellations": "おひつじ座|おうし座|ふたご座|かに座|しし座|おとめ座|てんびん座|さそり座|いて座|やぎ座|みずがめ座|うお座",
- "year": "%d 年",
- "month": "%d ヶ月",
- "week": "%d 週間",
- "day": "%d 日",
- "hour": "%d 時間",
- "minute": "%d 分",
- "second": "%d 秒",
- "now": "現在",
- "ago": "%s前",
- "from_now": "%s後",
- "before": "%s前",
- "after": "%s後"
+ "name": "Japanese",
+ "author": "https://github.com/gouguoyin",
+ "months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
+ "short_months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
+ "weeks": "日曜日|月曜日|火曜日|水曜日|木曜日|金曜日|土曜日",
+ "short_weeks": "日|月|火|水|木|金|土",
+ "seasons": "春|夏|秋|冬",
+ "constellations": "おひつじ座|おうし座|ふたご座|かに座|しし座|おとめ座|てんびん座|さそり座|いて座|やぎ座|みずがめ座|うお座",
+ "year": "%d 年",
+ "month": "%d ヶ月",
+ "week": "%d 週間",
+ "day": "%d 日",
+ "hour": "%d 時間",
+ "minute": "%d 分",
+ "second": "%d 秒",
+ "now": "現在",
+ "ago": "%s前",
+ "from_now": "%s後",
+ "before": "%s前",
+ "after": "%s後"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/kr.json b/vendor/github.com/dromara/carbon/v2/lang/kr.json
index 978d3a88..05ad12b7 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/kr.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/kr.json
@@ -1,21 +1,22 @@
{
- "name": "Korean",
- "months": "일월|이월|삼월|사월|오월|유월|칠월|팔월|구월|시월|십일월|십이월",
- "short_months": "1월|2월|3월|4월|5월|6월|7월|8월|9월|10월|11월|12월",
- "weeks": "일요일|월요일|화요일|수요일|목요일|금요일|토요일",
- "short_weeks": "일요일|월요일|화요일|수요일|목요일|금요일|토요일",
- "seasons": "봄|여름|가을|겨울",
- "constellations": "양자리|황소자리|쌍둥이자리|게자리|사자자리|처녀자리|천칭자리|전갈자리|사수자리|염소자리|물병자리|물고기자리",
- "year": "%d 년",
- "month": "%d 개월",
- "week": "%d 주",
- "day": "%d 일",
- "hour": "%d 시간",
- "minute": "%d 분",
- "second": "%d 초",
- "now": "방금",
- "ago": "%s앞",
- "from_now": "%s후",
- "before": "%s전",
- "after": "%s후"
+ "name": "Korean",
+ "author": "https://github.com/nannul",
+ "months": "일월|이월|삼월|사월|오월|유월|칠월|팔월|구월|시월|십일월|십이월",
+ "short_months": "1월|2월|3월|4월|5월|6월|7월|8월|9월|10월|11월|12월",
+ "weeks": "일요일|월요일|화요일|수요일|목요일|금요일|토요일",
+ "short_weeks": "일요일|월요일|화요일|수요일|목요일|금요일|토요일",
+ "seasons": "봄|여름|가을|겨울",
+ "constellations": "양자리|황소자리|쌍둥이자리|게자리|사자자리|처녀자리|천칭자리|전갈자리|사수자리|염소자리|물병자리|물고기자리",
+ "year": "%d 년",
+ "month": "%d 개월",
+ "week": "%d 주",
+ "day": "%d 일",
+ "hour": "%d 시간",
+ "minute": "%d 분",
+ "second": "%d 초",
+ "now": "방금",
+ "ago": "%s앞",
+ "from_now": "%s후",
+ "before": "%s전",
+ "after": "%s후"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/ms-MY.json b/vendor/github.com/dromara/carbon/v2/lang/ms-MY.json
index 49b2922d..467bb681 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/ms-MY.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/ms-MY.json
@@ -1,21 +1,22 @@
{
- "name": "Bahasa Malaysia",
- "months": "Januari|Februari|Mac|April|Mei|Jun|Julai|Ogos|September|Oktober|November|Disember",
- "short_months": "Jan|Feb|Mac|Apr|Mei|Jun|Jul|Ogs|Sep|Okt|Nov|Dis",
- "weeks": "Ahad|Isnin|Selasa|Rabu|Khamis|Jumaat|Sabtu",
- "short_weeks": "Ahd|Isn|Sel|Rab|Kha|Jum|Sab",
- "seasons": "Musim Bunga|Musim Panas|Musim Luruh|Musim Sejuk",
- "constellations": "Aries|Taurus|Gemini|Cancer|Leo|Virgo|Libra|Scorpio|Sagittarius|Capricorn|Aquarius|Pisces",
- "year": "1 tahun|%d tahun",
- "month": "1 bulan|%d bulan",
- "week": "1 minggu|%d minggu",
- "day": "1 hari|%d hari",
- "hour": "1 jam|%d jam",
- "minute": "1 minit|%d minit",
- "second": "1 saat|%d saat",
- "now": "baru tadi",
- "ago": "%s lalu",
- "from_now": "%s dari sekarang",
- "before": "sebelum %s",
- "after": "selepas %s"
+ "name": "Bahasa Malaysia",
+ "author": "https://github.com/hollowaykeanho",
+ "months": "Januari|Februari|Mac|April|Mei|Jun|Julai|Ogos|September|Oktober|November|Disember",
+ "short_months": "Jan|Feb|Mac|Apr|Mei|Jun|Jul|Ogs|Sep|Okt|Nov|Dis",
+ "weeks": "Ahad|Isnin|Selasa|Rabu|Khamis|Jumaat|Sabtu",
+ "short_weeks": "Ahd|Isn|Sel|Rab|Kha|Jum|Sab",
+ "seasons": "Musim Bunga|Musim Panas|Musim Luruh|Musim Sejuk",
+ "constellations": "Aries|Taurus|Gemini|Cancer|Leo|Virgo|Libra|Scorpio|Sagittarius|Capricorn|Aquarius|Pisces",
+ "year": "1 tahun|%d tahun",
+ "month": "1 bulan|%d bulan",
+ "week": "1 minggu|%d minggu",
+ "day": "1 hari|%d hari",
+ "hour": "1 jam|%d jam",
+ "minute": "1 minit|%d minit",
+ "second": "1 saat|%d saat",
+ "now": "baru tadi",
+ "ago": "%s lalu",
+ "from_now": "%s dari sekarang",
+ "before": "sebelum %s",
+ "after": "selepas %s"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/nb.json b/vendor/github.com/dromara/carbon/v2/lang/nb.json
new file mode 100644
index 00000000..0da803b8
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/lang/nb.json
@@ -0,0 +1,22 @@
+{
+ "name": "Norsk bokmål",
+ "author": "https://github.com/bendikrb ",
+ "months": "januar|februar|mars|april|mai|juni|juli|august|september|oktober|november|desember",
+ "short_months": "jan|feb|mar|apr|mai|jun|jul|aug|sep|okt|nov|des",
+ "weeks": "søndag|mandag|tirsdag|onsdag|torsdag|fredag|lørdag",
+ "short_weeks": "søn|man|tir|ons|tor|fre|lør",
+ "seasons": "vår|sommer|høst|vinter",
+ "constellations": "vær|tyr|tvilling|kreps|løve|jomfru|vekt|skorpion|skytten|steinbukk|vannmann|fisk",
+ "year": "1 år|%d år",
+ "month": "1 måned|%d måneder",
+ "week": "1 uke|%d uker",
+ "day": "1 dag|%d dager",
+ "hour": "1 time|%d timer",
+ "minute": "1 minutt|%d minutter",
+ "second": "1 sekund|%d sekunder",
+ "now": "nå nettopp",
+ "ago": "%s siden",
+ "from_now": "om %s",
+ "before": "%s før",
+ "after": "%s etter"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/nl.json b/vendor/github.com/dromara/carbon/v2/lang/nl.json
index d49ea2d2..e9df4408 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/nl.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/nl.json
@@ -1,21 +1,22 @@
{
- "name": "Dutch",
- "months": "januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december",
- "short_months": "jan|feb|mrt|apr|mei|jun|jul|aug|sep|okt|nov|dec",
- "weeks": "Zondag|Maandag|Dinsdag|Woensdag|Donderdag|Vrijdag|Zaterdag|Zondag",
- "short_weeks": "zo|ma|di|wo|do|vr|za",
- "seasons": "Lente|Zomer|Herfst|Winter",
- "constellations": "Ram|Stier|Tweelingen|Kreeft|Leeuw|Maagd|Weegschaal|Schorpioen|Boogschutter|Steenbok|Waterman|Vissen",
- "year": "1 jaar|%d jaren",
- "month": "1 maand|%d maanden",
- "week": "1 week|%d weken",
- "day": "1 dag|%d dagen",
- "hour": "1 uur|%d uren",
- "minute": "1 minuut|%d minuten",
- "second": "1 seconde|%d seconden",
- "now": "zojuist",
- "ago": "%s geleden",
- "from_now": "%s vanaf nu",
- "before": "%s voor",
- "after": "%s na"
+ "name": "Dutch",
+ "author": "https://github.com/RemcoE33",
+ "months": "januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december",
+ "short_months": "jan|feb|mrt|apr|mei|jun|jul|aug|sep|okt|nov|dec",
+ "weeks": "Zondag|Maandag|Dinsdag|Woensdag|Donderdag|Vrijdag|Zaterdag|Zondag",
+ "short_weeks": "zo|ma|di|wo|do|vr|za",
+ "seasons": "Lente|Zomer|Herfst|Winter",
+ "constellations": "Ram|Stier|Tweelingen|Kreeft|Leeuw|Maagd|Weegschaal|Schorpioen|Boogschutter|Steenbok|Waterman|Vissen",
+ "year": "1 jaar|%d jaren",
+ "month": "1 maand|%d maanden",
+ "week": "1 week|%d weken",
+ "day": "1 dag|%d dagen",
+ "hour": "1 uur|%d uren",
+ "minute": "1 minuut|%d minuten",
+ "second": "1 seconde|%d seconden",
+ "now": "zojuist",
+ "ago": "%s geleden",
+ "from_now": "%s vanaf nu",
+ "before": "%s voor",
+ "after": "%s na"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/pl.json b/vendor/github.com/dromara/carbon/v2/lang/pl.json
index 03ba9d98..094252ba 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/pl.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/pl.json
@@ -1,21 +1,22 @@
{
- "name": "Polish",
- "months": "stycznia|lutego|marca|kwietnia|maja|czerwca|lipca|sierpnia|września|października|listopada|grudnia",
- "short_months": "sty|lut|mar|kwi|maj|cze|lip|sie|wrz|paź|lis|gru",
- "weeks": "niedziela|poniedziałek|wtorek|środa|czwartek|piątek|sobota",
- "short_weeks": "ndz|pon|wt|śr|czw|pt|sob",
- "seasons": "sprężyna|lato|jesień|zima",
- "constellations": "baran|byk|bliźnięta|rak|lew|dziewica|waga|skorpion|strzelec|koziorożec|wodnik|ryby",
- "year": "1 rok|2 lata|%d lat",
- "month": "1 miesiąc|2 miesiące|%d miesięcy",
- "week": "1 tydzień|2 tygodnie|%d tygodni",
- "day": "1 dzień|%d dni",
- "hour": "1 godzina|2 godziny|%d godzin",
- "minute": "1 minuta|2 minuty|%d minut",
- "second": "1 sekunda|2 sekundy|%d sekund",
- "now": "teraz",
- "ago": "%s temu",
- "from_now": "%s po",
- "before": "%s przed",
- "after": "%s po"
-}
\ No newline at end of file
+ "name": "Polish",
+ "author": "https://github.com/gouguoyin",
+ "months": "stycznia|lutego|marca|kwietnia|maja|czerwca|lipca|sierpnia|września|października|listopada|grudnia",
+ "short_months": "sty|lut|mar|kwi|maj|cze|lip|sie|wrz|paź|lis|gru",
+ "weeks": "niedziela|poniedziałek|wtorek|środa|czwartek|piątek|sobota",
+ "short_weeks": "ndz|pon|wt|śr|czw|pt|sob",
+ "seasons": "sprężyna|lato|jesień|zima",
+ "constellations": "baran|byk|bliźnięta|rak|lew|dziewica|waga|skorpion|strzelec|koziorożec|wodnik|ryby",
+ "year": "1 rok|2 lata|%d lat",
+ "month": "1 miesiąc|2 miesiące|%d miesięcy",
+ "week": "1 tydzień|2 tygodnie|%d tygodni",
+ "day": "1 dzień|%d dni",
+ "hour": "1 godzina|2 godziny|%d godzin",
+ "minute": "1 minuta|2 minuty|%d minut",
+ "second": "1 sekunda|2 sekundy|%d sekund",
+ "now": "teraz",
+ "ago": "%s temu",
+ "from_now": "%s po",
+ "before": "%s przed",
+ "after": "%s po"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/pt.json b/vendor/github.com/dromara/carbon/v2/lang/pt.json
index 1602eead..13645f92 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/pt.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/pt.json
@@ -1,21 +1,22 @@
{
- "name": "Portuguese",
- "months": "Janeiro|Fevereiro|Março|Abril|Maio|Junho|Julho|Agosto|Setembro|Outubro|Novembro|Dezembro",
- "short_months": "Jan|Fev|Mar|Abr|Maio|Jun|Jul|Ago|Set|Out|Nov|Dez",
- "weeks": "Domingo|Segunda-feira|Terça-feira|Quarta-feira|Quinta-feira|Sexta-feira|Sábado",
- "short_weeks": "Dom|Seg|Ter|Qua|Qui|Sex|Sab",
- "seasons": "Primavera|Verão|Outono|Inverno",
- "constellations": "Áries|Touro|Gêmeos|Câncer|Leão|Virgem|Libra|Escorpião|Sagitário|Capricórnio|Aquário|Peixes",
- "year": "1 ano|%d anos",
- "month": "1 mês|%d meses",
- "week": "1 semana|%d semanas",
- "day": "1 dia|%d dias",
- "hour": "1 hora|%d horas",
- "minute": "1 minuto|%d minutos",
- "second": "1 segundo|%d segundos",
- "now": "agora",
- "ago": "%s atrás",
- "from_now": "%s a partir de agora",
- "before": "%s antes",
- "after": "%s depois"
+ "name": "Portuguese",
+ "author": "https://github.com/felipear89",
+ "months": "Janeiro|Fevereiro|Março|Abril|Maio|Junho|Julho|Agosto|Setembro|Outubro|Novembro|Dezembro",
+ "short_months": "Jan|Fev|Mar|Abr|Maio|Jun|Jul|Ago|Set|Out|Nov|Dez",
+ "weeks": "Domingo|Segunda-feira|Terça-feira|Quarta-feira|Quinta-feira|Sexta-feira|Sábado",
+ "short_weeks": "Dom|Seg|Ter|Qua|Qui|Sex|Sab",
+ "seasons": "Primavera|Verão|Outono|Inverno",
+ "constellations": "Áries|Touro|Gêmeos|Câncer|Leão|Virgem|Libra|Escorpião|Sagitário|Capricórnio|Aquário|Peixes",
+ "year": "1 ano|%d anos",
+ "month": "1 mês|%d meses",
+ "week": "1 semana|%d semanas",
+ "day": "1 dia|%d dias",
+ "hour": "1 hora|%d horas",
+ "minute": "1 minuto|%d minutos",
+ "second": "1 segundo|%d segundos",
+ "now": "agora",
+ "ago": "%s atrás",
+ "from_now": "%s a partir de agora",
+ "before": "%s antes",
+ "after": "%s depois"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/ro.json b/vendor/github.com/dromara/carbon/v2/lang/ro.json
index a11bc4b6..85905355 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/ro.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/ro.json
@@ -1,21 +1,22 @@
{
- "name": "Romanian",
- "months": "Ianuarie|Februarie|Martie|Aprilie|Mai|Iunie|Iulie|August|Septembrie|Octombrie|Noiembrie|Decembrie",
- "short_months": "Ian|Feb|Mar|Apr|Mai|Iun|Iul|Aug|Sep|Oct|Noi|Dec",
- "weeks": "Duminică|Luni|Marți|Miercuri|Joi|Vineri|Sîmbătă",
- "short_weeks": "Dum|Lun|Mar|Mie|Joi|Vin|Sîm",
- "seasons": "Primăvara|Vara|Toamna|Iarna",
- "constellations": "Berbec|Taur|Gemeni|Rac|Leu|Fecioară|Balanță|Scorpion|Săgetător|Capricorn|Vărsător|Pești",
- "year": "1 an|%d ani",
- "month": "1 lună|%d luni",
- "week": "1 săptămînă|%d săptămîni",
- "day": "1 zi|%d zile",
- "hour": "1 oră|%d ore",
- "minute": "1 minută|%d minute",
- "second": "1 secundă|%d secunde",
- "now": "chiar acum",
- "ago": "%s în urmă",
- "from_now": "%s de acum",
- "before": "%s înainte",
- "after": "%s după"
+ "name": "Romanian",
+ "author": "https://github.com/DrOctavius",
+ "months": "Ianuarie|Februarie|Martie|Aprilie|Mai|Iunie|Iulie|August|Septembrie|Octombrie|Noiembrie|Decembrie",
+ "short_months": "Ian|Feb|Mar|Apr|Mai|Iun|Iul|Aug|Sep|Oct|Noi|Dec",
+ "weeks": "Duminică|Luni|Marți|Miercuri|Joi|Vineri|Sîmbătă",
+ "short_weeks": "Dum|Lun|Mar|Mie|Joi|Vin|Sîm",
+ "seasons": "Primăvara|Vara|Toamna|Iarna",
+ "constellations": "Berbec|Taur|Gemeni|Rac|Leu|Fecioară|Balanță|Scorpion|Săgetător|Capricorn|Vărsător|Pești",
+ "year": "1 an|%d ani",
+ "month": "1 lună|%d luni",
+ "week": "1 săptămînă|%d săptămîni",
+ "day": "1 zi|%d zile",
+ "hour": "1 oră|%d ore",
+ "minute": "1 minută|%d minute",
+ "second": "1 secundă|%d secunde",
+ "now": "chiar acum",
+ "ago": "%s în urmă",
+ "from_now": "%s de acum",
+ "before": "%s înainte",
+ "after": "%s după"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/ru.json b/vendor/github.com/dromara/carbon/v2/lang/ru.json
index 74439744..7d5b2b09 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/ru.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/ru.json
@@ -1,21 +1,22 @@
{
- "name": "Russian",
- "months": "Январь|Февраль|Март|Апрель|Май|Июнь|Июль|Август|Сентябрь|Октябрь|Ноябрь|Декабрь",
- "short_months": "Янв|Фев|Мар|Апр|Май|Июн|Июл|Авг|Сен|Окт|Ноя|Дек",
- "weeks": "Воскресенье|Понедельник|Вторник|Среда|Четверг|Пятница|Суббота",
- "short_weeks": "Вс|Пн|Вт|Ср|Чт|Пт|Сб",
- "seasons": "Весна|Лето|Осень|Зима",
- "constellations": "Овен|Телец|Близнецы|Рак|Лев|Дева|Весы|Скорпион|Стрелец|Козерог|Водолей|Рыбы",
- "year": "1 год|2 года|3 года|4 года|%d лет",
- "month": "1 месяц|2 месяца|3 месяца|4 месяца|%d месяцев",
- "week": "1 неделя|2 недели|3 недели|4 недели|%d недель",
- "day": "1 день|2 дня|3 дня|4 дня|%d дней",
- "hour": "1 час|2 часа|3 часа|4 часа|%d часов",
- "minute": "1 минуту|2 минуты|3 минуты|4 минуты|%d минут",
- "second": "1 секунда|2 секунды|3 секунды|4 секунды|%d секунд",
- "now": "сейчас",
- "ago": "%s назад",
- "from_now": "через %s",
- "before": "за %s до",
- "after": "через %s после"
+ "name": "Russian",
+ "author": "https://github.com/zemlyak",
+ "months": "Январь|Февраль|Март|Апрель|Май|Июнь|Июль|Август|Сентябрь|Октябрь|Ноябрь|Декабрь",
+ "short_months": "Янв|Фев|Мар|Апр|Май|Июн|Июл|Авг|Сен|Окт|Ноя|Дек",
+ "weeks": "Воскресенье|Понедельник|Вторник|Среда|Четверг|Пятница|Суббота",
+ "short_weeks": "Вс|Пн|Вт|Ср|Чт|Пт|Сб",
+ "seasons": "Весна|Лето|Осень|Зима",
+ "constellations": "Овен|Телец|Близнецы|Рак|Лев|Дева|Весы|Скорпион|Стрелец|Козерог|Водолей|Рыбы",
+ "year": "1 год|2 года|3 года|4 года|%d лет",
+ "month": "1 месяц|2 месяца|3 месяца|4 месяца|%d месяцев",
+ "week": "1 неделя|2 недели|3 недели|4 недели|%d недель",
+ "day": "1 день|2 дня|3 дня|4 дня|%d дней",
+ "hour": "1 час|2 часа|3 часа|4 часа|%d часов",
+ "minute": "1 минуту|2 минуты|3 минуты|4 минуты|%d минут",
+ "second": "1 секунда|2 секунды|3 секунды|4 секунды|%d секунд",
+ "now": "сейчас",
+ "ago": "%s назад",
+ "from_now": "через %s",
+ "before": "за %s до",
+ "after": "через %s после"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/se.json b/vendor/github.com/dromara/carbon/v2/lang/se.json
index 5b210026..1ea09049 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/se.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/se.json
@@ -1,21 +1,22 @@
{
- "name": "Swedish",
- "months": "Januari|Februari|Mars|April|Maj|Juni|Juli|Augusti|September|Oktober|November|December",
- "short_months": "Jan|Feb|Mars|April|Maj|Juni|Juli|Aug|Sep|Okt|Nov|Dec",
- "weeks": "Söndag|Måndag|Tisdag|Onsdag|Torsdag|Fredag|Lördag",
- "short_weeks": "Sön|Mån|Tis|Ons|Tors|Fre|Lör",
- "seasons": "Vår|Sommar|Höst|Vinter",
- "constellations": "Väduren|Oxen|Tvillingarna|Kräftan|Lejonet|Jungfrun|Vågen|Skorpionen|Skytten|Stenbocken|Vattumannen|Fiskarna",
- "year": "1 år|%d år",
- "month": "1 månad|%d månader",
- "week": "1 vecka|%d veckor",
- "day": "1 dag|%d dagar",
- "hour": "1 timme|%d timmar",
- "minute": "1 minut|%d minuter",
- "second": "1 sekund|%d sekunder",
- "now": "just nu",
- "ago": "%s sedan",
- "from_now": "%s fr.o.m. nu",
- "before": "%s innan",
- "after": "%s efter"
-}
\ No newline at end of file
+ "name": "Swedish",
+ "author": "https://github.com/jwanglof",
+ "months": "Januari|Februari|Mars|April|Maj|Juni|Juli|Augusti|September|Oktober|November|December",
+ "short_months": "Jan|Feb|Mars|April|Maj|Juni|Juli|Aug|Sep|Okt|Nov|Dec",
+ "weeks": "Söndag|Måndag|Tisdag|Onsdag|Torsdag|Fredag|Lördag",
+ "short_weeks": "Sön|Mån|Tis|Ons|Tors|Fre|Lör",
+ "seasons": "Vår|Sommar|Höst|Vinter",
+ "constellations": "Väduren|Oxen|Tvillingarna|Kräftan|Lejonet|Jungfrun|Vågen|Skorpionen|Skytten|Stenbocken|Vattumannen|Fiskarna",
+ "year": "1 år|%d år",
+ "month": "1 månad|%d månader",
+ "week": "1 vecka|%d veckor",
+ "day": "1 dag|%d dagar",
+ "hour": "1 timme|%d timmar",
+ "minute": "1 minut|%d minuter",
+ "second": "1 sekund|%d sekunder",
+ "now": "just nu",
+ "ago": "%s sedan",
+ "from_now": "%s fr.o.m. nu",
+ "before": "%s innan",
+ "after": "%s efter"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/th.json b/vendor/github.com/dromara/carbon/v2/lang/th.json
index 4ca378f4..f661b48a 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/th.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/th.json
@@ -1,21 +1,22 @@
{
- "name": "Thailand",
- "months": "มกราคม|กุมภาพันธ์|มีนาคม|เมษายน|พฤษภาคม|มิถุนายน|กรกฎาคม|สิงหาคม|กันยายน|ตุลาคม|พฤศจิกายน|ธันวาคม",
- "short_months": "ม.ค.|ก.พ.|มี.ค.|เม.ย.|พ.ค.|มิ.ย.|ก.ค.|ส.ค.|ก.ย.|ต.ค.|พ.ย.|ธ.ค.",
- "weeks": "อาทิตย์|จันทร์|อังคาร|พุธ|พฤหัสบดี|ศุกร์|เสาร์",
- "short_weeks": "อา.|จ.|อัง.|พ.|พฤ.|ศ.|ส.",
- "seasons": "ฤดูใบไม้ผลิ|ฤดูร้อน|ฤดูใบไม้ร่วง|ฤดูหนาว",
- "constellations": "เมษ|พฤษภ|เมถุน|กรกฎ|สิงห์|กันย์|ตุลย์|พิจิก|ธนู|มังกร|กุมภ์|มีน",
- "year": "1 ปี|%d ปี",
- "month": "1 เดือน|%d เดือน",
- "week": "1 สัปดาห์|%d สัปดาห์",
- "day": "1 วัน|%d วัน",
- "hour": "1 ชั่วโมง|%d ชั่วโมง",
- "minute": "1 นาที|%d นาที",
- "second": "1 วินาที|%d วินาที",
- "now": "ไม่กี่วินาทีที่แล้ว",
- "ago": "%s ที่แล้ว",
- "from_now": "อีก %s",
- "before": "%s ก่อน",
- "after": "%s หลังจากนี้"
-}
\ No newline at end of file
+ "name": "Thailand",
+ "author": "https://github.com/izcream",
+ "months": "มกราคม|กุมภาพันธ์|มีนาคม|เมษายน|พฤษภาคม|มิถุนายน|กรกฎาคม|สิงหาคม|กันยายน|ตุลาคม|พฤศจิกายน|ธันวาคม",
+ "short_months": "ม.ค.|ก.พ.|มี.ค.|เม.ย.|พ.ค.|มิ.ย.|ก.ค.|ส.ค.|ก.ย.|ต.ค.|พ.ย.|ธ.ค.",
+ "weeks": "อาทิตย์|จันทร์|อังคาร|พุธ|พฤหัสบดี|ศุกร์|เสาร์",
+ "short_weeks": "อา.|จ.|อัง.|พ.|พฤ.|ศ.|ส.",
+ "seasons": "ฤดูใบไม้ผลิ|ฤดูร้อน|ฤดูใบไม้ร่วง|ฤดูหนาว",
+ "constellations": "เมษ|พฤษภ|เมถุน|กรกฎ|สิงห์|กันย์|ตุลย์|พิจิก|ธนู|มังกร|กุมภ์|มีน",
+ "year": "1 ปี|%d ปี",
+ "month": "1 เดือน|%d เดือน",
+ "week": "1 สัปดาห์|%d สัปดาห์",
+ "day": "1 วัน|%d วัน",
+ "hour": "1 ชั่วโมง|%d ชั่วโมง",
+ "minute": "1 นาที|%d นาที",
+ "second": "1 วินาที|%d วินาที",
+ "now": "ไม่กี่วินาทีที่แล้ว",
+ "ago": "%s ที่แล้ว",
+ "from_now": "อีก %s",
+ "before": "%s ก่อน",
+ "after": "%s หลังจากนี้"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/tr.json b/vendor/github.com/dromara/carbon/v2/lang/tr.json
index c2bcddc8..f6028bd3 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/tr.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/tr.json
@@ -1,21 +1,22 @@
{
- "name": "Turkish",
- "months": "Ocak|Şubat|Mart|Nisan|Mayıs|Haziran|Temmuz|Ağustos|Eylül|Ekim|Kasım|Aralık",
- "short_months": "Oca|Şub|Mar|Nis|May|Haz|Tem|Ağu|Eyl|Eki|Kas|Ara",
- "weeks": "Pazar|Pazartesi|Salı|Çarşamba|Perşembe|Cuma|Cumartesi",
- "short_weeks": "Paz|Pts|Sal|Çrş|Per|Cum|Cts",
- "seasons": "İlkbahar|Yaz|Sonbahar|Kış",
- "constellations": "Koç|Boğa|İkizler|Yengeç|Aslan|Başak|Terazi|Akrep|Yay|Oğlak|Kova|Balık",
- "year": "bir yıl|%d yıl",
- "month": "bir ay|%d ay",
- "week": "bir hafta|%d hafta",
- "day": "bir gün|%d gün",
- "hour": "bir saat|%d saat",
- "minute": "bir dakika|%d dakika",
- "second": "bir saniye|%d saniye",
- "now": "az önce",
- "ago": "%s evvel",
- "from_now": "şu andan itibaren %s sonra",
- "before": "%s önce",
- "after": "%s sonra"
+ "name": "Turkish",
+ "author": "https://github.com/emresenyuva",
+ "months": "Ocak|Şubat|Mart|Nisan|Mayıs|Haziran|Temmuz|Ağustos|Eylül|Ekim|Kasım|Aralık",
+ "short_months": "Oca|Şub|Mar|Nis|May|Haz|Tem|Ağu|Eyl|Eki|Kas|Ara",
+ "weeks": "Pazar|Pazartesi|Salı|Çarşamba|Perşembe|Cuma|Cumartesi",
+ "short_weeks": "Paz|Pts|Sal|Çrş|Per|Cum|Cts",
+ "seasons": "İlkbahar|Yaz|Sonbahar|Kış",
+ "constellations": "Koç|Boğa|İkizler|Yengeç|Aslan|Başak|Terazi|Akrep|Yay|Oğlak|Kova|Balık",
+ "year": "bir yıl|%d yıl",
+ "month": "bir ay|%d ay",
+ "week": "bir hafta|%d hafta",
+ "day": "bir gün|%d gün",
+ "hour": "bir saat|%d saat",
+ "minute": "bir dakika|%d dakika",
+ "second": "bir saniye|%d saniye",
+ "now": "az önce",
+ "ago": "%s evvel",
+ "from_now": "şu andan itibaren %s sonra",
+ "before": "%s önce",
+ "after": "%s sonra"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/uk.json b/vendor/github.com/dromara/carbon/v2/lang/uk.json
index e9791585..df2bd875 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/uk.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/uk.json
@@ -1,21 +1,22 @@
{
- "name": "Ukrainian",
- "months": "січня|лютого|березня|квітня|травня|червня|липня|серпня|вересня|жовтня|листопада|грудня",
- "short_months": "січ|лют|бер|квіт|трав|черв|лип|серп|вер|жовт|лист|груд",
- "weeks": "неділя|понеділок|вівторок|середа|четвер|п’ятниця|субота",
- "short_weeks": "ндл|пнд|втр|срд|чтв|птн|сбт",
- "seasons": "Весна|Літо|Осінь|Зима",
- "constellations": "Овен|Телець|Близнюки|Рак|Лев|Діва|Терези|Скорпіон|Стрілець|Козоріг|Водолій|Риби",
- "year": "рік|2 роки|3 роки|4 роки|%d років",
- "month": "місяць|2 місяці|3 місяці|4 місяці|%d місяців",
- "week": "tиждень|2 тижні|3 тижні|4 тижні|%d тижнів",
- "day": "день|2 дні|3 дні|4 дні|%d днів",
- "hour": "1 година|2 години|3 години|4 години|%d годин",
- "minute": "1 хвилина|2 хвилини|3 хвилини|4 хвилини|%d хвилин",
- "second": "1 секунда|2 секунди|3 секунди|4 секунди|%d секунд",
- "now": "зараз",
- "ago": "%s тому",
- "from_now": "за %s",
- "before": "%s до",
- "after": "%s після"
-}
\ No newline at end of file
+ "name": "Ukrainian",
+ "author": "https://github.com/zumoshi",
+ "months": "січня|лютого|березня|квітня|травня|червня|липня|серпня|вересня|жовтня|листопада|грудня",
+ "short_months": "січ|лют|бер|квіт|трав|черв|лип|серп|вер|жовт|лист|груд",
+ "weeks": "неділя|понеділок|вівторок|середа|четвер|п’ятниця|субота",
+ "short_weeks": "ндл|пнд|втр|срд|чтв|птн|сбт",
+ "seasons": "Весна|Літо|Осінь|Зима",
+ "constellations": "Овен|Телець|Близнюки|Рак|Лев|Діва|Терези|Скорпіон|Стрілець|Козоріг|Водолій|Риби",
+ "year": "рік|2 роки|3 роки|4 роки|%d років",
+ "month": "місяць|2 місяці|3 місяці|4 місяці|%d місяців",
+ "week": "tиждень|2 тижні|3 тижні|4 тижні|%d тижнів",
+ "day": "день|2 дні|3 дні|4 дні|%d днів",
+ "hour": "1 година|2 години|3 години|4 години|%d годин",
+ "minute": "1 хвилина|2 хвилини|3 хвилини|4 хвилини|%d хвилин",
+ "second": "1 секунда|2 секунди|3 секунди|4 секунди|%d секунд",
+ "now": "зараз",
+ "ago": "%s тому",
+ "from_now": "за %s",
+ "before": "%s до",
+ "after": "%s після"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/vi.json b/vendor/github.com/dromara/carbon/v2/lang/vi.json
index 87a8ee9c..f5dfa893 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/vi.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/vi.json
@@ -1,21 +1,22 @@
{
- "name": "VietNamese",
- "months": "Tháng Một|Tháng Hai|Tháng Ba|Tháng Tư|Tháng Năm|Tháng Sáu|Tháng Bảy|Tháng Tám|Tháng Chín|Tháng Mười|Tháng Mười Một|Tháng Mười Hai",
- "short_months": "Giêng|Hai|Ba|Bốn|Năm|Sáu|Bảy|Tám|Chìn|Mười|Một|Chạp",
- "weeks": "Chủ Nhật|Thứ Hai|Thứ Ba|Thứ Tư|Thứ Năm|Thứ Sáu|Thứ Bảy",
- "short_weeks": "CN|Hai|Ba|Tư|Năm|Sáu|Bảy",
- "seasons": "Xuân|Hè|Thu|Đông",
- "constellations": "Bạch Dương|Kim Ngưu|Song Tử|Cự Giải|Sư Tử|Xử Nữ|Thiên Bình|Bọ Cạp|Nhân Mã|Ma Kết|Bảo Bình|Song Ngư",
- "year": "%d năm",
- "month": "%d tháng",
- "week": "%d tuần",
- "day": "%d ngày",
- "hour": "%d giờ",
- "minute": "%d phút",
- "second": "%d giây",
- "now": "vừa xong",
- "ago": "%s trước",
- "from_now": "%s từ bây giờ",
- "before": "%s trước",
- "after": "%s sau"
+ "name": "VietNamese",
+ "author": "https://github.com/culy247",
+ "months": "Tháng Một|Tháng Hai|Tháng Ba|Tháng Tư|Tháng Năm|Tháng Sáu|Tháng Bảy|Tháng Tám|Tháng Chín|Tháng Mười|Tháng Mười Một|Tháng Mười Hai",
+ "short_months": "Giêng|Hai|Ba|Bốn|Năm|Sáu|Bảy|Tám|Chìn|Mười|Một|Chạp",
+ "weeks": "Chủ Nhật|Thứ Hai|Thứ Ba|Thứ Tư|Thứ Năm|Thứ Sáu|Thứ Bảy",
+ "short_weeks": "CN|Hai|Ba|Tư|Năm|Sáu|Bảy",
+ "seasons": "Xuân|Hè|Thu|Đông",
+ "constellations": "Bạch Dương|Kim Ngưu|Song Tử|Cự Giải|Sư Tử|Xử Nữ|Thiên Bình|Bọ Cạp|Nhân Mã|Ma Kết|Bảo Bình|Song Ngư",
+ "year": "%d năm",
+ "month": "%d tháng",
+ "week": "%d tuần",
+ "day": "%d ngày",
+ "hour": "%d giờ",
+ "minute": "%d phút",
+ "second": "%d giây",
+ "now": "vừa xong",
+ "ago": "%s trước",
+ "from_now": "%s từ bây giờ",
+ "before": "%s trước",
+ "after": "%s sau"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/zh-CN.json b/vendor/github.com/dromara/carbon/v2/lang/zh-CN.json
index 89036c56..8a2ec3ee 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/zh-CN.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/zh-CN.json
@@ -1,21 +1,22 @@
{
- "name": "Simplified Chinese",
- "months": "一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月",
- "short_months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
- "weeks": "星期日|星期一|星期二|星期三|星期四|星期五|星期六",
- "short_weeks": "周日|周一|周二|周三|周四|周五|周六",
- "seasons": "春季|夏季|秋季|冬季",
- "constellations": "白羊座|金牛座|双子座|巨蟹座|狮子座|处女座|天秤座|天蝎座|射手座|摩羯座|水瓶座|双鱼座",
- "year": "%d 年",
- "month": "%d 个月",
- "week": "%d 周",
- "day": "%d 天",
- "hour": "%d 小时",
- "minute": "%d 分钟",
- "second": "%d 秒",
- "now": "刚刚",
- "ago": "%s前",
- "from_now": "%s后",
- "before": "%s前",
- "after": "%s后"
+ "name": "Simplified Chinese",
+ "author": "https://github.com/gouguoyin",
+ "months": "一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月",
+ "short_months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
+ "weeks": "星期日|星期一|星期二|星期三|星期四|星期五|星期六",
+ "short_weeks": "周日|周一|周二|周三|周四|周五|周六",
+ "seasons": "春季|夏季|秋季|冬季",
+ "constellations": "白羊座|金牛座|双子座|巨蟹座|狮子座|处女座|天秤座|天蝎座|射手座|摩羯座|水瓶座|双鱼座",
+ "year": "%d 年",
+ "month": "%d 个月",
+ "week": "%d 周",
+ "day": "%d 天",
+ "hour": "%d 小时",
+ "minute": "%d 分钟",
+ "second": "%d 秒",
+ "now": "刚刚",
+ "ago": "%s前",
+ "from_now": "%s后",
+ "before": "%s前",
+ "after": "%s后"
}
diff --git a/vendor/github.com/dromara/carbon/v2/lang/zh-TW.json b/vendor/github.com/dromara/carbon/v2/lang/zh-TW.json
index 6e9c1f2c..b3d56c60 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/zh-TW.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/zh-TW.json
@@ -1,21 +1,22 @@
{
- "name": "Traditional Chinese",
- "months": "一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月",
- "short_months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
- "weeks": "星期日|星期一|星期二|星期三|星期四|星期五|星期六",
- "short_weeks": "週日|週一|週二|週三|週四|週五|週六",
- "seasons": "春季|夏季|秋季|冬季",
- "constellations": "白羊座|金牛座|雙子座|巨蟹座|獅子座|處女座|天秤座|天蠍座|射手座|摩羯座|水瓶座|雙魚座",
- "year": "%d 年",
- "month": "%d 個月",
- "week": "%d 週",
- "day": "%d 天",
- "hour": "%d 小時",
- "minute": "%d 分鐘",
- "second": "%d 秒",
- "now": "剛剛",
- "ago": "%s前",
- "from_now": "%s後",
- "before": "%s前",
- "after": "%s後"
+ "name": "Traditional Chinese",
+ "author": "https://github.com/gouguoyin",
+ "months": "一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月",
+ "short_months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
+ "weeks": "星期日|星期一|星期二|星期三|星期四|星期五|星期六",
+ "short_weeks": "週日|週一|週二|週三|週四|週五|週六",
+ "seasons": "春季|夏季|秋季|冬季",
+ "constellations": "白羊座|金牛座|雙子座|巨蟹座|獅子座|處女座|天秤座|天蠍座|射手座|摩羯座|水瓶座|雙魚座",
+ "year": "%d 年",
+ "month": "%d 個月",
+ "week": "%d 週",
+ "day": "%d 天",
+ "hour": "%d 小時",
+ "minute": "%d 分鐘",
+ "second": "%d 秒",
+ "now": "剛剛",
+ "ago": "%s前",
+ "from_now": "%s後",
+ "before": "%s前",
+ "after": "%s後"
}
diff --git a/vendor/github.com/dromara/carbon/v2/language.go b/vendor/github.com/dromara/carbon/v2/language.go
index e16e4522..32fa27b0 100644
--- a/vendor/github.com/dromara/carbon/v2/language.go
+++ b/vendor/github.com/dromara/carbon/v2/language.go
@@ -4,6 +4,7 @@ import (
"embed"
"encoding/json"
"fmt"
+ "slices"
"strconv"
"strings"
"sync"
@@ -12,16 +13,13 @@ import (
//go:embed lang
var fs embed.FS
-var (
- // invalid locale error
- // 无效的区域错误
- invalidLocaleError = func(locale string) error {
- return fmt.Errorf("invalid locale file %q, please make sure the json file exists and is valid", locale)
- }
-)
+var validResourcesKey = []string{
+ "months", "short_months", "weeks", "short_weeks", "seasons", "constellations",
+ "year", "month", "week", "day", "hour", "minute", "second",
+ "now", "ago", "from_now", "before", "after",
+}
// Language defines a Language struct.
-// 定义 Language 结构体
type Language struct {
dir string
locale string
@@ -31,68 +29,106 @@ type Language struct {
}
// NewLanguage returns a new Language instance.
-// 初始化 Language 结构体
func NewLanguage() *Language {
return &Language{
- dir: "lang/",
- locale: defaultLocale,
+ dir: "lang",
+ locale: DefaultLocale,
resources: make(map[string]string),
rw: new(sync.RWMutex),
}
}
-// SetLanguage sets language.
-// 设置语言对象
-func SetLanguage(lang *Language) Carbon {
- c := NewCarbon()
- lang.SetLocale(lang.locale)
- c.lang, c.Error = lang, lang.Error
- return c
+// Copy returns a new copy of the current Language instance
+func (lang *Language) Copy() *Language {
+ if lang == nil {
+ return nil
+ }
+ newLang := &Language{
+ dir: lang.dir,
+ locale: lang.locale,
+ Error: lang.Error,
+ rw: new(sync.RWMutex),
+ }
+ if lang.resources == nil {
+ return newLang
+ }
+ newLang.resources = make(map[string]string)
+ for i := range lang.resources {
+ newLang.resources[i] = lang.resources[i]
+ }
+ return newLang
}
// SetLocale sets language locale.
-// 设置区域
func (lang *Language) SetLocale(locale string) *Language {
+ if lang == nil || lang.Error != nil {
+ return lang
+ }
+ if locale == "" {
+ lang.Error = ErrEmptyLocale()
+ return lang
+ }
+
lang.rw.Lock()
defer lang.rw.Unlock()
- if len(lang.resources) != 0 {
- return lang
- }
lang.locale = locale
- fileName := lang.dir + locale + ".json"
- bytes, err := fs.ReadFile(fileName)
- if err != nil {
- lang.Error = invalidLocaleError(fileName)
+ fileName := fmt.Sprintf("%s/%s.json", lang.dir, locale)
+ var (
+ bs []byte
+ err error
+ )
+ if bs, err = fs.ReadFile(fileName); err != nil {
+ lang.Error = fmt.Errorf("%w: %w", ErrNotExistLocale(fileName), err)
return lang
}
- _ = json.Unmarshal(bytes, &lang.resources)
+ _ = json.Unmarshal(bs, &lang.resources)
return lang
}
// SetResources sets language resources.
-// 设置资源
func (lang *Language) SetResources(resources map[string]string) *Language {
+ if lang == nil || lang.Error != nil {
+ return lang
+ }
+ if len(resources) == 0 {
+ lang.Error = ErrEmptyResources()
+ return lang
+ }
+
lang.rw.Lock()
defer lang.rw.Unlock()
if len(lang.resources) == 0 {
lang.resources = resources
- return lang
}
- for k, v := range resources {
- if _, ok := lang.resources[k]; ok {
- lang.resources[k] = v
+
+ for i := range resources {
+ if !slices.Contains(validResourcesKey, i) {
+ lang.Error = ErrInvalidResourcesError(resources)
+ return lang
+ }
+ if _, ok := lang.resources[i]; ok {
+ lang.resources[i] = resources[i]
}
}
+
return lang
}
// returns a translated string.
-// 翻译转换
func (lang *Language) translate(unit string, value int64) string {
+ if lang == nil || lang.resources == nil {
+ return ""
+ }
+
+ lang.rw.Lock()
+ defer lang.rw.Unlock()
+
if len(lang.resources) == 0 {
- lang.SetLocale(defaultLocale)
+ lang.rw.Unlock()
+ lang.SetLocale(DefaultLocale)
+ lang.rw.Lock()
}
slice := strings.Split(lang.resources[unit], "|")
number := getAbsValue(value)
diff --git a/vendor/github.com/dromara/carbon/v2/outputer.go b/vendor/github.com/dromara/carbon/v2/outputer.go
index ebad07ad..a99dd97a 100644
--- a/vendor/github.com/dromara/carbon/v2/outputer.go
+++ b/vendor/github.com/dromara/carbon/v2/outputer.go
@@ -7,15 +7,8 @@ import (
"strings"
)
-// String implements the interface Stringer for Carbon struct.
-// 实现 Stringer 接口
-func (c Carbon) String() string {
- return c.Layout(c.layout, c.Location())
-}
-
-// GoString implements fmt.GoStringer and formats c to be printed in Go source code.
-// 实现 fmt.GoStringer 接口,并格式化 c 以在 Go 源代码中打印
-func (c Carbon) GoString() string {
+// GoString implements "fmt.GoStringer" interface for Carbon struct.
+func (c *Carbon) GoString() string {
if c.IsInvalid() {
return ""
}
@@ -23,31 +16,28 @@ func (c Carbon) GoString() string {
}
// ToString outputs a string in "2006-01-02 15:04:05.999999999 -0700 MST" layout.
-// 输出 "2006-01-02 15:04:05.999999999 -0700 MST" 格式字符串
-func (c Carbon) ToString(timezone ...string) string {
+func (c *Carbon) ToString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().String()
}
// ToMonthString outputs a string in month layout like "January", i18n is supported.
-// 输出完整月份字符串,支持i18n
-func (c Carbon) ToMonthString(timezone ...string) string {
+func (c *Carbon) ToMonthString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
- if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
- }
+
c.lang.rw.RLock()
defer c.lang.rw.RUnlock()
+
if resources, ok := c.lang.resources["months"]; ok {
slice := strings.Split(resources, "|")
if len(slice) == MonthsPerYear {
@@ -58,19 +48,17 @@ func (c Carbon) ToMonthString(timezone ...string) string {
}
// ToShortMonthString outputs a string in short month layout like "Jan", i18n is supported.
-// 输出缩写月份字符串,支持i18n
-func (c Carbon) ToShortMonthString(timezone ...string) string {
+func (c *Carbon) ToShortMonthString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
- if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
- }
+
c.lang.rw.RLock()
defer c.lang.rw.RUnlock()
+
if resources, ok := c.lang.resources["short_months"]; ok {
slice := strings.Split(resources, "|")
if len(slice) == MonthsPerYear {
@@ -81,19 +69,17 @@ func (c Carbon) ToShortMonthString(timezone ...string) string {
}
// ToWeekString outputs a string in week layout like "Sunday", i18n is supported.
-// 输出完整星期字符串,支持i18n
-func (c Carbon) ToWeekString(timezone ...string) string {
+func (c *Carbon) ToWeekString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
- if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
- }
+
c.lang.rw.RLock()
defer c.lang.rw.RUnlock()
+
if resources, ok := c.lang.resources["weeks"]; ok {
slice := strings.Split(resources, "|")
if len(slice) == DaysPerWeek {
@@ -104,19 +90,17 @@ func (c Carbon) ToWeekString(timezone ...string) string {
}
// ToShortWeekString outputs a string in short week layout like "Sun", i18n is supported.
-// 输出缩写星期字符串,支持i18n
-func (c Carbon) ToShortWeekString(timezone ...string) string {
+func (c *Carbon) ToShortWeekString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
- if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
- }
+
c.lang.rw.RLock()
defer c.lang.rw.RUnlock()
+
if resources, ok := c.lang.resources["short_weeks"]; ok {
slice := strings.Split(resources, "|")
if len(slice) == DaysPerWeek {
@@ -127,706 +111,657 @@ func (c Carbon) ToShortWeekString(timezone ...string) string {
}
// ToDayDateTimeString outputs a string in "Mon, Jan 2, 2006 3:04 PM" layout.
-// 输出 "Mon, Jan 2, 2006 3:04 PM" 格式字符串
-func (c Carbon) ToDayDateTimeString(timezone ...string) string {
+func (c *Carbon) ToDayDateTimeString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(DayDateTimeLayout)
}
// ToDateTimeString outputs a string in "2006-01-02 15:04:05" layout.
-// 输出 "2006-01-02 15:04:05" 格式字符串
-func (c Carbon) ToDateTimeString(timezone ...string) string {
+func (c *Carbon) ToDateTimeString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(DateTimeLayout)
}
// ToDateTimeMilliString outputs a string in "2006-01-02 15:04:05.999" layout.
-// 输出 "2006-01-02 15:04:05.999" 格式字符串
-func (c Carbon) ToDateTimeMilliString(timezone ...string) string {
+func (c *Carbon) ToDateTimeMilliString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(DateTimeMilliLayout)
}
// ToDateTimeMicroString outputs a string in "2006-01-02 15:04:05.999999" layout.
-// 输出 "2006-01-02 15:04:05.999999" 格式字符串
-func (c Carbon) ToDateTimeMicroString(timezone ...string) string {
+func (c *Carbon) ToDateTimeMicroString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(DateTimeMicroLayout)
}
// ToDateTimeNanoString outputs a string in "2006-01-02 15:04:05.999999999" layout.
-// 输出 "2006-01-02 15:04:05.999999999" 格式字符串
-func (c Carbon) ToDateTimeNanoString(timezone ...string) string {
+func (c *Carbon) ToDateTimeNanoString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(DateTimeNanoLayout)
}
// ToShortDateTimeString outputs a string in "20060102150405" layout.
-// 输出 "20060102150405" 格式字符串
-func (c Carbon) ToShortDateTimeString(timezone ...string) string {
+func (c *Carbon) ToShortDateTimeString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortDateTimeLayout)
}
// ToShortDateTimeMilliString outputs a string in "20060102150405.999" layout.
// 输出 "20060102150405.999" 格式字符串
-func (c Carbon) ToShortDateTimeMilliString(timezone ...string) string {
+func (c *Carbon) ToShortDateTimeMilliString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortDateTimeMilliLayout)
}
// ToShortDateTimeMicroString outputs a string in "20060102150405.999999" layout.
-// 输出 "20060102150405.999999" 格式字符串
-func (c Carbon) ToShortDateTimeMicroString(timezone ...string) string {
+func (c *Carbon) ToShortDateTimeMicroString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortDateTimeMicroLayout)
}
// ToShortDateTimeNanoString outputs a string in "20060102150405.999999999" layout.
-// 输出 "20060102150405.999999999" 格式字符串
-func (c Carbon) ToShortDateTimeNanoString(timezone ...string) string {
+func (c *Carbon) ToShortDateTimeNanoString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortDateTimeNanoLayout)
}
// ToDateString outputs a string in "2006-01-02" layout.
-// 输出 "2006-01-02" 格式字符串
-func (c Carbon) ToDateString(timezone ...string) string {
+func (c *Carbon) ToDateString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(DateLayout)
}
// ToDateMilliString outputs a string in "2006-01-02.999" layout.
-// 输出 "2006-01-02.999" 格式字符串
-func (c Carbon) ToDateMilliString(timezone ...string) string {
+func (c *Carbon) ToDateMilliString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(DateMilliLayout)
}
// ToDateMicroString outputs a string in "2006-01-02.999999" layout.
-// 输出 "2006-01-02.999999" 格式字符串
-func (c Carbon) ToDateMicroString(timezone ...string) string {
+func (c *Carbon) ToDateMicroString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(DateMicroLayout)
}
// ToDateNanoString outputs a string in "2006-01-02.999999999" layout.
-// 输出 "2006-01-02.999999999" 格式字符串
-func (c Carbon) ToDateNanoString(timezone ...string) string {
+func (c *Carbon) ToDateNanoString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(DateNanoLayout)
}
// ToShortDateString outputs a string in "20060102" layout.
-// 输出 "20060102" 格式字符串
-func (c Carbon) ToShortDateString(timezone ...string) string {
+func (c *Carbon) ToShortDateString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortDateLayout)
}
// ToShortDateMilliString outputs a string in "20060102.999" layout.
-// 输出 "20060102.999" 格式字符串
-func (c Carbon) ToShortDateMilliString(timezone ...string) string {
+func (c *Carbon) ToShortDateMilliString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortDateMilliLayout)
}
// ToShortDateMicroString outputs a string in "20060102.999999" layout.
-// 输出 "20060102.999999" 格式字符串
-func (c Carbon) ToShortDateMicroString(timezone ...string) string {
+func (c *Carbon) ToShortDateMicroString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortDateMicroLayout)
}
// ToShortDateNanoString outputs a string in "20060102.999999999" layout.
-// 输出 "20060102.999999999" 格式字符串
-func (c Carbon) ToShortDateNanoString(timezone ...string) string {
+func (c *Carbon) ToShortDateNanoString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortDateNanoLayout)
}
// ToTimeString outputs a string in "15:04:05" layout.
-// 输出 "15:04:05" 格式字符串
-func (c Carbon) ToTimeString(timezone ...string) string {
+func (c *Carbon) ToTimeString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(TimeLayout)
}
// ToTimeMilliString outputs a string in "15:04:05.999" layout.
-// 输出 "15:04:05.999" 格式字符串
-func (c Carbon) ToTimeMilliString(timezone ...string) string {
+func (c *Carbon) ToTimeMilliString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(TimeMilliLayout)
}
// ToTimeMicroString outputs a string in "15:04:05.999999" layout.
-// 输出 "15:04:05.999999" 格式字符串
-func (c Carbon) ToTimeMicroString(timezone ...string) string {
+func (c *Carbon) ToTimeMicroString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(TimeMicroLayout)
}
// ToTimeNanoString outputs a string in "15:04:05.999999999" layout.
-// 输出 "15:04:05.999999999" 格式字符串
-func (c Carbon) ToTimeNanoString(timezone ...string) string {
+func (c *Carbon) ToTimeNanoString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(TimeNanoLayout)
}
// ToShortTimeString outputs a string in "150405" layout.
-// 输出 "150405" 格式字符串
-func (c Carbon) ToShortTimeString(timezone ...string) string {
+func (c *Carbon) ToShortTimeString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortTimeLayout)
}
// ToShortTimeMilliString outputs a string in "150405.999" layout.
-// 输出 "150405.999" 格式字符串
-func (c Carbon) ToShortTimeMilliString(timezone ...string) string {
+func (c *Carbon) ToShortTimeMilliString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortTimeMilliLayout)
}
// ToShortTimeMicroString outputs a string in "150405.999999" layout.
-// 输出 "150405.999999" 格式字符串
-func (c Carbon) ToShortTimeMicroString(timezone ...string) string {
+func (c *Carbon) ToShortTimeMicroString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortTimeMicroLayout)
}
// ToShortTimeNanoString outputs a string in "150405.999999999" layout.
-// 输出 "150405.999999999" 格式字符串
-func (c Carbon) ToShortTimeNanoString(timezone ...string) string {
+func (c *Carbon) ToShortTimeNanoString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ShortTimeNanoLayout)
}
// ToAtomString outputs a string in "2006-01-02T15:04:05Z07:00" layout.
-// 输出 "2006-01-02T15:04:05Z07:00" 格式字符串
-func (c Carbon) ToAtomString(timezone ...string) string {
+func (c *Carbon) ToAtomString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(AtomLayout)
}
// ToAnsicString outputs a string in "Mon Jan _2 15:04:05 2006" layout.
-// 输出 "Mon Jan _2 15:04:05 2006" 格式字符串
-func (c Carbon) ToAnsicString(timezone ...string) string {
+func (c *Carbon) ToAnsicString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ANSICLayout)
}
// ToCookieString outputs a string in "Monday, 02-Jan-2006 15:04:05 MST" layout.
-// 输出 "Monday, 02-Jan-2006 15:04:05 MST" 格式字符串
-func (c Carbon) ToCookieString(timezone ...string) string {
+func (c *Carbon) ToCookieString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(CookieLayout)
}
// ToRssString outputs a string in "Mon, 02 Jan 2006 15:04:05 -0700" format.
-// 输出 "Mon, 02 Jan 2006 15:04:05 -0700" 格式字符串
-func (c Carbon) ToRssString(timezone ...string) string {
+func (c *Carbon) ToRssString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RssLayout)
}
// ToW3cString outputs a string in "2006-01-02T15:04:05Z07:00" layout.
-// 输出 "2006-01-02T15:04:05Z07:00" 格式字符串
-func (c Carbon) ToW3cString(timezone ...string) string {
+func (c *Carbon) ToW3cString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(W3cLayout)
}
// ToUnixDateString outputs a string in "Mon Jan _2 15:04:05 MST 2006" layout.
-// 输出 "Mon Jan _2 15:04:05 MST 2006" 格式字符串
-func (c Carbon) ToUnixDateString(timezone ...string) string {
+func (c *Carbon) ToUnixDateString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(UnixDateLayout)
}
// ToRubyDateString outputs a string in "Mon Jan 02 15:04:05 -0700 2006" layout.
-// 输出 "Mon Jan 02 15:04:05 -0700 2006" 格式字符串
-func (c Carbon) ToRubyDateString(timezone ...string) string {
+func (c *Carbon) ToRubyDateString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RubyDateLayout)
}
// ToKitchenString outputs a string in "3:04PM" layout.
-// 输出 "3:04PM" 格式字符串
-func (c Carbon) ToKitchenString(timezone ...string) string {
+func (c *Carbon) ToKitchenString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(KitchenLayout)
}
// ToIso8601String outputs a string in "2006-01-02T15:04:05-07:00" layout.
-// 输出 "2006-01-02T15:04:05-07:00" 格式字符串
-func (c Carbon) ToIso8601String(timezone ...string) string {
+func (c *Carbon) ToIso8601String(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ISO8601Layout)
}
// ToIso8601MilliString outputs a string in "2006-01-02T15:04:05.999-07:00" layout.
-// 输出 "2006-01-02T15:04:05.999-07:00" 格式字符串
-func (c Carbon) ToIso8601MilliString(timezone ...string) string {
+func (c *Carbon) ToIso8601MilliString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ISO8601MilliLayout)
}
// ToIso8601MicroString outputs a string in "2006-01-02T15:04:05.999999-07:00" layout.
-// 输出 "2006-01-02T15:04:05.999999-07:00" 格式字符串
-func (c Carbon) ToIso8601MicroString(timezone ...string) string {
+func (c *Carbon) ToIso8601MicroString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ISO8601MicroLayout)
}
// ToIso8601NanoString outputs a string in "2006-01-02T15:04:05.999999999-07:00" layout.
-// 输出 "2006-01-02T15:04:05.999999999-07:00" 格式字符串
-func (c Carbon) ToIso8601NanoString(timezone ...string) string {
+func (c *Carbon) ToIso8601NanoString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ISO8601NanoLayout)
}
// ToIso8601ZuluString outputs a string in "2006-01-02T15:04:05Z" layout.
-// 输出 "2006-01-02T15:04:05Z" 格式字符串
-func (c Carbon) ToIso8601ZuluString(timezone ...string) string {
+func (c *Carbon) ToIso8601ZuluString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ISO8601ZuluLayout)
}
// ToIso8601ZuluMilliString outputs a string in "2006-01-02T15:04:05.999Z" layout.
-// 输出 "2006-01-02T15:04:05.999Z" 格式字符串
-func (c Carbon) ToIso8601ZuluMilliString(timezone ...string) string {
+func (c *Carbon) ToIso8601ZuluMilliString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ISO8601ZuluMilliLayout)
}
// ToIso8601ZuluMicroString outputs a string in "2006-01-02T15:04:05.999999Z" layout.
-// 输出 "2006-01-02T15:04:05.999999Z" 格式字符串
-func (c Carbon) ToIso8601ZuluMicroString(timezone ...string) string {
+func (c *Carbon) ToIso8601ZuluMicroString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ISO8601ZuluMicroLayout)
}
// ToIso8601ZuluNanoString outputs a string in "2006-01-02T15:04:05.999999999Z" layout.
-// 输出 "2006-01-02T15:04:05.999999999Z" 格式字符串
-func (c Carbon) ToIso8601ZuluNanoString(timezone ...string) string {
+func (c *Carbon) ToIso8601ZuluNanoString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(ISO8601ZuluNanoLayout)
}
// ToRfc822String outputs a string in "02 Jan 06 15:04 MST" layout.
-// 输出 "02 Jan 06 15:04 MST" 格式字符串
-func (c Carbon) ToRfc822String(timezone ...string) string {
+func (c *Carbon) ToRfc822String(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC822Layout)
}
// ToRfc822zString outputs a string in "02 Jan 06 15:04 -0700" layout.
-// 输出 "02 Jan 06 15:04 -0700" 格式字符串
-func (c Carbon) ToRfc822zString(timezone ...string) string {
+func (c *Carbon) ToRfc822zString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC822ZLayout)
}
// ToRfc850String outputs a string in "Monday, 02-Jan-06 15:04:05 MST" layout.
-// 输出 "Monday, 02-Jan-06 15:04:05 MST" 格式字符串
-func (c Carbon) ToRfc850String(timezone ...string) string {
+func (c *Carbon) ToRfc850String(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC850Layout)
}
// ToRfc1036String outputs a string in "Mon, 02 Jan 06 15:04:05 -0700" layout.
-// 输出 "Mon, 02 Jan 06 15:04:05 -0700" 格式字符串
-func (c Carbon) ToRfc1036String(timezone ...string) string {
+func (c *Carbon) ToRfc1036String(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC1036Layout)
}
// ToRfc1123String outputs a string in "Mon, 02 Jan 2006 15:04:05 MST" layout.
-// 输出 "Mon, 02 Jan 2006 15:04:05 MST" 格式字符串
-func (c Carbon) ToRfc1123String(timezone ...string) string {
+func (c *Carbon) ToRfc1123String(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC1123Layout)
}
// ToRfc1123zString outputs a string in "Mon, 02 Jan 2006 15:04:05 -0700" layout.
-// 输出 "Mon, 02 Jan 2006 15:04:05 -0700" 格式字符串
-func (c Carbon) ToRfc1123zString(timezone ...string) string {
+func (c *Carbon) ToRfc1123zString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC1123ZLayout)
}
// ToRfc2822String outputs a string in "Mon, 02 Jan 2006 15:04:05 -0700" layout.
-// 输出 "Mon, 02 Jan 2006 15:04:05 -0700" 格式字符串
-func (c Carbon) ToRfc2822String(timezone ...string) string {
+func (c *Carbon) ToRfc2822String(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC2822Layout)
}
// ToRfc3339String outputs a string in "2006-01-02T15:04:05Z07:00" layout.
-// 输出 "2006-01-02T15:04:05Z07:00" 格式字符串
-func (c Carbon) ToRfc3339String(timezone ...string) string {
+func (c *Carbon) ToRfc3339String(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC3339Layout)
}
// ToRfc3339MilliString outputs a string in "2006-01-02T15:04:05.999Z07:00" layout.
-// 输出 "2006-01-02T15:04:05.999Z07:00" 格式字符串
-func (c Carbon) ToRfc3339MilliString(timezone ...string) string {
+func (c *Carbon) ToRfc3339MilliString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC3339MilliLayout)
}
// ToRfc3339MicroString outputs a string in "2006-01-02T15:04:05.999999Z07:00" layout.
-// 输出 "2006-01-02T15:04:05.999999Z07:00" 格式字符串
-func (c Carbon) ToRfc3339MicroString(timezone ...string) string {
+func (c *Carbon) ToRfc3339MicroString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC3339MicroLayout)
}
// ToRfc3339NanoString outputs a string in "2006-01-02T15:04:05.999999999Z07:00" layout.
-// 输出 "2006-01-02T15:04:05.999999999Z07:00" 格式字符串
-func (c Carbon) ToRfc3339NanoString(timezone ...string) string {
+func (c *Carbon) ToRfc3339NanoString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC3339NanoLayout)
}
// ToRfc7231String outputs a string in "Mon, 02 Jan 2006 15:04:05 GMT" layout.
-// 输出 "Mon, 02 Jan 2006 15:04:05 GMT" 格式字符串
-func (c Carbon) ToRfc7231String(timezone ...string) string {
+func (c *Carbon) ToRfc7231String(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(RFC7231Layout)
}
// ToFormattedDateString outputs a string in "Jan 2, 2006" layout.
-// 输出 "Jan 2, 2006" 格式字符串
-func (c Carbon) ToFormattedDateString(timezone ...string) string {
+func (c *Carbon) ToFormattedDateString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(FormattedDateLayout)
}
// ToFormattedDayDateString outputs a string in "Mon, Jan 2, 2006" layout.
-// 输出 "Jan 2, 2006" 格式字符串
-func (c Carbon) ToFormattedDayDateString(timezone ...string) string {
+func (c *Carbon) ToFormattedDayDateString(timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
return c.StdTime().Format(FormattedDayDateLayout)
}
// Layout outputs a string by layout.
-// 输出指定布局模板的时间字符串
-func (c Carbon) Layout(layout string, timezone ...string) string {
+func (c *Carbon) Layout(layout string, timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+ switch layout {
+ case TimestampLayout:
+ return strconv.FormatInt(c.Timestamp(), 10)
+ case TimestampMilliLayout:
+ return strconv.FormatInt(c.TimestampMilli(), 10)
+ case TimestampMicroLayout:
+ return strconv.FormatInt(c.TimestampMicro(), 10)
+ case TimestampNanoLayout:
+ return strconv.FormatInt(c.TimestampNano(), 10)
}
return c.StdTime().Format(layout)
}
// Format outputs a string by format.
-// 输出指定格式模板的时间字符串
-func (c Carbon) Format(format string, timezone ...string) string {
+func (c *Carbon) Format(format string, timezone ...string) string {
+ if len(timezone) > 0 {
+ c.loc, c.Error = parseTimezone(timezone[0])
+ }
if c.IsInvalid() {
return ""
}
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
- buffer := bytes.NewBuffer(nil)
+ buffer := &bytes.Buffer{}
for i := 0; i < len(format); i++ {
- if layout, ok := formats[format[i]]; ok {
- // support for i18n specific symbols
+ if layout, ok := formatMap[format[i]]; ok {
switch format[i] {
- case 'l': // week, such as Monday
- buffer.WriteString(c.ToWeekString())
case 'D': // short week, such as Mon
buffer.WriteString(c.ToShortWeekString())
case 'F': // month, such as January
buffer.WriteString(c.ToMonthString())
case 'M': // short month, such as Jan
buffer.WriteString(c.ToShortMonthString())
- case 'U': // timestamp with second, such as 1596604455
+ case 'S': // timestamp with second, such as 1596604455
buffer.WriteString(strconv.FormatInt(c.Timestamp(), 10))
- case 'V': // timestamp with millisecond, such as 1596604455000
+ case 'U': // timestamp with millisecond, such as 1596604455000
buffer.WriteString(strconv.FormatInt(c.TimestampMilli(), 10))
- case 'X': // timestamp with microsecond, such as 1596604455000000
+ case 'V': // timestamp with microsecond, such as 1596604455000000
buffer.WriteString(strconv.FormatInt(c.TimestampMicro(), 10))
- case 'Z': // timestamp with nanoseconds, such as 1596604455000000000
+ case 'X': // timestamp with nanoseconds, such as 1596604455000000000
buffer.WriteString(strconv.FormatInt(c.TimestampNano(), 10))
default: // common symbols
buffer.WriteString(c.StdTime().Format(layout))
@@ -837,13 +772,13 @@ func (c Carbon) Format(format string, timezone ...string) string {
buffer.WriteByte(format[i+1])
i++
continue
- case 'W': // week number of the year in ISO-8601 format, ranging from 01-52
- week := fmt.Sprintf("%02d", c.WeekOfYear())
+ case 'W': // week number of the year, ranging from 1-52
+ week := fmt.Sprintf("%d", c.WeekOfYear())
buffer.WriteString(week)
- case 'N': // day of the week as a number in ISO-8601 format, ranging from 01-7
- week := fmt.Sprintf("%02d", c.DayOfWeek())
+ case 'N': // day of the week as a number, ranging from 1-7
+ week := fmt.Sprintf("%d", c.DayOfWeek())
buffer.WriteString(week)
- case 'S': // abbreviated suffix for the day of the month, such as st, nd, rd, th
+ case 'K': // abbreviated suffix for the day of the month, such as st, nd, rd, th
suffix := "th"
switch c.Day() {
case 1, 21, 31:
@@ -862,26 +797,17 @@ func (c Carbon) Format(format string, timezone ...string) string {
}
case 'G': // 24-hour format, no padding, ranging from 0-23
buffer.WriteString(strconv.Itoa(c.Hour()))
- case 'v': // current millisecond, such as 999
- s := c.Layout(".999")
- buffer.WriteString(strings.Trim(s, "."))
- case 'u': // current microsecond, such as 999999
- s := c.Layout(".999999")
- buffer.WriteString(strings.Trim(s, "."))
- case 'x': // current nanosecond, such as 999999999
- s := c.Layout(".999999999")
- buffer.WriteString(strings.Trim(s, "."))
case 'w': // day of the week represented by the number, ranging from 0-6
buffer.WriteString(strconv.Itoa(c.DayOfWeek() - 1))
case 't': // number of days in the month, ranging from 28-31
buffer.WriteString(strconv.Itoa(c.DaysInMonth()))
- case 'z': // day of the year, ranging from 0-365
- buffer.WriteString(strconv.Itoa(c.DayOfYear() - 1))
- case 'e': // current location, such as UTC,GMT,Atlantic/Azores
- buffer.WriteString(c.Location())
- case 'Q': // current quarter, ranging from 1-4
+ case 'z': // current zone location, such as Asia/Tokyo
+ buffer.WriteString(c.Timezone())
+ case 'o': // current zone offset, such as 28800
+ buffer.WriteString(strconv.Itoa(c.ZoneOffset()))
+ case 'q': // current quarter, ranging from 1-4
buffer.WriteString(strconv.Itoa(c.Quarter()))
- case 'C': // current century, ranging from 0-99
+ case 'c': // current century, ranging from 0-99
buffer.WriteString(strconv.Itoa(c.Century()))
default:
buffer.WriteByte(format[i])
diff --git a/vendor/github.com/dromara/carbon/v2/parser.go b/vendor/github.com/dromara/carbon/v2/parser.go
index 86517f59..4e09860e 100644
--- a/vendor/github.com/dromara/carbon/v2/parser.go
+++ b/vendor/github.com/dromara/carbon/v2/parser.go
@@ -1,104 +1,206 @@
package carbon
import (
- "strconv"
+ "fmt"
"time"
)
-// Parse parses a standard time string as a Carbon instance.
-// 将标准格式时间字符串解析成 Carbon 实例
-func (c Carbon) Parse(value string, timezone ...string) Carbon {
- if len(value) == 0 {
- c.Error = invalidValueError(value)
- return c
+// Parse parses a time string as a Carbon instance by default layouts.
+//
+// Note: it doesn't support parsing timestamp string.
+func Parse(value string, timezone ...string) *Carbon {
+ if value == "" {
+ return &Carbon{isEmpty: true}
}
+ var (
+ tz string
+ tt StdTime
+ loc *Location
+ err error
+ )
if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
+ }
+ if loc, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
}
switch value {
case "now":
- return c.Now(timezone...)
+ return Now().SetLocation(loc)
case "yesterday":
- return c.Yesterday(timezone...)
+ return Yesterday().SetLocation(loc)
case "tomorrow":
- return c.Tomorrow(timezone...)
+ return Tomorrow().SetLocation(loc)
}
- for _, layout := range layouts {
- t, err := time.ParseInLocation(layout, value, c.loc)
- if err == nil {
- c.time = t
+ c := NewCarbon().SetLocation(loc)
+ for i := range defaultLayouts {
+ if tt, err = time.ParseInLocation(defaultLayouts[i], value, loc); err == nil {
+ c.time = tt
+ c.currentLayout = defaultLayouts[i]
return c
}
}
- c.Error = invalidValueError(value)
+ c.Error = ErrFailedParse(value)
return c
}
-// Parse parses a standard time string as a Carbon instance.
-// 将标准时间字符串解析成 Carbon 实例
-func Parse(value string, timezone ...string) Carbon {
- return NewCarbon().Parse(value, timezone...)
-}
-
-// ParseByFormat parses a time string as a Carbon instance by format.
-// 通过格式模板将时间字符串解析成 Carbon 实例
-func (c Carbon) ParseByFormat(value, format string, timezone ...string) Carbon {
- carbon := c.ParseByLayout(value, format2layout(format), timezone...)
- if carbon.Error != nil {
- carbon.Error = invalidFormatError(value, format)
+// ParseByLayout parses a time string as a Carbon instance by a confirmed layout.
+//
+// Note: it will not support parsing timestamp string in the future,
+// use "CreateFromTimestamp" or "CreateFromTimestampXXX" instead
+func ParseByLayout(value, layout string, timezone ...string) *Carbon {
+ if value == "" {
+ return &Carbon{isEmpty: true}
}
- return carbon
-}
-
-// ParseByFormat parses a time string as a Carbon instance by format.
-// 通过格式模板将时间字符串解析成 Carbon 实例
-func ParseByFormat(value, format string, timezone ...string) Carbon {
- return NewCarbon().ParseByFormat(value, format, timezone...)
-}
-
-// ParseByLayout parses a time string as a Carbon instance by layout.
-// 通过布局模板将时间字符串解析成 Carbon 实例
-func (c Carbon) ParseByLayout(value, layout string, timezone ...string) Carbon {
- if len(value) == 0 {
- c.Error = invalidValueError(value)
- return c
+ if layout == "" {
+ return &Carbon{Error: ErrEmptyLayout()}
}
+ var (
+ ts int64
+ tz string
+ tt StdTime
+ loc *Location
+ err error
+ )
if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
}
- if c.Error != nil {
- return c
+ if loc, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
}
- if len(layout) == 0 {
- layout = defaultLayout
+
+ // timestamp layouts
+ switch layout {
+ case TimestampLayout:
+ if ts, err = parseTimestamp(value); err != nil {
+ return &Carbon{Error: err}
+ }
+ return CreateFromTimestamp(ts).SetLocation(loc)
+ case TimestampMilliLayout:
+ if ts, err = parseTimestamp(value); err != nil {
+ return &Carbon{Error: err}
+ }
+ return CreateFromTimestampMilli(ts).SetLocation(loc)
+ case TimestampMicroLayout:
+ if ts, err = parseTimestamp(value); err != nil {
+ return &Carbon{Error: err}
+ }
+ return CreateFromTimestampMicro(ts).SetLocation(loc)
+ case TimestampNanoLayout:
+ if ts, err = parseTimestamp(value); err != nil {
+ return &Carbon{Error: err}
+ }
+ return CreateFromTimestampNano(ts).SetLocation(loc)
}
- if layout == "timestamp" {
- timestamp, _ := strconv.ParseInt(value, 10, 64)
- return c.CreateFromTimestamp(timestamp)
- }
- if layout == "timestampMilli" {
- timestamp, _ := strconv.ParseInt(value, 10, 64)
- return c.CreateFromTimestampMilli(timestamp)
- }
- if layout == "timestampMicro" {
- timestamp, _ := strconv.ParseInt(value, 10, 64)
- return c.CreateFromTimestampMicro(timestamp)
- }
- if layout == "timestampNano" {
- timestamp, _ := strconv.ParseInt(value, 10, 64)
- return c.CreateFromTimestampNano(timestamp)
- }
- tt, err := time.ParseInLocation(layout, value, c.loc)
- if err != nil {
- c.Error = invalidLayoutError(value, layout)
- return c
+
+ // other layouts
+ if tt, err = time.ParseInLocation(layout, value, loc); err != nil {
+ return &Carbon{Error: fmt.Errorf("%w: %w", ErrMismatchedLayout(value, layout), err)}
}
+
+ c := NewCarbon()
+ c.loc = loc
c.time = tt
+ c.currentLayout = layout
return c
}
-// ParseByLayout parses a time string as a Carbon instance by layout.
-// 通过布局模板将时间字符串解析成 Carbon 实例
-func ParseByLayout(value, layout string, timezone ...string) Carbon {
- return NewCarbon().ParseByLayout(value, layout, timezone...)
+// ParseByFormat parses a time string as a Carbon instance by a confirmed format.
+//
+// Note: If the letter used conflicts with the format sign, please use the escape character "\" to escape the letter
+func ParseByFormat(value, format string, timezone ...string) *Carbon {
+ if value == "" {
+ return &Carbon{isEmpty: true}
+ }
+ if format == "" {
+ return &Carbon{Error: ErrEmptyFormat()}
+ }
+ c := ParseByLayout(value, format2layout(format), timezone...)
+ if c.HasError() {
+ c.Error = fmt.Errorf("%w: %w", ErrMismatchedFormat(value, format), c.Error)
+ }
+ return c
+}
+
+// ParseByLayouts parses a time string as a Carbon instance by multiple fuzzy layouts.
+//
+// Note: it doesn't support parsing timestamp string.
+func ParseByLayouts(value string, layouts []string, timezone ...string) *Carbon {
+ if value == "" {
+ return &Carbon{isEmpty: true}
+ }
+ if len(layouts) == 0 {
+ return &Carbon{Error: ErrEmptyLayout()}
+ }
+ var (
+ tz string
+ tt StdTime
+ loc *Location
+ err error
+ )
+ if len(timezone) > 0 {
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
+ }
+ if loc, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
+ }
+ c := NewCarbon().SetLocation(loc)
+ for i := range layouts {
+ if tt, err = time.ParseInLocation(layouts[i], value, loc); err == nil {
+ c.time = tt
+ c.currentLayout = layouts[i]
+ return c
+ }
+ }
+ c.Error = ErrFailedParse(value)
+ return c
+}
+
+// ParseByFormats parses a time string as a Carbon instance by multiple fuzzy formats.
+//
+// Note: it doesn't support parsing timestamp string.
+func ParseByFormats(value string, formats []string, timezone ...string) *Carbon {
+ if value == "" {
+ return &Carbon{isEmpty: true}
+ }
+ if len(formats) == 0 {
+ return &Carbon{Error: ErrEmptyFormat()}
+ }
+ var (
+ tz string
+ err error
+ )
+ if len(timezone) > 0 {
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
+ }
+ if _, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
+ }
+ var layouts []string
+ for i := range formats {
+ layouts = append(layouts, format2layout(formats[i]))
+ }
+ return ParseByLayouts(value, layouts, tz)
+}
+
+// ParseWithLayouts parses a time string as a Carbon instance by multiple fuzzy layouts.
+//
+// Deprecated: it will be removed in the future, use "ParseByLayouts" instead.
+func ParseWithLayouts(value string, layouts []string, timezone ...string) *Carbon {
+ return ParseByLayouts(value, layouts, timezone...)
+}
+
+// ParseWithFormats parses a time string as a Carbon instance by multiple fuzzy formats.
+//
+// Deprecated: it will be removed in the future, use "ParseByFormats" instead.
+func ParseWithFormats(value string, formats []string, timezone ...string) *Carbon {
+ return ParseByFormats(value, formats, timezone...)
}
diff --git a/vendor/github.com/dromara/carbon/v2/season.go b/vendor/github.com/dromara/carbon/v2/season.go
index 76402c75..2a8e1611 100644
--- a/vendor/github.com/dromara/carbon/v2/season.go
+++ b/vendor/github.com/dromara/carbon/v2/season.go
@@ -22,14 +22,10 @@ var seasons = []struct {
}
// Season gets season name according to the meteorological division method like "Spring", i18n is supported.
-// 获取当前季节(以气象划分),支持i18n
-func (c Carbon) Season() string {
- if c.Error != nil {
+func (c *Carbon) Season() string {
+ if c.IsInvalid() {
return ""
}
- if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
- }
index := -1
month := c.Month()
for i := 0; i < len(seasons); i++ {
@@ -38,8 +34,10 @@ func (c Carbon) Season() string {
index = season.index
}
}
+
c.lang.rw.RLock()
defer c.lang.rw.RUnlock()
+
if resources, ok := c.lang.resources["seasons"]; ok {
slice := strings.Split(resources, "|")
if len(slice) == QuartersPerYear {
@@ -50,9 +48,8 @@ func (c Carbon) Season() string {
}
// StartOfSeason returns a Carbon instance for start of the season.
-// 本季节开始时间
-func (c Carbon) StartOfSeason() Carbon {
- if c.Error != nil {
+func (c *Carbon) StartOfSeason() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, _ := c.Date()
@@ -63,9 +60,8 @@ func (c Carbon) StartOfSeason() Carbon {
}
// EndOfSeason returns a Carbon instance for end of the season.
-// 本季节结束时间
-func (c Carbon) EndOfSeason() Carbon {
- if c.Error != nil {
+func (c *Carbon) EndOfSeason() *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, _ := c.Date()
@@ -79,9 +75,8 @@ func (c Carbon) EndOfSeason() Carbon {
}
// IsSpring reports whether is spring.
-// 是否是春季
-func (c Carbon) IsSpring() bool {
- if c.Error != nil {
+func (c *Carbon) IsSpring() bool {
+ if c.IsInvalid() {
return false
}
month := c.Month()
@@ -92,9 +87,8 @@ func (c Carbon) IsSpring() bool {
}
// IsSummer reports whether is summer.
-// 是否是夏季
-func (c Carbon) IsSummer() bool {
- if c.Error != nil {
+func (c *Carbon) IsSummer() bool {
+ if c.IsInvalid() {
return false
}
month := c.Month()
@@ -105,9 +99,8 @@ func (c Carbon) IsSummer() bool {
}
// IsAutumn reports whether is autumn.
-// 是否是秋季
-func (c Carbon) IsAutumn() bool {
- if c.Error != nil {
+func (c *Carbon) IsAutumn() bool {
+ if c.IsInvalid() {
return false
}
month := c.Month()
@@ -118,9 +111,8 @@ func (c Carbon) IsAutumn() bool {
}
// IsWinter reports whether is winter.
-// 是否是冬季
-func (c Carbon) IsWinter() bool {
- if c.Error != nil {
+func (c *Carbon) IsWinter() bool {
+ if c.IsInvalid() {
return false
}
month := c.Month()
diff --git a/vendor/github.com/dromara/carbon/v2/setter.go b/vendor/github.com/dromara/carbon/v2/setter.go
index 6ecbf763..3a148eb1 100644
--- a/vendor/github.com/dromara/carbon/v2/setter.go
+++ b/vendor/github.com/dromara/carbon/v2/setter.go
@@ -1,302 +1,393 @@
package carbon
-import (
- "time"
-)
+import "time"
-// SetWeekStartsAt sets start day of the week.
-// 设置一周的开始日期
-func (c Carbon) SetWeekStartsAt(day string) Carbon {
- if c.Error != nil {
- return c
- }
- if weekday, ok := weekdays[day]; ok {
- c.weekStartsAt = weekday
+// SetLayout sets globally default layout.
+func SetLayout(layout string) *Carbon {
+ c := NewCarbon().SetLayout(layout)
+ if !c.HasError() {
+ DefaultLayout = layout
}
return c
}
-// SetWeekStartsAt sets start day of the week.
-// 设置一周的开始日期
-func SetWeekStartsAt(day string) Carbon {
- return NewCarbon().SetWeekStartsAt(day)
+// SetFormat sets globally default format.
+func SetFormat(format string) *Carbon {
+ layout := format2layout(format)
+ c := NewCarbon().SetLayout(layout)
+ if !c.HasError() {
+ DefaultLayout = layout
+ }
+ return c
}
-// SetTimezone sets timezone.
-// 设置时区
-func (c Carbon) SetTimezone(name string) Carbon {
- if c.Error != nil {
+// SetTimezone sets globally default timezone.
+func SetTimezone(name string) *Carbon {
+ c := NewCarbon().SetTimezone(name)
+ if !c.HasError() {
+ DefaultTimezone = name
+ }
+ return c
+}
+
+// SetLocation sets globally default location.
+func SetLocation(loc *Location) *Carbon {
+ c := NewCarbon().SetLocation(loc)
+ if !c.HasError() {
+ DefaultTimezone = loc.String()
+ }
+ return c
+}
+
+// SetLocale sets globally default locale.
+func SetLocale(locale string) *Carbon {
+ c := NewCarbon().SetLocale(locale)
+ if !c.HasError() {
+ DefaultLocale = locale
+ }
+ return c
+}
+
+// SetWeekStartsAt sets globally default start day of the week.
+func SetWeekStartsAt(weekday Weekday) *Carbon {
+ c := NewCarbon().SetWeekStartsAt(weekday)
+ if !c.HasError() {
+ DefaultWeekStartsAt = weekday
+ }
+ return c
+}
+
+// SetWeekendDays sets globally default weekend days of the week.
+func SetWeekendDays(weekDays []Weekday) *Carbon {
+ c := NewCarbon().SetWeekendDays(weekDays)
+ if !c.HasError() {
+ DefaultWeekendDays = weekDays
+ }
+ return c
+}
+
+// SetLayout sets layout.
+func (c *Carbon) SetLayout(layout string) *Carbon {
+ if layout == "" {
+ c.Error = ErrEmptyLayout()
return c
}
- c.loc, c.Error = getLocationByTimezone(name)
+ if c.IsInvalid() {
+ return c
+ }
+ c.currentLayout = layout
+ return c
+}
+
+// SetFormat sets format.
+func (c *Carbon) SetFormat(format string) *Carbon {
+ if format == "" {
+ c.Error = ErrEmptyFormat()
+ return c
+ }
+ if c.IsInvalid() {
+ return c
+ }
+ c.currentLayout = format2layout(format)
return c
}
// SetTimezone sets timezone.
-// 设置时区
-func SetTimezone(name string) Carbon {
- return NewCarbon().SetTimezone(name)
+func (c *Carbon) SetTimezone(name string) *Carbon {
+ if name == "" {
+ c.Error = ErrEmptyTimezone()
+ return c
+ }
+ if c.IsInvalid() {
+ return c
+ }
+ c.loc, c.Error = parseTimezone(name)
+ return c
}
// SetLocation sets location.
-// 设置地区
-func (c Carbon) SetLocation(loc *time.Location) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetLocation(loc *Location) *Carbon {
+ if loc == nil {
+ c.Error = ErrNilLocation()
return c
}
- if loc == nil {
- c.Error = invalidLocationError()
+ if c.IsInvalid() {
+ return c
}
c.loc = loc
return c
}
-// SetLocation sets location.
-// 设置地区
-func SetLocation(loc *time.Location) Carbon {
- return NewCarbon().SetLocation(loc)
-}
-
// SetLocale sets locale.
-// 设置语言区域
-func (c Carbon) SetLocale(locale string) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetLocale(locale string) *Carbon {
+ if locale == "" {
+ c.Error = ErrEmptyLocale()
return c
}
- c.lang.SetLocale(locale)
+ if c.IsInvalid() {
+ return c
+ }
+ c.lang = NewLanguage().SetLocale(locale)
c.Error = c.lang.Error
return c
}
-// SetLocale sets locale.
-// 设置语言区域
-func SetLocale(locale string) Carbon {
- c := NewCarbon()
- c.lang.SetLocale(locale)
- c.Error = c.lang.Error
+// SetWeekStartsAt sets start day of the week.
+func (c *Carbon) SetWeekStartsAt(weekDay Weekday) *Carbon {
+ if c.IsInvalid() {
+ return c
+ }
+ c.weekStartsAt = weekDay
+ return c
+}
+
+// SetWeekendDays sets weekend days of the week.
+func (c *Carbon) SetWeekendDays(weekDays []Weekday) *Carbon {
+ if c.IsInvalid() {
+ return c
+ }
+ c.weekendDays = weekDays
+ return c
+}
+
+// SetLanguage sets language.
+func (c *Carbon) SetLanguage(lang *Language) *Carbon {
+ if c.IsInvalid() || c.isEmpty {
+ return c
+ }
+ if lang == nil {
+ c.Error = ErrNilLanguage()
+ return c
+ }
+ if lang.Error != nil {
+ c.Error = ErrInvalidLanguage(lang)
+ return c
+ }
+ c.lang.dir = lang.dir
+ c.lang.locale = lang.locale
+ c.lang.resources = lang.resources
+ c.lang.Error = lang.Error
return c
}
// SetDateTime sets year, month, day, hour, minute and second.
-// 设置年、月、日、时、分、秒
-func (c Carbon) SetDateTime(year, month, day, hour, minute, second int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetDateTime(year, month, day, hour, minute, second int) *Carbon {
+ if c.IsInvalid() {
return c
}
- return c.create(year, month, day, hour, minute, second, c.Nanosecond())
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, c.Nanosecond(), c.loc)
+ return c
}
// SetDateTimeMilli sets year, month, day, hour, minute, second and millisecond.
-// 设置年、月、日、时、分、秒、毫秒
-func (c Carbon) SetDateTimeMilli(year, month, day, hour, minute, second, millisecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetDateTimeMilli(year, month, day, hour, minute, second, millisecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
- return c.create(year, month, day, hour, minute, second, millisecond*1e6)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, millisecond*1e6, c.loc)
+ return c
}
// SetDateTimeMicro sets year, month, day, hour, minute, second and microsecond.
-// 设置年、月、日、时、分、秒、微秒
-func (c Carbon) SetDateTimeMicro(year, month, day, hour, minute, second, microsecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetDateTimeMicro(year, month, day, hour, minute, second, microsecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
- return c.create(year, month, day, hour, minute, second, microsecond*1e3)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, microsecond*1e3, c.loc)
+ return c
}
// SetDateTimeNano sets year, month, day, hour, minute, second and nanosecond.
-// 设置年、月、日、时、分、秒、纳秒
-func (c Carbon) SetDateTimeNano(year, month, day, hour, minute, second, nanosecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetDateTimeNano(year, month, day, hour, minute, second, nanosecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
- return c.create(year, month, day, hour, minute, second, nanosecond)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, nanosecond, c.loc)
+ return c
}
// SetDate sets year, month and day.
-// 设置年、月、日
-func (c Carbon) SetDate(year, month, day int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetDate(year, month, day int) *Carbon {
+ if c.IsInvalid() {
return c
}
hour, minute, second := c.Time()
- return c.create(year, month, day, hour, minute, second, c.Nanosecond())
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, c.Nanosecond(), c.loc)
+ return c
}
// SetDateMilli sets year, month, day and millisecond.
-// 设置年、月、日、毫秒
-func (c Carbon) SetDateMilli(year, month, day, millisecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetDateMilli(year, month, day, millisecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
hour, minute, second := c.Time()
- return c.create(year, month, day, hour, minute, second, millisecond*1e6)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, millisecond*1e6, c.loc)
+ return c
}
// SetDateMicro sets year, month, day and microsecond.
-// 设置年、月、日、微秒
-func (c Carbon) SetDateMicro(year, month, day, microsecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetDateMicro(year, month, day, microsecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
hour, minute, second := c.Time()
- return c.create(year, month, day, hour, minute, second, microsecond*1e3)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, microsecond*1e3, c.loc)
+ return c
}
// SetDateNano sets year, month, day and nanosecond.
-// 设置年、月、日、纳秒
-func (c Carbon) SetDateNano(year, month, day, nanosecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetDateNano(year, month, day, nanosecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
hour, minute, second := c.Time()
- return c.create(year, month, day, hour, minute, second, nanosecond)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, nanosecond, c.loc)
+ return c
}
// SetTime sets hour, minute and second.
-// 设置时、分、秒
-func (c Carbon) SetTime(hour, minute, second int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetTime(hour, minute, second int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day := c.Date()
- return c.create(year, month, day, hour, minute, second, c.Nanosecond())
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, c.Nanosecond(), c.loc)
+ return c
}
// SetTimeMilli sets hour, minute, second and millisecond.
-// 设置时、分、秒、毫秒
-func (c Carbon) SetTimeMilli(hour, minute, second, millisecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetTimeMilli(hour, minute, second, millisecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day := c.Date()
- return c.create(year, month, day, hour, minute, second, millisecond*1e6)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, millisecond*1e6, c.loc)
+ return c
}
// SetTimeMicro sets hour, minute, second and microsecond.
-// 设置时、分、秒、微秒
-func (c Carbon) SetTimeMicro(hour, minute, second, microsecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetTimeMicro(hour, minute, second, microsecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day := c.Date()
- return c.create(year, month, day, hour, minute, second, microsecond*1e3)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, microsecond*1e3, c.loc)
+ return c
}
// SetTimeNano sets hour, minute, second and nanosecond.
-// 设置、时、分、秒、纳秒
-func (c Carbon) SetTimeNano(hour, minute, second, nanosecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetTimeNano(hour, minute, second, nanosecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day := c.Date()
- return c.create(year, month, day, hour, minute, second, nanosecond)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, nanosecond, c.loc)
+ return c
}
// SetYear sets year.
-// 设置年份
-func (c Carbon) SetYear(year int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetYear(year int) *Carbon {
+ if c.IsInvalid() {
return c
}
_, month, day, hour, minute, second := c.DateTime()
- return c.create(year, month, day, hour, minute, second, c.Nanosecond())
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, c.Nanosecond(), c.loc)
+ return c
}
// SetYearNoOverflow sets year without overflowing month.
-// 设置年份(月份不溢出)
-func (c Carbon) SetYearNoOverflow(year int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetYearNoOverflow(year int) *Carbon {
+ if c.IsInvalid() {
return c
}
return c.AddYearsNoOverflow(year - c.Year())
}
// SetMonth sets month.
-// 设置月份
-func (c Carbon) SetMonth(month int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetMonth(month int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, _, day, hour, minute, second := c.DateTime()
- return c.create(year, month, day, hour, minute, second, c.Nanosecond())
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, c.Nanosecond(), c.loc)
+ return c
}
// SetMonthNoOverflow sets month without overflowing month.
-// 设置月份(月份不溢出)
-func (c Carbon) SetMonthNoOverflow(month int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetMonthNoOverflow(month int) *Carbon {
+ if c.IsInvalid() {
return c
}
return c.AddMonthsNoOverflow(month - c.Month())
}
// SetDay sets day.
-// 设置日期
-func (c Carbon) SetDay(day int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetDay(day int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, _, hour, minute, second := c.DateTime()
- return c.create(year, month, day, hour, minute, second, c.Nanosecond())
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, c.Nanosecond(), c.loc)
+ return c
}
// SetHour sets hour.
-// 设置小时
-func (c Carbon) SetHour(hour int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetHour(hour int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, _, minute, second := c.DateTime()
- return c.create(year, month, day, hour, minute, second, c.Nanosecond())
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, c.Nanosecond(), c.loc)
+ return c
}
// SetMinute sets minute.
-// 设置分钟
-func (c Carbon) SetMinute(minute int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetMinute(minute int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, hour, _, second := c.DateTime()
- return c.create(year, month, day, hour, minute, second, c.Nanosecond())
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, c.Nanosecond(), c.loc)
+ return c
}
// SetSecond sets second.
-// 设置秒数
-func (c Carbon) SetSecond(second int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetSecond(second int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, hour, minute, _ := c.DateTime()
- return c.create(year, month, day, hour, minute, second, c.Nanosecond())
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, c.Nanosecond(), c.loc)
+ return c
}
// SetMillisecond sets millisecond.
-// 设置毫秒
-func (c Carbon) SetMillisecond(millisecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetMillisecond(millisecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, hour, minute, second := c.DateTime()
- return c.create(year, month, day, hour, minute, second, millisecond*1e6)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, millisecond*1e6, c.loc)
+ return c
}
// SetMicrosecond sets microsecond.
-// 设置微秒
-func (c Carbon) SetMicrosecond(microsecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetMicrosecond(microsecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, hour, minute, second := c.DateTime()
- return c.create(year, month, day, hour, minute, second, microsecond*1e3)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, microsecond*1e3, c.loc)
+ return c
}
// SetNanosecond sets nanosecond.
-// 设置纳秒
-func (c Carbon) SetNanosecond(nanosecond int) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetNanosecond(nanosecond int) *Carbon {
+ if c.IsInvalid() {
return c
}
year, month, day, hour, minute, second := c.DateTime()
- return c.create(year, month, day, hour, minute, second, nanosecond)
+ c.time = time.Date(year, time.Month(month), day, hour, minute, second, nanosecond, c.loc)
+ return c
}
diff --git a/vendor/github.com/dromara/carbon/v2/test.go b/vendor/github.com/dromara/carbon/v2/test.go
deleted file mode 100644
index c4481d02..00000000
--- a/vendor/github.com/dromara/carbon/v2/test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package carbon
-
-// SetTestNow sets a test Carbon instance (real or mock) to be returned when a "now" instance is created.
-// 设置当前测试时间
-func (c *Carbon) SetTestNow(carbon Carbon) {
- c.testNow, c.loc = carbon.TimestampNano(), carbon.loc
-}
-
-// UnSetTestNow clears a test Carbon instance (real or mock) to be returned when a "now" instance is created.
-// 清除当前测试时间
-func (c *Carbon) UnSetTestNow() {
- c.testNow = 0
-}
-
-// IsSetTestNow report whether there is testing time now.
-// 是否设置过当前测试时间
-func (c Carbon) IsSetTestNow() bool {
- return c.testNow > 0
-}
diff --git a/vendor/github.com/dromara/carbon/v2/traveler.go b/vendor/github.com/dromara/carbon/v2/traveler.go
index fc1fa33d..a22c4c49 100644
--- a/vendor/github.com/dromara/carbon/v2/traveler.go
+++ b/vendor/github.com/dromara/carbon/v2/traveler.go
@@ -5,187 +5,148 @@ import (
)
// Now returns a Carbon instance for now.
-// 当前
-func (c Carbon) Now(timezone ...string) Carbon {
+func Now(timezone ...string) *Carbon {
+ var (
+ tz string
+ loc *Location
+ err error
+ )
if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+ tz = timezone[0]
+ } else {
+ tz = DefaultTimezone
}
- if c.Error != nil {
- return c
+ if loc, err = parseTimezone(tz); err != nil {
+ return &Carbon{Error: err}
}
- if c.IsSetTestNow() {
- now := CreateFromTimestampNano(c.testNow, c.Location())
- now.testNow = c.testNow
+ if IsTestNow() {
+ return frozenNow.testNow.Copy().SetLocation(loc)
+ }
+ return CreateFromStdTime(time.Now().In(loc))
+}
+
+// Tomorrow returns a Carbon instance for tomorrow.
+func Tomorrow(timezone ...string) *Carbon {
+ now := Now(timezone...)
+ if now.IsInvalid() {
return now
}
- c.time = time.Now().In(c.loc)
- return c
-}
-
-// Now returns a Carbon instance for now.
-// 当前
-func Now(timezone ...string) Carbon {
- return NewCarbon().Now(timezone...)
-}
-
-// Tomorrow returns a Carbon instance for tomorrow.
-// 明天
-func (c Carbon) Tomorrow(timezone ...string) Carbon {
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
- }
- if c.Error != nil {
- return c
- }
- if !c.IsZero() {
- return c.AddDay()
- }
- return c.Now().AddDay()
-}
-
-// Tomorrow returns a Carbon instance for tomorrow.
-// 明天
-func Tomorrow(timezone ...string) Carbon {
- return NewCarbon().Tomorrow(timezone...)
+ return now.AddDay()
}
// Yesterday returns a Carbon instance for yesterday.
-// 昨天
-func (c Carbon) Yesterday(timezone ...string) Carbon {
- if len(timezone) > 0 {
- c.loc, c.Error = getLocationByTimezone(timezone[0])
+func Yesterday(timezone ...string) *Carbon {
+ now := Now(timezone...)
+ if now.IsInvalid() {
+ return now
}
- if c.Error != nil {
- return c
- }
- if !c.IsZero() {
- return c.SubDay()
- }
- return c.Now().SubDay()
+ return now.SubDay()
}
-// Yesterday returns a Carbon instance for yesterday.
-// 昨天
-func Yesterday(timezone ...string) Carbon {
- return NewCarbon().Yesterday(timezone...)
-}
-
-// AddDuration adds one duration.
-// 按照时长增加时间,支持整数/浮点数和符号ns(纳秒)、us(微妙)、ms(毫秒)、s(秒)、m(分钟)、h(小时)的组合
-func (c Carbon) AddDuration(duration string) Carbon {
+// AddDuration adds duration.
+func (c *Carbon) AddDuration(duration string) *Carbon {
if c.IsInvalid() {
return c
}
- td, err := parseByDuration(duration)
- c.time, c.Error = c.StdTime().Add(td), err
+ var (
+ td Duration
+ err error
+ )
+ if td, err = parseDuration(duration); err != nil {
+ c.Error = err
+ return c
+ }
+ c.time = c.StdTime().Add(td)
return c
}
-// SubDuration subtracts one duration.
-// 按照时长减少时间,支持整数/浮点数和符号ns(纳秒)、us(微妙)、ms(毫秒)、s(秒)、m(分钟)、h(小时)的组合
-func (c Carbon) SubDuration(duration string) Carbon {
+// SubDuration subtracts duration.
+func (c *Carbon) SubDuration(duration string) *Carbon {
return c.AddDuration("-" + duration)
}
// AddCenturies adds some centuries.
-// N个世纪后
-func (c Carbon) AddCenturies(centuries int) Carbon {
+func (c *Carbon) AddCenturies(centuries int) *Carbon {
return c.AddYears(centuries * YearsPerCentury)
}
// AddCenturiesNoOverflow adds some centuries without overflowing month.
-// N个世纪后(月份不溢出)
-func (c Carbon) AddCenturiesNoOverflow(centuries int) Carbon {
+func (c *Carbon) AddCenturiesNoOverflow(centuries int) *Carbon {
return c.AddYearsNoOverflow(centuries * YearsPerCentury)
}
// AddCentury adds one century.
-// 1个世纪后
-func (c Carbon) AddCentury() Carbon {
+func (c *Carbon) AddCentury() *Carbon {
return c.AddCenturies(1)
}
// AddCenturyNoOverflow adds one century without overflowing month.
-// 1个世纪后(月份不溢出)
-func (c Carbon) AddCenturyNoOverflow() Carbon {
+func (c *Carbon) AddCenturyNoOverflow() *Carbon {
return c.AddCenturiesNoOverflow(1)
}
// SubCenturies subtracts some centuries.
-// N个世纪前
-func (c Carbon) SubCenturies(centuries int) Carbon {
+func (c *Carbon) SubCenturies(centuries int) *Carbon {
return c.SubYears(centuries * YearsPerCentury)
}
// SubCenturiesNoOverflow subtracts some centuries without overflowing month.
-// N个世纪前(月份不溢出)
-func (c Carbon) SubCenturiesNoOverflow(centuries int) Carbon {
+func (c *Carbon) SubCenturiesNoOverflow(centuries int) *Carbon {
return c.SubYearsNoOverflow(centuries * YearsPerCentury)
}
// SubCentury subtracts one century.
-// 1个世纪前
-func (c Carbon) SubCentury() Carbon {
+func (c *Carbon) SubCentury() *Carbon {
return c.SubCenturies(1)
}
// SubCenturyNoOverflow subtracts one century without overflowing month.
-// 1个世纪前(月份不溢出)
-func (c Carbon) SubCenturyNoOverflow() Carbon {
+func (c *Carbon) SubCenturyNoOverflow() *Carbon {
return c.SubCenturiesNoOverflow(1)
}
// AddDecades adds some decades.
-// N个年代后
-func (c Carbon) AddDecades(decades int) Carbon {
+func (c *Carbon) AddDecades(decades int) *Carbon {
return c.AddYears(decades * YearsPerDecade)
}
// AddDecadesNoOverflow adds some decades without overflowing month.
-// N个年代后(月份不溢出)
-func (c Carbon) AddDecadesNoOverflow(decades int) Carbon {
+func (c *Carbon) AddDecadesNoOverflow(decades int) *Carbon {
return c.AddYearsNoOverflow(decades * YearsPerDecade)
}
// AddDecade adds one decade.
-// 1个年代后
-func (c Carbon) AddDecade() Carbon {
+func (c *Carbon) AddDecade() *Carbon {
return c.AddDecades(1)
}
// AddDecadeNoOverflow adds one decade without overflowing month.
-// 1个年代后(月份不溢出)
-func (c Carbon) AddDecadeNoOverflow() Carbon {
+func (c *Carbon) AddDecadeNoOverflow() *Carbon {
return c.AddDecadesNoOverflow(1)
}
// SubDecades subtracts some decades.
-// N个年代后
-func (c Carbon) SubDecades(decades int) Carbon {
+func (c *Carbon) SubDecades(decades int) *Carbon {
return c.SubYears(decades * YearsPerDecade)
}
// SubDecadesNoOverflow subtracts some decades without overflowing month.
-// N个年代后(月份不溢出)
-func (c Carbon) SubDecadesNoOverflow(decades int) Carbon {
+func (c *Carbon) SubDecadesNoOverflow(decades int) *Carbon {
return c.SubYearsNoOverflow(decades * YearsPerDecade)
}
// SubDecade subtracts one decade.
-// 1个年代后
-func (c Carbon) SubDecade() Carbon {
+func (c *Carbon) SubDecade() *Carbon {
return c.SubDecades(1)
}
// SubDecadeNoOverflow subtracts one decade without overflowing month.
-// 1个年代后(月份不溢出)
-func (c Carbon) SubDecadeNoOverflow() Carbon {
+func (c *Carbon) SubDecadeNoOverflow() *Carbon {
return c.SubDecadesNoOverflow(1)
}
// AddYears adds some years.
-// N年后
-func (c Carbon) AddYears(years int) Carbon {
+func (c *Carbon) AddYears(years int) *Carbon {
if c.IsInvalid() {
return c
}
@@ -194,36 +155,33 @@ func (c Carbon) AddYears(years int) Carbon {
}
// AddYearsNoOverflow adds some years without overflowing month.
-// N年后(月份不溢出)
-func (c Carbon) AddYearsNoOverflow(years int) Carbon {
+func (c *Carbon) AddYearsNoOverflow(years int) *Carbon {
if c.IsInvalid() {
return c
}
nanosecond := c.Nanosecond()
year, month, day, hour, minute, second := c.DateTime()
- // 获取N年后本月的最后一天
- lastYear, lastMonth, lastDay := c.create(year+years, month+1, 0, hour, minute, second, nanosecond).Date()
+ // get the last day of this month after some years
+ lastYear, lastMonth, lastDay := time.Date(year+years, time.Month(month+1), 0, hour, minute, second, nanosecond, c.loc).Date()
if day > lastDay {
day = lastDay
}
- return c.create(lastYear, lastMonth, day, hour, minute, second, nanosecond)
+ c.time = time.Date(lastYear, lastMonth, day, hour, minute, second, nanosecond, c.loc)
+ return c
}
// AddYear adds one year.
-// 1年后
-func (c Carbon) AddYear() Carbon {
+func (c *Carbon) AddYear() *Carbon {
return c.AddYears(1)
}
// AddYearNoOverflow adds one year without overflowing month.
-// 1年后(月份不溢出)
-func (c Carbon) AddYearNoOverflow() Carbon {
+func (c *Carbon) AddYearNoOverflow() *Carbon {
return c.AddYearsNoOverflow(1)
}
// SubYears subtracts some years.
-// N年前
-func (c Carbon) SubYears(years int) Carbon {
+func (c *Carbon) SubYears(years int) *Carbon {
if c.IsInvalid() {
return c
}
@@ -231,74 +189,62 @@ func (c Carbon) SubYears(years int) Carbon {
}
// SubYearsNoOverflow subtracts some years without overflowing month.
-// N年前(月份不溢出)
-func (c Carbon) SubYearsNoOverflow(years int) Carbon {
+func (c *Carbon) SubYearsNoOverflow(years int) *Carbon {
return c.AddYearsNoOverflow(-years)
}
// SubYear subtracts one year.
-// 1年前
-func (c Carbon) SubYear() Carbon {
+func (c *Carbon) SubYear() *Carbon {
return c.SubYears(1)
}
// SubYearNoOverflow subtracts one year without overflowing month.
-// 1年前(月份不溢出)
-func (c Carbon) SubYearNoOverflow() Carbon {
+func (c *Carbon) SubYearNoOverflow() *Carbon {
return c.SubYearsNoOverflow(1)
}
// AddQuarters adds some quarters
-// N个季度后
-func (c Carbon) AddQuarters(quarters int) Carbon {
+func (c *Carbon) AddQuarters(quarters int) *Carbon {
return c.AddMonths(quarters * MonthsPerQuarter)
}
// AddQuartersNoOverflow adds quarters without overflowing month.
-// N个季度后(月份不溢出)
-func (c Carbon) AddQuartersNoOverflow(quarters int) Carbon {
+func (c *Carbon) AddQuartersNoOverflow(quarters int) *Carbon {
return c.AddMonthsNoOverflow(quarters * MonthsPerQuarter)
}
// AddQuarter adds one quarter
-// 1个季度后
-func (c Carbon) AddQuarter() Carbon {
+func (c *Carbon) AddQuarter() *Carbon {
return c.AddQuarters(1)
}
// AddQuarterNoOverflow adds one quarter without overflowing month.
-// 1个季度后(月份不溢出)
-func (c Carbon) AddQuarterNoOverflow() Carbon {
+func (c *Carbon) AddQuarterNoOverflow() *Carbon {
return c.AddQuartersNoOverflow(1)
}
// SubQuarters subtracts some quarters.
-// N个季度前
-func (c Carbon) SubQuarters(quarters int) Carbon {
+func (c *Carbon) SubQuarters(quarters int) *Carbon {
return c.AddQuarters(-quarters)
}
// SubQuartersNoOverflow subtracts some quarters without overflowing month.
-// N个季度前(月份不溢出)
-func (c Carbon) SubQuartersNoOverflow(quarters int) Carbon {
+func (c *Carbon) SubQuartersNoOverflow(quarters int) *Carbon {
return c.AddMonthsNoOverflow(-quarters * MonthsPerQuarter)
}
// SubQuarter subtracts one quarter.
-// 1个季度前
-func (c Carbon) SubQuarter() Carbon {
+func (c *Carbon) SubQuarter() *Carbon {
return c.SubQuarters(1)
}
// SubQuarterNoOverflow subtracts one quarter without overflowing month.
-// 1个季度前(月份不溢出)
-func (c Carbon) SubQuarterNoOverflow() Carbon {
+func (c *Carbon) SubQuarterNoOverflow() *Carbon {
return c.SubQuartersNoOverflow(1)
}
// AddMonths adds some months.
-// N个月后
-func (c Carbon) AddMonths(months int) Carbon {
+func (c *Carbon) AddMonths(months int) *Carbon {
if c.IsInvalid() {
return c
}
@@ -307,84 +253,73 @@ func (c Carbon) AddMonths(months int) Carbon {
}
// AddMonthsNoOverflow adds some months without overflowing month.
-// N个月后(月份不溢出)
-func (c Carbon) AddMonthsNoOverflow(months int) Carbon {
+func (c *Carbon) AddMonthsNoOverflow(months int) *Carbon {
if c.IsInvalid() {
return c
}
nanosecond := c.Nanosecond()
year, month, day, hour, minute, second := c.DateTime()
- // 获取N月后的最后一天
- lastYear, lastMonth, lastDay := c.create(year, month+months+1, 0, hour, minute, second, nanosecond).Date()
+ // get the last day of this month after some months
+ lastYear, lastMonth, lastDay := time.Date(year, time.Month(month+months+1), 0, hour, minute, second, nanosecond, c.loc).Date()
if day > lastDay {
day = lastDay
}
- return c.create(lastYear, lastMonth, day, hour, minute, second, nanosecond)
+ c.time = time.Date(lastYear, lastMonth, day, hour, minute, second, nanosecond, c.loc)
+ return c
}
// AddMonth adds one month.
-// 1个月后
-func (c Carbon) AddMonth() Carbon {
+func (c *Carbon) AddMonth() *Carbon {
return c.AddMonths(1)
}
// AddMonthNoOverflow adds one month without overflowing month.
-// 1个月后(月份不溢出)
-func (c Carbon) AddMonthNoOverflow() Carbon {
+func (c *Carbon) AddMonthNoOverflow() *Carbon {
return c.AddMonthsNoOverflow(1)
}
// SubMonths subtracts some months.
-// N个月前
-func (c Carbon) SubMonths(months int) Carbon {
+func (c *Carbon) SubMonths(months int) *Carbon {
return c.AddMonths(-months)
}
// SubMonthsNoOverflow subtracts some months without overflowing month.
-// N个月前(月份不溢出)
-func (c Carbon) SubMonthsNoOverflow(months int) Carbon {
+func (c *Carbon) SubMonthsNoOverflow(months int) *Carbon {
return c.AddMonthsNoOverflow(-months)
}
// SubMonth subtracts one month.
-// 1个月前
-func (c Carbon) SubMonth() Carbon {
+func (c *Carbon) SubMonth() *Carbon {
return c.SubMonths(1)
}
// SubMonthNoOverflow subtracts one month without overflowing month.
-// 1个月前(月份不溢出)
-func (c Carbon) SubMonthNoOverflow() Carbon {
+func (c *Carbon) SubMonthNoOverflow() *Carbon {
return c.SubMonthsNoOverflow(1)
}
// AddWeeks adds some weeks.
-// N周后
-func (c Carbon) AddWeeks(weeks int) Carbon {
+func (c *Carbon) AddWeeks(weeks int) *Carbon {
return c.AddDays(weeks * DaysPerWeek)
}
// AddWeek adds one week.
-// 1周后
-func (c Carbon) AddWeek() Carbon {
+func (c *Carbon) AddWeek() *Carbon {
return c.AddWeeks(1)
}
// SubWeeks subtracts some weeks.
-// N周前
-func (c Carbon) SubWeeks(weeks int) Carbon {
+func (c *Carbon) SubWeeks(weeks int) *Carbon {
return c.SubDays(weeks * DaysPerWeek)
}
// SubWeek subtracts one week.
-// 1周前
-func (c Carbon) SubWeek() Carbon {
+func (c *Carbon) SubWeek() *Carbon {
return c.SubWeeks(1)
}
// AddDays adds some days.
-// N天后
-func (c Carbon) AddDays(days int) Carbon {
+func (c *Carbon) AddDays(days int) *Carbon {
if c.IsInvalid() {
return c
}
@@ -393,193 +328,160 @@ func (c Carbon) AddDays(days int) Carbon {
}
// AddDay adds one day.
-// 1天后
-func (c Carbon) AddDay() Carbon {
+func (c *Carbon) AddDay() *Carbon {
return c.AddDays(1)
}
// SubDays subtracts some days.
-// N天前
-func (c Carbon) SubDays(days int) Carbon {
+func (c *Carbon) SubDays(days int) *Carbon {
return c.AddDays(-days)
}
// SubDay subtracts one day.
-// 1天前
-func (c Carbon) SubDay() Carbon {
+func (c *Carbon) SubDay() *Carbon {
return c.SubDays(1)
}
// AddHours adds some hours.
-// N小时后
-func (c Carbon) AddHours(hours int) Carbon {
+func (c *Carbon) AddHours(hours int) *Carbon {
if c.IsInvalid() {
return c
}
- td := time.Duration(hours) * time.Hour
- c.time = c.StdTime().Add(td)
+ c.time = c.StdTime().Add(Duration(hours) * time.Hour)
return c
}
// AddHour adds one hour.
-// 1小时后
-func (c Carbon) AddHour() Carbon {
+func (c *Carbon) AddHour() *Carbon {
return c.AddHours(1)
}
// SubHours subtracts some hours.
-// N小时前
-func (c Carbon) SubHours(hours int) Carbon {
+func (c *Carbon) SubHours(hours int) *Carbon {
return c.AddHours(-hours)
}
// SubHour subtracts one hour.
-// 1小时前
-func (c Carbon) SubHour() Carbon {
+func (c *Carbon) SubHour() *Carbon {
return c.SubHours(1)
}
// AddMinutes adds some minutes.
-// N分钟后
-func (c Carbon) AddMinutes(minutes int) Carbon {
+func (c *Carbon) AddMinutes(minutes int) *Carbon {
if c.IsInvalid() {
return c
}
- td := time.Duration(minutes) * time.Minute
- c.time = c.StdTime().Add(td)
+ c.time = c.StdTime().Add(Duration(minutes) * time.Minute)
return c
}
// AddMinute adds one minute.
-// 1分钟后
-func (c Carbon) AddMinute() Carbon {
+func (c *Carbon) AddMinute() *Carbon {
return c.AddMinutes(1)
}
// SubMinutes subtracts some minutes.
-// N分钟前
-func (c Carbon) SubMinutes(minutes int) Carbon {
+func (c *Carbon) SubMinutes(minutes int) *Carbon {
return c.AddMinutes(-minutes)
}
// SubMinute subtracts one minute.
-// 1分钟前
-func (c Carbon) SubMinute() Carbon {
+func (c *Carbon) SubMinute() *Carbon {
return c.SubMinutes(1)
}
// AddSeconds adds some seconds.
-// N秒钟后
-func (c Carbon) AddSeconds(seconds int) Carbon {
+func (c *Carbon) AddSeconds(seconds int) *Carbon {
if c.IsInvalid() {
return c
}
- td := time.Duration(seconds) * time.Second
- c.time = c.StdTime().Add(td)
+ c.time = c.StdTime().Add(Duration(seconds) * time.Second)
return c
}
// AddSecond adds one second.
-// 1秒钟后
-func (c Carbon) AddSecond() Carbon {
+func (c *Carbon) AddSecond() *Carbon {
return c.AddSeconds(1)
}
// SubSeconds subtracts some seconds.
-// N秒钟前
-func (c Carbon) SubSeconds(seconds int) Carbon {
+func (c *Carbon) SubSeconds(seconds int) *Carbon {
return c.AddSeconds(-seconds)
}
// SubSecond subtracts one second.
-// 1秒钟前
-func (c Carbon) SubSecond() Carbon {
+func (c *Carbon) SubSecond() *Carbon {
return c.SubSeconds(1)
}
// AddMilliseconds adds some milliseconds.
-// N毫秒后
-func (c Carbon) AddMilliseconds(milliseconds int) Carbon {
+func (c *Carbon) AddMilliseconds(milliseconds int) *Carbon {
if c.IsInvalid() {
return c
}
- td := time.Duration(milliseconds) * time.Millisecond
- c.time = c.StdTime().Add(td)
+ c.time = c.StdTime().Add(Duration(milliseconds) * time.Millisecond)
return c
}
// AddMillisecond adds one millisecond.
-// 1毫秒后
-func (c Carbon) AddMillisecond() Carbon {
+func (c *Carbon) AddMillisecond() *Carbon {
return c.AddMilliseconds(1)
}
// SubMilliseconds subtracts some milliseconds.
-// N毫秒前
-func (c Carbon) SubMilliseconds(milliseconds int) Carbon {
+func (c *Carbon) SubMilliseconds(milliseconds int) *Carbon {
return c.AddMilliseconds(-milliseconds)
}
// SubMillisecond subtracts one millisecond.
-// 1毫秒前
-func (c Carbon) SubMillisecond() Carbon {
+func (c *Carbon) SubMillisecond() *Carbon {
return c.SubMilliseconds(1)
}
// AddMicroseconds adds some microseconds.
-// N微秒后
-func (c Carbon) AddMicroseconds(microseconds int) Carbon {
+func (c *Carbon) AddMicroseconds(microseconds int) *Carbon {
if c.IsInvalid() {
return c
}
- td := time.Duration(microseconds) * time.Microsecond
- c.time = c.StdTime().Add(td)
+ c.time = c.StdTime().Add(Duration(microseconds) * time.Microsecond)
return c
}
// AddMicrosecond adds one microsecond.
-// 1微秒后
-func (c Carbon) AddMicrosecond() Carbon {
+func (c *Carbon) AddMicrosecond() *Carbon {
return c.AddMicroseconds(1)
}
// SubMicroseconds subtracts some microseconds.
-// N微秒前
-func (c Carbon) SubMicroseconds(microseconds int) Carbon {
+func (c *Carbon) SubMicroseconds(microseconds int) *Carbon {
return c.AddMicroseconds(-microseconds)
}
// SubMicrosecond subtracts one microsecond.
-// 1微秒前
-func (c Carbon) SubMicrosecond() Carbon {
+func (c *Carbon) SubMicrosecond() *Carbon {
return c.SubMicroseconds(1)
}
// AddNanoseconds adds some nanoseconds.
-// N纳秒后
-func (c Carbon) AddNanoseconds(nanoseconds int) Carbon {
+func (c *Carbon) AddNanoseconds(nanoseconds int) *Carbon {
if c.IsInvalid() {
return c
}
- td := time.Duration(nanoseconds) * time.Nanosecond
- c.time = c.StdTime().Add(td)
+ c.time = c.StdTime().Add(Duration(nanoseconds) * time.Nanosecond)
return c
}
// AddNanosecond adds one nanosecond.
-// 1纳秒后
-func (c Carbon) AddNanosecond() Carbon {
+func (c *Carbon) AddNanosecond() *Carbon {
return c.AddNanoseconds(1)
}
// SubNanoseconds subtracts some nanoseconds.
-// N纳秒前
-func (c Carbon) SubNanoseconds(nanoseconds int) Carbon {
+func (c *Carbon) SubNanoseconds(nanoseconds int) *Carbon {
return c.AddNanoseconds(-nanoseconds)
}
// SubNanosecond subtracts one nanosecond.
-// 1纳秒前
-func (c Carbon) SubNanosecond() Carbon {
+func (c *Carbon) SubNanosecond() *Carbon {
return c.SubNanoseconds(1)
}
diff --git a/vendor/github.com/dromara/carbon/v2/type_builtin.go b/vendor/github.com/dromara/carbon/v2/type_builtin.go
new file mode 100644
index 00000000..d7dc4051
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/type_builtin.go
@@ -0,0 +1,206 @@
+package carbon
+
+type (
+ timestampType int64
+ timestampMicroType int64
+ timestampMilliType int64
+ timestampNanoType int64
+
+ datetimeType string
+ datetimeMicroType string
+ datetimeMilliType string
+ datetimeNanoType string
+
+ dateType string
+ dateMilliType string
+ dateMicroType string
+ dateNanoType string
+
+ timeType string
+ timeMilliType string
+ timeMicroType string
+ timeNanoType string
+)
+
+type (
+ Timestamp = TimestampType[timestampType]
+ TimestampMilli = TimestampType[timestampMilliType]
+ TimestampMicro = TimestampType[timestampMicroType]
+ TimestampNano = TimestampType[timestampNanoType]
+
+ DateTime = LayoutType[datetimeType]
+ DateTimeMicro = LayoutType[datetimeMicroType]
+ DateTimeMilli = LayoutType[datetimeMilliType]
+ DateTimeNano = LayoutType[datetimeNanoType]
+
+ Date = LayoutType[dateType]
+ DateMilli = LayoutType[dateMilliType]
+ DateMicro = LayoutType[dateMicroType]
+ DateNano = LayoutType[dateNanoType]
+
+ Time = LayoutType[timeType]
+ TimeMilli = LayoutType[timeMilliType]
+ TimeMicro = LayoutType[timeMicroType]
+ TimeNano = LayoutType[timeNanoType]
+)
+
+func NewTimestamp(c *Carbon) *Timestamp {
+ return NewTimestampType[timestampType](c)
+}
+func NewTimestampMilli(c *Carbon) *TimestampMilli {
+ return NewTimestampType[timestampMilliType](c)
+}
+func NewTimestampMicro(c *Carbon) *TimestampMicro {
+ return NewTimestampType[timestampMicroType](c)
+}
+func NewTimestampNano(c *Carbon) *TimestampNano {
+ return NewTimestampType[timestampNanoType](c)
+}
+
+func NewDateTime(c *Carbon) *DateTime {
+ return NewLayoutType[datetimeType](c)
+}
+func NewDateTimeMilli(c *Carbon) *DateTimeMilli {
+ return NewLayoutType[datetimeMilliType](c)
+}
+func NewDateTimeMicro(c *Carbon) *DateTimeMicro {
+ return NewLayoutType[datetimeMicroType](c)
+}
+func NewDateTimeNano(c *Carbon) *DateTimeNano {
+ return NewLayoutType[datetimeNanoType](c)
+}
+
+func NewDate(c *Carbon) *Date {
+ return NewLayoutType[dateType](c)
+}
+func NewDateMilli(c *Carbon) *DateMilli {
+ return NewLayoutType[dateMilliType](c)
+}
+func NewDateMicro(c *Carbon) *DateMicro {
+ return NewLayoutType[dateMicroType](c)
+}
+func NewDateNano(c *Carbon) *DateNano {
+ return NewLayoutType[dateNanoType](c)
+}
+
+func NewTime(c *Carbon) *Time {
+ return NewLayoutType[timeType](c)
+}
+func NewTimeMilli(c *Carbon) *TimeMilli {
+ return NewLayoutType[timeMilliType](c)
+}
+func NewTimeMicro(c *Carbon) *TimeMicro {
+ return NewLayoutType[timeMicroType](c)
+}
+func NewTimeNano(c *Carbon) *TimeNano {
+ return NewLayoutType[timeNanoType](c)
+}
+
+func (t timestampType) Precision() string {
+ return PrecisionSecond
+}
+
+func (t timestampMilliType) Precision() string {
+ return PrecisionMillisecond
+}
+func (t timestampMilliType) DataType() string {
+ return "timestamp(6)"
+}
+
+func (t timestampMicroType) Precision() string {
+ return PrecisionMicrosecond
+}
+func (t timestampMicroType) DataType() string {
+ return "timestamp(6)"
+}
+
+func (t timestampNanoType) Precision() string {
+ return PrecisionNanosecond
+}
+func (t timestampNanoType) DataType() string {
+ return "timestamp(6)"
+}
+
+func (t datetimeType) Layout() string {
+ return DateTimeLayout
+}
+func (t datetimeType) DataType() string {
+ return "datetime"
+}
+
+func (t datetimeMilliType) Layout() string {
+ return DateTimeMilliLayout
+}
+func (t datetimeMilliType) DataType() string {
+ return "datetime(6)"
+}
+
+func (t datetimeMicroType) Layout() string {
+ return DateTimeMicroLayout
+}
+func (t datetimeMicroType) DataType() string {
+ return "datetime(6)"
+}
+
+func (t datetimeNanoType) Layout() string {
+ return DateTimeNanoLayout
+}
+func (t datetimeNanoType) DataType() string {
+ return "datetime(6)"
+}
+
+func (t dateType) Layout() string {
+ return DateLayout
+}
+func (t dateType) DataType() string {
+ return "date"
+}
+
+func (t dateMilliType) Layout() string {
+ return DateMilliLayout
+}
+func (t dateMilliType) DataType() string {
+ return "datetime(6)"
+}
+
+func (t dateMicroType) Layout() string {
+ return DateMicroLayout
+}
+func (t dateMicroType) DataType() string {
+ return "datetime(6)"
+}
+
+func (t dateNanoType) Layout() string {
+ return DateNanoLayout
+}
+func (t dateNanoType) DataType() string {
+ return "datetime(6)"
+}
+
+func (t timeType) Layout() string {
+ return TimeLayout
+}
+func (t timeType) DataType() string {
+ return "time"
+}
+
+func (t timeMilliType) Layout() string {
+ return TimeMilliLayout
+}
+func (t timeMilliType) DataType() string {
+ return "datetime(6)"
+}
+
+func (t timeMicroType) Layout() string {
+ return TimeMicroLayout
+}
+func (t timeMicroType) DataType() string {
+ return "datetime(6)"
+}
+
+func (t timeNanoType) Layout() string {
+ return TimeNanoLayout
+}
+func (t timeNanoType) DataType() string {
+ return "datetime(6)"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/type_carbon.go b/vendor/github.com/dromara/carbon/v2/type_carbon.go
new file mode 100644
index 00000000..68f84660
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/type_carbon.go
@@ -0,0 +1,75 @@
+package carbon
+
+import (
+ "bytes"
+ "database/sql/driver"
+)
+
+// Scan implements "driver.Scanner" interface for Carbon struct.
+func (c *Carbon) Scan(src any) error {
+ switch v := src.(type) {
+ case nil:
+ return nil
+ case []byte:
+ *c = *Parse(string(v))
+ case string:
+ *c = *Parse(v)
+ case StdTime:
+ *c = *CreateFromStdTime(v)
+ case *StdTime:
+ *c = *CreateFromStdTime(*v)
+ default:
+ return ErrFailedScan(v)
+ }
+ return c.Error
+}
+
+// Value implements "driver.Valuer" interface for Carbon struct.
+func (c Carbon) Value() (driver.Value, error) {
+ if c.IsNil() || c.IsZero() || c.IsEmpty() {
+ return nil, nil
+ }
+ if c.HasError() {
+ return nil, c.Error
+ }
+ return c.StdTime(), nil
+}
+
+// MarshalJSON implements "json.Marshaler" interface for Carbon struct.
+func (c Carbon) MarshalJSON() ([]byte, error) {
+ if c.IsNil() || c.IsZero() || c.IsEmpty() {
+ return []byte(`null`), nil
+ }
+ if c.HasError() {
+ return []byte(`null`), c.Error
+ }
+ v := c.Layout(DefaultLayout)
+ b := make([]byte, 0, len(v)+2)
+ b = append(b, '"')
+ b = append(b, v...)
+ b = append(b, '"')
+ return b, nil
+}
+
+// UnmarshalJSON implements "json.Unmarshaler" interface for Carbon struct.
+func (c *Carbon) UnmarshalJSON(src []byte) error {
+ v := string(bytes.Trim(src, `"`))
+ if v == "" || v == "null" {
+ return nil
+ }
+ *c = *ParseByLayout(v, DefaultLayout)
+ return c.Error
+}
+
+// String implements "Stringer" interface for Carbon struct.
+func (c *Carbon) String() string {
+ if c.IsInvalid() {
+ return ""
+ }
+ return c.Layout(c.currentLayout)
+}
+
+// GormDataType implements "gorm.GormDataTypeInterface" interface for Carbon struct.
+func (c *Carbon) GormDataType() string {
+ return "datetime"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/type_format.go b/vendor/github.com/dromara/carbon/v2/type_format.go
new file mode 100644
index 00000000..f4cec2fe
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/type_format.go
@@ -0,0 +1,104 @@
+package carbon
+
+import (
+ "bytes"
+ "database/sql/driver"
+)
+
+// FormatType defines a FormatType generic struct.
+type FormatType[T FormatTyper] struct {
+ *Carbon
+}
+
+// NewFormatType returns a new FormatType generic instance.
+func NewFormatType[T FormatTyper](c *Carbon) *FormatType[T] {
+ return &FormatType[T]{
+ Carbon: c,
+ }
+}
+
+// Scan implements "driver.Scanner" interface for FormatType generic struct.
+func (t *FormatType[T]) Scan(src any) error {
+ var c *Carbon
+ switch v := src.(type) {
+ case nil:
+ return nil
+ case []byte:
+ c = Parse(string(v))
+ case string:
+ c = Parse(v)
+ case StdTime:
+ c = CreateFromStdTime(v)
+ case *StdTime:
+ c = CreateFromStdTime(*v)
+ default:
+ return ErrFailedScan(v)
+ }
+ *t = *NewFormatType[T](c)
+ return t.Error
+}
+
+// Value implements "driver.Valuer" interface for FormatType generic struct.
+func (t FormatType[T]) Value() (driver.Value, error) {
+ if t.IsNil() || t.IsZero() || t.IsEmpty() {
+ return nil, nil
+ }
+ if t.HasError() {
+ return nil, t.Error
+ }
+ return t.StdTime(), nil
+}
+
+// MarshalJSON implements "json.Marshaler" interface for FormatType generic struct.
+func (t FormatType[T]) MarshalJSON() ([]byte, error) {
+ if t.IsNil() || t.IsZero() || t.IsEmpty() {
+ return []byte(`null`), nil
+ }
+ if t.HasError() {
+ return []byte(`null`), t.Error
+ }
+ v := t.Format(t.getFormat())
+ b := make([]byte, 0, len(v)+2)
+ b = append(b, '"')
+ b = append(b, v...)
+ b = append(b, '"')
+ return b, nil
+}
+
+// UnmarshalJSON implements "json.Unmarshaler" interface for FormatType generic struct.
+func (t *FormatType[T]) UnmarshalJSON(src []byte) error {
+ v := string(bytes.Trim(src, `"`))
+ if v == "" || v == "null" {
+ return nil
+ }
+ *t = *NewFormatType[T](ParseByFormat(v, t.getFormat()))
+ return t.Error
+}
+
+// String implements "Stringer" interface for FormatType generic struct.
+func (t *FormatType[T]) String() string {
+ if t == nil || t.IsInvalid() {
+ return ""
+ }
+ return t.Format(t.getFormat())
+}
+
+// GormDataType implements "gorm.GormDataTypeInterface" interface for FormatType generic struct.
+func (t *FormatType[T]) GormDataType() string {
+ return t.getDataType()
+}
+
+// getDataType returns the data type of FormatType generic struct.
+func (t *FormatType[T]) getDataType() string {
+ var typer T
+ if v, ok := any(typer).(DataTyper); ok {
+ return v.DataType()
+ }
+ return "datetime"
+}
+
+// getFormat returns the format of FormatType generic struct.
+func (t *FormatType[T]) getFormat() string {
+ var typer T
+ return typer.Format()
+}
diff --git a/vendor/github.com/dromara/carbon/v2/type_layout.go b/vendor/github.com/dromara/carbon/v2/type_layout.go
new file mode 100644
index 00000000..3b3fbfe6
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/type_layout.go
@@ -0,0 +1,104 @@
+package carbon
+
+import (
+ "bytes"
+ "database/sql/driver"
+)
+
+// LayoutType defines a LayoutType generic struct
+type LayoutType[T LayoutTyper] struct {
+ *Carbon
+}
+
+// NewLayoutType returns a new LayoutType generic instance.
+func NewLayoutType[T LayoutTyper](c *Carbon) *LayoutType[T] {
+ return &LayoutType[T]{
+ Carbon: c,
+ }
+}
+
+// Scan implements "driver.Scanner" interface for LayoutType generic struct.
+func (t *LayoutType[T]) Scan(src any) error {
+ var c *Carbon
+ switch v := src.(type) {
+ case nil:
+ return nil
+ case []byte:
+ c = Parse(string(v))
+ case string:
+ c = Parse(v)
+ case StdTime:
+ c = CreateFromStdTime(v)
+ case *StdTime:
+ c = CreateFromStdTime(*v)
+ default:
+ return ErrFailedScan(v)
+ }
+ *t = *NewLayoutType[T](c)
+ return t.Error
+}
+
+// Value implements "driver.Valuer" interface for LayoutType generic struct.
+func (t LayoutType[T]) Value() (driver.Value, error) {
+ if t.IsNil() || t.IsZero() || t.IsEmpty() {
+ return nil, nil
+ }
+ if t.HasError() {
+ return nil, t.Error
+ }
+ return t.StdTime(), nil
+}
+
+// MarshalJSON implements "json.Marshaler" interface for LayoutType generic struct.
+func (t LayoutType[T]) MarshalJSON() ([]byte, error) {
+ if t.IsNil() || t.IsZero() || t.IsEmpty() {
+ return []byte(`null`), nil
+ }
+ if t.HasError() {
+ return []byte(`null`), t.Error
+ }
+ v := t.Layout(t.getLayout())
+ b := make([]byte, 0, len(v)+2)
+ b = append(b, '"')
+ b = append(b, v...)
+ b = append(b, '"')
+ return b, nil
+}
+
+// UnmarshalJSON implements "json.Unmarshaler" interface for LayoutType generic struct.
+func (t *LayoutType[T]) UnmarshalJSON(src []byte) error {
+ v := string(bytes.Trim(src, `"`))
+ if v == "" || v == "null" {
+ return nil
+ }
+ *t = *NewLayoutType[T](ParseByLayout(v, t.getLayout()))
+ return t.Error
+}
+
+// String implements "Stringer" interface for LayoutType generic struct.
+func (t *LayoutType[T]) String() string {
+ if t == nil || t.IsInvalid() {
+ return ""
+ }
+ return t.Layout(t.getLayout())
+}
+
+// GormDataType implements "gorm.GormDataTypeInterface" interface for LayoutType generic struct.
+func (t *LayoutType[T]) GormDataType() string {
+ return t.getDataType()
+}
+
+// getDataType returns the data type of LayoutType generic struct.
+func (t *LayoutType[T]) getDataType() string {
+ var typer T
+ if v, ok := any(typer).(DataTyper); ok {
+ return v.DataType()
+ }
+ return "datetime"
+}
+
+// getLayout returns the layout of LayoutType generic struct.
+func (t *LayoutType[T]) getLayout() string {
+ var typer T
+ return typer.Layout()
+}
diff --git a/vendor/github.com/dromara/carbon/v2/type_timestamp.go b/vendor/github.com/dromara/carbon/v2/type_timestamp.go
new file mode 100644
index 00000000..84a14211
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/type_timestamp.go
@@ -0,0 +1,155 @@
+package carbon
+
+import (
+ "bytes"
+ "database/sql/driver"
+ "strconv"
+)
+
+// timestamp precision constants
+const (
+ PrecisionSecond = "second"
+ PrecisionMillisecond = "millisecond"
+ PrecisionMicrosecond = "microsecond"
+ PrecisionNanosecond = "nanosecond"
+)
+
+// TimestampType defines a TimestampType generic struct.
+type TimestampType[T TimestampTyper] struct {
+ *Carbon
+}
+
+// NewTimestampType returns a new TimestampType generic instance.
+func NewTimestampType[T TimestampTyper](c *Carbon) *TimestampType[T] {
+ return &TimestampType[T]{
+ Carbon: c,
+ }
+}
+
+// Scan implements "driver.Scanner" interface for TimestampType generic struct.
+func (t *TimestampType[T]) Scan(src any) (err error) {
+ var c *Carbon
+ switch v := src.(type) {
+ case nil:
+ return nil
+ case []byte:
+ c = Parse(string(v))
+ case string:
+ c = Parse(v)
+ case StdTime:
+ c = CreateFromStdTime(v)
+ case *StdTime:
+ c = CreateFromStdTime(*v)
+ default:
+ return ErrFailedScan(src)
+ }
+ *t = *NewTimestampType[T](c)
+ return t.Error
+}
+
+// Value implements "driver.Valuer" interface for TimestampType generic struct.
+func (t TimestampType[T]) Value() (driver.Value, error) {
+ if t.IsNil() || t.IsZero() || t.IsEmpty() {
+ return nil, nil
+ }
+ if t.HasError() {
+ return nil, t.Error
+ }
+ return t.StdTime(), nil
+}
+
+// MarshalJSON implements "json.Marshaler" interface for TimestampType generic struct.
+func (t TimestampType[T]) MarshalJSON() ([]byte, error) {
+ if t.IsNil() || t.IsZero() || t.IsEmpty() {
+ return []byte(`null`), nil
+ }
+ if t.HasError() {
+ return []byte(`null`), t.Error
+ }
+ var ts int64
+ switch t.getPrecision() {
+ case PrecisionSecond:
+ ts = t.Timestamp()
+ case PrecisionMillisecond:
+ ts = t.TimestampMilli()
+ case PrecisionMicrosecond:
+ ts = t.TimestampMicro()
+ case PrecisionNanosecond:
+ ts = t.TimestampNano()
+ }
+ return []byte(strconv.FormatInt(ts, 10)), nil
+}
+
+// UnmarshalJSON implements "json.Unmarshaler" interface for TimestampType generic struct.
+func (t *TimestampType[T]) UnmarshalJSON(src []byte) error {
+ v := string(bytes.Trim(src, `"`))
+ if v == "" || v == "null" {
+ return nil
+ }
+ var (
+ ts int64
+ err error
+ )
+ if ts, err = parseTimestamp(v); err != nil {
+ return err
+ }
+ var c *Carbon
+ switch t.getPrecision() {
+ case PrecisionSecond:
+ c = CreateFromTimestamp(ts, DefaultTimezone)
+ case PrecisionMillisecond:
+ c = CreateFromTimestampMilli(ts, DefaultTimezone)
+ case PrecisionMicrosecond:
+ c = CreateFromTimestampMicro(ts, DefaultTimezone)
+ case PrecisionNanosecond:
+ c = CreateFromTimestampNano(ts, DefaultTimezone)
+ }
+ *t = *NewTimestampType[T](c)
+ return t.Error
+}
+
+// String implements "Stringer" interface for TimestampType generic struct.
+func (t *TimestampType[T]) String() string {
+ if t == nil || t.IsInvalid() {
+ return "0"
+ }
+ return strconv.FormatInt(t.Int64(), 10)
+}
+
+// Int64 returns the timestamp value.
+func (t *TimestampType[T]) Int64() (ts int64) {
+ if t == nil || t.IsInvalid() || t.IsZero() {
+ return
+ }
+ switch t.getPrecision() {
+ case PrecisionSecond:
+ ts = t.Timestamp()
+ case PrecisionMillisecond:
+ ts = t.TimestampMilli()
+ case PrecisionMicrosecond:
+ ts = t.TimestampMicro()
+ case PrecisionNanosecond:
+ ts = t.TimestampNano()
+ }
+ return
+}
+
+// GormDataType implements "gorm.GormDataTypeInterface" interface for TimestampType generic struct.
+func (t *TimestampType[T]) GormDataType() string {
+ return t.getDataType()
+}
+
+// getDataType returns data type of TimestampType generic struct.
+func (t *TimestampType[T]) getDataType() string {
+ var typer T
+ if v, ok := any(typer).(DataTyper); ok {
+ return v.DataType()
+ }
+ return "timestamp"
+}
+
+// getPrecision returns precision of TimestampType generic struct.
+func (t *TimestampType[T]) getPrecision() string {
+ var typer T
+ return typer.Precision()
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 522e1935..56827630 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -174,8 +174,8 @@ github.com/docker/go-connections/tlsconfig
# github.com/docker/go-units v0.5.0
## explicit
github.com/docker/go-units
-# github.com/dromara/carbon/v2 v2.5.2
-## explicit; go 1.17
+# github.com/dromara/carbon/v2 v2.6.8
+## explicit; go 1.21
github.com/dromara/carbon/v2
github.com/dromara/carbon/v2/calendar
github.com/dromara/carbon/v2/calendar/julian