diff --git a/go.mod b/go.mod
index d30ab88c..bf7507f2 100644
--- a/go.mod
+++ b/go.mod
@@ -7,7 +7,7 @@ require (
github.com/camunda/zeebe/clients/go/v8 v8.5.10
github.com/cockroachdb/pebble v1.1.2
github.com/denisenkom/go-mssqldb v0.12.3
- github.com/dromara/carbon/v2 v2.5.2
+ github.com/dromara/carbon/v2 v2.6.1
github.com/emersion/go-imap v1.2.1
github.com/emersion/go-message v0.18.1
github.com/go-faster/errors v0.7.1
@@ -30,13 +30,13 @@ require (
github.com/segmentio/kafka-go v0.4.47
github.com/tinkoff/invest-api-go-sdk v1.4.6
github.com/xhit/go-simple-mail/v2 v2.16.0
- gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange v0.0.33
- gitlab.aescorp.ru/dsp_dev/claim/sync_service v1.2.242
+ gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange v0.0.34
+ gitlab.aescorp.ru/dsp_dev/claim/sync_service v1.2.268
go.etcd.io/bbolt v1.3.11
go.mau.fi/whatsmeow v0.0.0-20241202173457-b2dd543e5721
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.32.0
- golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8
+ golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c
google.golang.org/protobuf v1.36.4
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gorm.io/driver/postgres v1.5.11
@@ -123,11 +123,11 @@ require (
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/oauth2 v0.24.0 // indirect
- golang.org/x/sync v0.10.0 // indirect
- golang.org/x/sys v0.29.0 // indirect
+ golang.org/x/sync v0.11.0 // indirect
+ golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.28.0 // indirect
- golang.org/x/text v0.21.0 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 // indirect
+ golang.org/x/text v0.22.0 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 // indirect
google.golang.org/grpc v1.70.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
nhooyr.io/websocket v1.8.17 // indirect
diff --git a/go.sum b/go.sum
index 1591aa4c..a0e63183 100644
--- a/go.sum
+++ b/go.sum
@@ -68,6 +68,8 @@ github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
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.1 h1:ExZPeH74ApLJ/nqJ+SGp1JSPFawvTDOCG3WSeqYl0mI=
+github.com/dromara/carbon/v2 v2.6.1/go.mod h1:Baj3A1uBBctJmpZWJd6/+WWnmIuY2pobR6IOpB6xigc=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/emersion/go-imap v1.2.1 h1:+s9ZjMEjOB8NzZMVTM3cCenz2JrQIGGo5j1df19WjTA=
@@ -316,8 +318,12 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange v0.0.33 h1:sLKDG4x4Ov72Nd9LKhj2rZ55OrHLaUgxupqCF27808I=
gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange v0.0.33/go.mod h1:+ZbwpurumFpi0GbiahOY4shV6WB2kguFxN486+76prs=
+gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange v0.0.34 h1:1w3epO1MYB3GAHYDEPNlJWtrSDt+eL+dCX1IqTI0HEk=
+gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange v0.0.34/go.mod h1:+ZbwpurumFpi0GbiahOY4shV6WB2kguFxN486+76prs=
gitlab.aescorp.ru/dsp_dev/claim/sync_service v1.2.242 h1:bS4Cq65lLs0LYOV9hzXW0Gv2lIqXi1I1TBzwhln4iWw=
gitlab.aescorp.ru/dsp_dev/claim/sync_service v1.2.242/go.mod h1:VB93+iYc+6r5Jka9gRgQksjjW2MHtDltXAsHVP6ZELc=
+gitlab.aescorp.ru/dsp_dev/claim/sync_service v1.2.268 h1:lPdwJ8heNvDu+5prMK2cqj+qd4IO43r6bc2kth+Y8Mo=
+gitlab.aescorp.ru/dsp_dev/claim/sync_service v1.2.268/go.mod h1:mleo1C4JFt0qkNRkDhfQsTYR+xUXpSXJXe3VopssGCU=
go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0=
go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I=
go.mau.fi/libsignal v0.1.1 h1:m/0PGBh4QKP/I1MQ44ti4C0fMbLMuHb95cmDw01FIpI=
@@ -361,6 +367,8 @@ golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA=
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
+golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc=
+golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@@ -397,6 +405,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
+golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -421,6 +431,8 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
+golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -447,6 +459,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
+golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -459,6 +473,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 h1:J1H9f+LEdWAfHcez/4cvaVBox7cOYT+IU6rgqj5x++8=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 h1:5bKytslY8ViY0Cj/ewmRtrWHW64bNF03cAatUUFCdFI=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
diff --git a/pkg/version/version.txt b/pkg/version/version.txt
index a1e1a93b..9760dbb8 100644
--- a/pkg/version/version.txt
+++ b/pkg/version/version.txt
@@ -1 +1 @@
-v1.0.120 2025-02-17 16:49:15 +0300
+v1.0.132 2025-04-02 14:07:34 +0300
diff --git a/sync_exchange_connect/sync_exchange_connect.go b/sync_exchange_connect/sync_exchange_connect.go
index 38822201..d06eb739 100644
--- a/sync_exchange_connect/sync_exchange_connect.go
+++ b/sync_exchange_connect/sync_exchange_connect.go
@@ -2,16 +2,23 @@
package sync_exchange_connect
import (
+ "bytes"
"context"
+ "fmt"
"github.com/ManyakRus/starter/contextmain"
"github.com/ManyakRus/starter/log"
"github.com/ManyakRus/starter/nats_connect"
"github.com/ManyakRus/starter/stopapp"
"gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange"
"gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/sync_types"
+ "runtime/pprof"
"sync"
+ "time"
)
+// serviceName - имя сервиса который подключается
+var serviceName string
+
// Connect - подключение к NATS SyncExchange
func Connect(ServiceName, ServiceVersion string) {
err := Connect_err(ServiceName, ServiceVersion)
@@ -125,3 +132,62 @@ func SendResponseError(sp *sync_types.SyncPackage, err error) {
}
}
+
+// Start_PprofNats - профилирование памяти отправляет в NATS, бесконечно + WaitGroup
+func Start_PprofNats() {
+ stopapp.GetWaitGroup_Main().Add(1)
+ go pprofNats_forever_go()
+}
+
+// pprofNats_forever_go - профилирование памяти отправляет в NATS, бесконечно + WaitGroup
+func pprofNats_forever_go() {
+ defer stopapp.GetWaitGroup_Main().Done()
+ PprofNats_forever()
+}
+
+// PprofNats_forever - профилирование памяти отправляет в NATS, бесконечно
+func PprofNats_forever() {
+ var err error
+
+ ticker := time.NewTicker(60 * time.Second)
+ defer ticker.Stop()
+
+loop:
+ for {
+ select {
+ case <-contextmain.GetContext().Done():
+ log.Warn("Context app is canceled. postgres_pgx.ping")
+ break loop
+ case <-ticker.C:
+ err = PprofNats1()
+ if err != nil {
+ err = fmt.Errorf("PprofNats1(), error: %w", err)
+ log.Error(err)
+ time.Sleep(60 * time.Second)
+ }
+ }
+ }
+}
+
+// PprofNats1 - профилирование памяти отправляет в NATS 1 раз
+func PprofNats1() error {
+ var err error
+ topicHeapProfile := serviceName + ".heap_profile"
+ var buf bytes.Buffer
+ err = pprof.WriteHeapProfile(&buf)
+ if err != nil {
+ err = fmt.Errorf("pprof.WriteHeapProfile(), topic: %v, error: %w", topicHeapProfile, err)
+ log.Error(err)
+ time.Sleep(10 * time.Second)
+ return err
+ }
+ err = sync_exchange.SendRawMessage(topicHeapProfile, buf.Bytes())
+ if err != nil {
+ err = fmt.Errorf("sync_exchange.SendRawMessage(), topic: %v, error: %w", topicHeapProfile, err)
+ log.Error(err)
+ time.Sleep(10 * time.Second)
+ return err
+ }
+
+ return err
+}
diff --git a/sync_exchange_connect/sync_exchange_connect_test.go b/sync_exchange_connect/sync_exchange_connect_test.go
index 80a14cf8..df003972 100644
--- a/sync_exchange_connect/sync_exchange_connect_test.go
+++ b/sync_exchange_connect/sync_exchange_connect_test.go
@@ -4,6 +4,7 @@ import (
"github.com/ManyakRus/starter/config_main"
"github.com/ManyakRus/starter/contextmain"
"github.com/ManyakRus/starter/micro"
+ "github.com/ManyakRus/starter/pkg/version"
"github.com/ManyakRus/starter/stopapp"
"testing"
)
@@ -12,7 +13,7 @@ var SERVICE_NAME_TEST = "test_nikitin"
func TestConnect(t *testing.T) {
config_main.LoadEnv()
- Connect(SERVICE_NAME_TEST)
+ Connect(SERVICE_NAME_TEST, version.Version)
defer CloseConnection()
micro.Pause(100)
@@ -21,7 +22,7 @@ func TestConnect(t *testing.T) {
func TestStartNats(t *testing.T) {
config_main.LoadEnv()
- Start(SERVICE_NAME_TEST)
+ Start(SERVICE_NAME_TEST, version.Version)
defer CloseConnection()
micro.Pause(100)
@@ -32,7 +33,7 @@ func TestStartNats(t *testing.T) {
func TestCloseConnection(t *testing.T) {
config_main.LoadEnv()
- Connect(SERVICE_NAME_TEST)
+ Connect(SERVICE_NAME_TEST, version.Version)
defer CloseConnection()
}
@@ -48,3 +49,11 @@ func TestWaitStop(t *testing.T) {
contextmain.GetNewContext()
}
+
+func TestPprofNats1(t *testing.T) {
+ config_main.LoadEnvTest()
+ Connect(SERVICE_NAME_TEST, version.Version)
+ defer CloseConnection()
+
+ PprofNats1()
+}
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..68650515 100644
--- a/vendor/github.com/dromara/carbon/v2/README.cn.md
+++ b/vendor/github.com/dromara/carbon/v2/README.cn.md
@@ -11,7 +11,9 @@
#### 项目简介
-一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用,已被 [awesome-go](https://github.com/yinggaozhen/awesome-go-cn#日期和时间 "awesome-go-cn") 收录,并获得 `gitee` 2024 年最有价值项目(`GVP`)和 `gitcode` 2024 年度开源摘星计划 (`G-Star`) 项目
+一个轻量级、语义化、对开发者友好的 `golang`
+时间处理库,已被 [awesome-go](https://github.com/yinggaozhen/awesome-go-cn#日期和时间 "awesome-go-cn") 收录,并获得
+`gitee` 2024 年最有价值项目(`GVP`)和 `gitcode` 2024 年度开源摘星计划 (`G-Star`) 项目
#### 仓库地址
@@ -23,7 +25,7 @@
#### 安装使用
-##### go version >= 1.17
+##### go version >= 1.18
```go
// 使用 github 库
@@ -52,18 +54,31 @@ go mod edit -replace github.com/golang-module/carbon/v2=github.com/dromara/carbo
##### 设置全局默认值
```go
+carbon.SetLayout(carbon.DateTimeLayout)
+carbon.SetTimezone(carbon.PRC)
+carbon.SetWeekStartsAt(carbon.Sunday)
+carbon.SetLocale("zh-CN")
+
+或
+
carbon.SetDefault(carbon.Default{
Layout: carbon.DateTimeLayout,
Timezone: carbon.PRC,
WeekStartsAt: carbon.Sunday,
- Locale: "zh-CN", // 取值范围:lang 目录下翻译文件名,不包含文件后缀
+ Locale: "zh-CN",
})
```
-> 建议在入口文件如 `main.go` 中设置
##### `Carbon` 和 `time.Time` 互转
```go
+// 将标准 time.Time 转换成 Carbon
+carbon.NewCarbon(time.Now())
+// 将 Carbon 转换成标准 time.Time
+carbon.Now().StdTime()
+
+或
+
// 将标准 time.Time 转换成 Carbon
carbon.CreateFromStdTime(time.Now())
// 将 Carbon 转换成标准 time.Time
@@ -76,14 +91,14 @@ carbon.Now().StdTime()
// 今天此刻
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().ToString() // 2020-08-05 13:14:15.999999999 +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(carbon.NewYork).ToDateTimeString() // 2020-08-05 14:14:15
// 今天秒级时间戳
carbon.Now().Timestamp() // 1596604455
// 今天毫秒级时间戳
@@ -96,7 +111,7 @@ 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().ToString() // 2020-08-04 13:14:15.999999999 +0800 CST
carbon.Yesterday().ToDateTimeString() // 2020-08-04 13:14:15
// 昨天日期
carbon.Yesterday().ToDateString() // 2020-08-04
@@ -105,7 +120,7 @@ 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(carbon.NewYork).ToDateTimeString() // 2020-08-04 14:14:15
// 昨天秒级时间戳
carbon.Yesterday().Timestamp() // 1596518055
// 昨天毫秒级时间戳
@@ -118,7 +133,7 @@ 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().ToString() // 2020-08-06 13:14:15.999999999 +0800 CST
carbon.Tomorrow().ToDateTimeString() // 2020-08-06 13:14:15
// 明天日期
carbon.Tomorrow().ToDateString() // 2020-08-06
@@ -127,7 +142,7 @@ 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(carbon.NewYork).ToDateTimeString() // 2020-08-06 14:14:15
// 明天秒级时间戳
carbon.Tomorrow().Timestamp() // 1596690855
// 明天毫秒级时间戳
@@ -186,6 +201,7 @@ carbon.CreateFromTimeNano(13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:
```go
carbon.Parse("").ToDateTimeString() // 空字符串
carbon.Parse("0").ToDateTimeString() // 空字符串
+carbon.Parse("xxx").ToDateTimeString() // 空字符串
carbon.Parse("00:00:00").ToDateTimeString() // 空字符串
carbon.Parse("0000-00-00").ToDateTimeString() // 空字符串
carbon.Parse("0000-00-00 00:00:00").ToDateTimeString() // 空字符串
@@ -230,6 +246,22 @@ carbon.Parse("20200805131415.999999999+08:00").ToString() // 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
+```
+
+##### 通过自定义 `布局模板` 将时间字符串解析成 `Carbon` 实例
+
+```go
+carbon.ParseWithLayouts("2020|08|05 13|14|15", []string{"2006|01|02 15|04|05", "2006|1|2 3|4|5"}).ToDateTimeString() // 2020-08-05 13:14:15
+carbon.ParseWithLayouts("2020|08|05 13|14|15", []string{"2006|01|02 15|04|05", "2006|1|2 3|4|5"}).CurrentLayout() // 2006|01|02 15|04|05
+```
+
##### 通过 `格式模板` 将时间字符串解析成 `Carbon` 实例
> 如果使用的字母与格式模板冲突时,请使用转义符转义该字母
@@ -241,13 +273,31 @@ carbon.ParseByFormat("今天是 2020年08月05日13时14分15秒", "今天是 Y
carbon.ParseByFormat("2020-08-05 13:14:15", "Y-m-d H:i:s", carbon.Tokyo).ToDateTimeString() // 2020-08-05 14:14:15
```
-##### 通过 `布局模板` 将时间字符串解析成 `Carbon` 实例
+##### 通过自定义 `格式模板` 将时间字符串解析成 `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
+carbon.ParseWithFormats("2020|08|05 13|14|15", []string{"Y|m|d H|i|s", "y|m|d h|i|s"}).ToDateTimeString() // 2020-08-05 13:14:15
+carbon.ParseWithFormats("2020|08|05 13|14|15", []string{"Y|m|d H|i|s", "y|m|d h|i|s"}).CurrentLayout() // 2006|01|02 15|04|05
+```
+
+##### 时间冻结
+
+```go
+now := carbon.Parse("2020-08-05")
+carbon.SetTestNow(now)
+
+carbon.IsTestNow() // true
+carbon.Now().ToDateString() // 2020-08-05
+carbon.Yesterday().ToDateString() // 2020-08-04
+carbon.Tomorrow().ToDateString() // 2020-08-05
+carbon.Now().DiffForHumans() // just now
+carbon.Yesterday().DiffForHumans() // 1 day ago
+carbon.Tomorrow().DiffForHumans() // 1 day from now
+carbon.Parse("2020-10-05").DiffForHumans() // 2 months from now
+now.DiffForHumans(carbon.Parse("2020-10-05")) // 2 months before
+
+carbon.CleanTestNow()
+carbon.IsTestNow() // false
```
##### 时间边界
@@ -482,11 +532,11 @@ carbon.Parse("2020-08-05 13:14:15.222222222").SubMicrosecond().ToString() // 202
// 三纳秒后
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").AddNanosecond().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").SubNanoseconds(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
+carbon.Parse("2020-08-05 13:14:15.222222222").SubNanosecond().ToString() // 2020-08-05 13:14:15.222222221 +0800 CST
```
##### 时间差值
@@ -587,28 +637,41 @@ 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
+// 是否有错误
+carbon.Parse("0001-01-01 00:00:00 +0000 UTC").HasError() // false
+carbon.NewCarbon().HasError() // false
+carbon.Parse("").HasError() // false
+carbon.Parse("0").HasError() // true
+carbon.Parse("xxx").HasError() // true
+carbon.Parse("2020-08-05").IsNil() // false
+
+// 是否是 nil 时间
+carbon.Parse("0001-01-01 00:00:00 +0000 UTC").IsNil() // false
+carbon.NewCarbon().IsNil() // false
+carbon.Parse("").IsNil() // true
+carbon.Parse("0").IsNil() // false
+carbon.Parse("xxx").IsNil() // false
+carbon.Parse("2020-08-05").IsNil() // false
// 是否是零值时间(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("0001-01-01 00:00:00 +0000 UTC").IsZero() // true
+carbon.NewCarbon().IsZero() // true
+carbon.Parse("").IsZero() // false
+carbon.Parse("0").IsZero() // false
+carbon.Parse("xxx").IsZero() // false
+carbon.Parse("0000-00-00 00:00:00").IsZero() // false
+carbon.Parse("0000-00-00").IsZero() // false
+carbon.Parse("00:00:00").IsZero() // false
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("0001-01-01 00:00:00 +0000 UTC").IsValid() // true
+carbon.NewCarbon().IsValid() // true
carbon.Parse("").IsValid() // false
carbon.Parse("0").IsValid() // false
+carbon.Parse("xxx").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
@@ -617,8 +680,11 @@ carbon.Parse("2020-08-05").IsValid() // true
carbon.Parse("2020-08-05").SetTimezone("xxx").IsValid() // false
// 是否是无效时间
+carbon.Parse("0001-01-01 00:00:00 +0000 UTC").IsValid() // false
+carbon.NewCarbon().IsValid() // false
carbon.Parse("").IsInvalid() // true
carbon.Parse("0").IsInvalid() // true
+carbon.Parse("xxx").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
@@ -626,6 +692,16 @@ 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("").IsDST() // false
+carbon.Parse("0").IsDST() // false
+carbon.Parse("xxx").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
+
// 是否是上午
carbon.Parse("2020-08-05 00:00:00").IsAM() // true
carbon.Parse("2020-08-05 08:00:00").IsAM() // true
@@ -794,15 +870,17 @@ carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-04
```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
+carbon.Parse("2020-08-05 13:14:15").SetTimezone(carbon.UTC).ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-08-05 13:14:15").SetTimezone(carbon.PRC).ToString() // 2020-08-05 21:14:15 +0800 CST
+carbon.Parse("2020-08-05 13:14:15").SetTimezone(carbon.Tokyo).ToString() // 2020-08-05 22:14:15 +0900 JST
-// 设置地区
+// 设置位置
utc, _ := time.LoadLocation(carbon.UTC)
-carbon.SetLocation(utc).Now().ToDateTimeString() // 2022-06-28 09:25:38
+carbon.Parse("2020-08-05 13:14:15").SetLocation(utc).ToString() // 2020-08-05 13:14:15 +0000 UTC
+prc, _ := time.LoadLocation(carbon.PRC)
+carbon.Parse("2020-08-05 13:14:15").SetLocation(prc).ToString() // 2020-08-05 21:14:15 +0800 CST
tokyo, _ := time.LoadLocation(carbon.Tokyo)
-carbon.SetLocation(tokyo).Now().ToDateTimeString() // 2022-06-28 18:25:38
+carbon.Parse("2020-08-05 13:14:15").SetLocation(tokyo).ToString() // 2020-08-05 22:14:15 +0900 JST
// 设置区域
carbon.Parse("2020-07-05 13:14:15").SetLocale("en").DiffForHumans() // 1 month ago
@@ -979,32 +1057,40 @@ 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).Timezone() // PRC
+carbon.SetTimezone(carbon.Tokyo).Timezone() // Asia/Tokyo
-// 获取位置
-carbon.SetTimezone(carbon.PRC).Location() // PRC
-carbon.SetTimezone(carbon.Tokyo).Location() // Asia/Tokyo
+// 获取时区名称
+carbon.SetTimezone(carbon.PRC).ZoneName() // CST
+carbon.SetTimezone(carbon.Tokyo).ZoneName() // JST
-// 获取距离UTC时区的偏移量,单位秒
-carbon.SetTimezone(carbon.PRC).Offset() // 28800
-carbon.SetTimezone(carbon.Tokyo).Offset() // 32400
+// 获取时区偏移量,单位秒
+carbon.SetTimezone(carbon.PRC).ZoneOffset() // 28800
+carbon.SetTimezone(carbon.Tokyo).ZoneOffset() // 32400
// 获取当前区域
-carbon.Now().Locale() // en
-carbon.Now().SetLocale("zh-CN").Locale() // zh-CN
+carbon.Now().Locale() // zh-CN
+carbon.Now().SetLocale("en").Locale() // en
// 获取当前星座
-carbon.Now().Constellation() // Leo
+carbon.Now().Constellation() // 狮子座
carbon.Now().SetLocale("en").Constellation() // Leo
carbon.Now().SetLocale("zh-CN").Constellation() // 狮子座
// 获取当前季节
-carbon.Now().Season() // Summer
+carbon.Now().Season() // 夏季
carbon.Now().SetLocale("en").Season() // Summer
carbon.Now().SetLocale("zh-CN").Season() // 夏季
+// 获取一周的开始日期
+carbon.SetWeekStartsAt(carbon.Sunday).WeekStartsAt() // Sunday
+carbon.SetWeekStartsAt(carbon.Monday).WeekStartsAt() // Monday
+
+// 获取当前布局模板
+carbon.Parse("now").CurrentLayout() // "2006-01-02 15:04:05"
+carbon.ParseByLayout("2020-08-05", DateLayout).CurrentLayout() // "2006-01-02"
+
// 获取年龄
carbon.Parse("2002-01-01 13:14:15").Age() // 17
carbon.Parse("2002-12-31 13:14:15").Age() // 18
@@ -1118,7 +1204,7 @@ carbon.Parse("2020-08-05 13:14:15").ToRfc1123zString() // Wed, 05 Aug 2020 13:14
// 输出 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
+carbon.Parse("2020-08-05 13:14:15").ToRfc7231String() // Wed, 05 Aug 2020 13:14:15 CST
// 输出 RFC3339 格式字符串
carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339String() // 2020-08-05T13:14:15+08:00
@@ -1159,7 +1245,7 @@ carbon.Parse("2020-08-05 13:14:15").Format("\\I\\t \\i\\s Y-m-d H:i:s") // It is
```go
// 获取星座
-carbon.Parse("2020-08-05 13:14:15").Constellation() // Leo
+carbon.Parse("2020-08-05 13:14:15").Constellation() // 狮子座
// 是否是白羊座
carbon.Parse("2020-08-05 13:14:15").IsAries() // false
@@ -1193,7 +1279,7 @@ carbon.Parse("2020-08-05 13:14:15").IsPisces() // false
```go
// 获取季节
-carbon.Parse("2020-08-05 13:14:15").Season() // Summer
+carbon.Parse("2020-08-05 13:14:15").Season() // 夏季
// 本季节开始时间
carbon.Parse("2020-08-05 13:14:15").StartOfSeason().ToDateTimeString() // 2020-06-01 00:00:00
@@ -1211,111 +1297,95 @@ 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"`
+type User struct {
+ Date carbon.FormatType[carbon.Date] `json:"date"`
+ Time carbon.LayoutType[carbon.Time] `json:"time"`
+ DateTime carbon.LayoutType[carbon.DateTime] `json:"date_time"`
+ Timestamp carbon.TimestampType[carbon.Timestamp] `json:"timestamp"`
+ TimestampMilli carbon.TimestampType[carbon.TimestampMilli] `json:"timestamp_milli"`
+ TimestampMicro carbon.TimestampType[carbon.TimestampMicro] `json:"timestamp_micro"`
+ TimestampNano carbon.TimestampType[carbon.TimestampNano] `json:"timestamp_nano"`
}
-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()),
-}
+var user User
-data, err := json.Marshal(&person)
+c := carbon.Parse("2020-08-05 13:14:15")
+user.Date = carbon.NewFormatType[carbon.Date](c)
+user.Time = carbon.NewLayoutType[carbon.Time](c)
+user.DateTime = carbon.NewLayoutType[carbon.DateTime](c)
+user.Timestamp = carbon.NewTimestampType[carbon.Timestamp](c)
+user.TimestampMilli = carbon.NewTimestampType[carbon.TimestampMilli](c)
+user.TimestampMicro = carbon.NewTimestampType[carbon.TimestampMicro](c)
+user.TimestampNano = carbon.NewTimestampType[carbon.TimestampNano](c)
+
+data, err := json.Marshal(&user)
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
-}
+{"date":"2020-08-05","time":"13:14:15","date_time":"2020-08-05 13:14:15","timestamp":1596633255,"timestamp_milli":1596633255000,"timestamp_micro":1596633255000000,"timestamp_nano":1596671999999999999}
-err := json.Unmarshal([]byte(data), &person)
+var person User
+err := json.Unmarshal(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
+fmt.Printf("%+v", person)
+// 输出
+{Date:2020-08-05 Time:13:14:15 DateTime:2020-08-05 13:14:15 Timestamp:1596633255 TimestampMilli:1596633255000 TimestampMicro:1596633255000000 TimestampNano:1596671999999999999}
+```
-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
+```go
+type RFC3339Layout string
+func (t CustomerLayout) SetLayout() string {
+ return carbon.RFC3339Layout
+}
-person.CreatedAt1.String() // "1596604455"
-person.CreatedAt2.String() // "1596604455999"
-person.CreatedAt3.String() // "1596604455999999"
-person.CreatedAt4.String() // "1596604455999999999"
+type ISO8601Format string
+func (t CustomerFormat) SetFormat() string {
+ return carbon.ISO8601Format
+}
-person.CreatedAt1.Int64() // 1596604455
-person.CreatedAt2.Int64() // 1596604455999
-person.CreatedAt3.Int64() // 1596604455999999
-person.CreatedAt4.Int64() // 1596604455999999999
+type User struct {
+ Customer1 carbon.LayoutType[RFC3339Layout] `json:"customer1"`
+ Customer2 carbon.FormatType[ISO8601Format] `json:"customer2"`
+}
+
+var user User
+
+c := carbon.Parse("2020-08-05 13:14:15")
+user.Customer1 = carbon.NewLayoutType[RFC3339Layout](c)
+user.Customer2 = carbon.NewFormatType[ISO8601Format](c)
+
+data, err := json.Marshal(&user)
+if err != nil {
+ // 错误处理
+ log.Fatal(err)
+}
+fmt.Printf("%s", data)
+// 输出
+{"customer1":"2020-08-05T13:14:15Z","customer2":"2020-08-05T13:14:15+00:00"}
+
+var person User
+err := json.Unmarshal(data, &person)
+if err != nil {
+ // 错误处理
+ log.Fatal(err)
+}
+
+fmt.Printf("%+v", person)
+// 输出
+{Customer1:2020-08-05T13:14:15Z Customer2:2020-08-05T13:14:15+00:00}
```
##### 日历
@@ -1354,9 +1424,10 @@ person.CreatedAt4.Int64() // 1596604455999999999
* [印地语(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") 翻译
+* [阿拉伯语(ar)](./lang/bg.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") 翻译
+* [挪威语(nb)](./lang/nb.json "挪威语"): 由 [bendikrb](https://github.com/bendikrb "bendikrb") 翻译
目前支持的方法有
@@ -1452,30 +1523,11 @@ 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 {
+c := carbon.Parse("2020-08-05").SetTimezone("xxx")
+if c.HasError() {
// 错误处理
log.Fatal(c.Error)
}
@@ -1487,53 +1539,52 @@ invalid timezone "xxx", please see the file "$GOROOT/lib/time/zoneinfo.zip" for
##### 格式化符号表
-| 符号 | 描述 | 长度 | 范围 | 示例 |
-| :------------: | :------------: |:--------------:|:----------------:| :------------: |
-| 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 |
+| 符号 | 描述 | 长度 | 范围 | 示例 |
+|:--:|:--------------------------:|:--:|:----------------:|:-------------------:|
+| 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 |
+| x | 微秒 | - | 1-999999 | 999999 |
+| z | 纳秒 | - | 1-999999999 | 999999999 |
+| w | 数字表示的周几 | 1 | 0-6 | 1 |
+| t | 月份中的总天数 | 2 | 28-31 | 31 |
+| 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)
+> 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 版本。
+> v2 版本是用 `golang1.16` 后内置标准库 [embed](https://pkg.go.dev/embed) 实现的。如果你的 go 版本大于 1.16推荐使用 v2 版本,否则必须使用 v1 版本。
2、window 系统下部署二进制文件时区报错
diff --git a/vendor/github.com/dromara/carbon/v2/README.jp.md b/vendor/github.com/dromara/carbon/v2/README.jp.md
index 9300c1ad..9d1d3342 100644
--- a/vendor/github.com/dromara/carbon/v2/README.jp.md
+++ b/vendor/github.com/dromara/carbon/v2/README.jp.md
@@ -11,7 +11,7 @@
#### イントロ
-シンプルでセマンティックで開発者に優しい golang 時間処理ライブラリ
+軽量、セマンティック、開発者に優しい `golang` 時間処理ライブラリ
Carbon は [awesome-go](https://github.com/avelino/awesome-go#date-and-time "awesome-go") に含まれています
@@ -25,7 +25,7 @@ Carbon は [awesome-go](https://github.com/avelino/awesome-go#date-and-time "awe
#### インストール
-##### go version >= 1.17
+##### go version >= 1.18
```go
// github から使う
@@ -49,25 +49,36 @@ go mod edit -replace github.com/golang-module/carbon/v2=github.com/dromara/carbo
#### 使い方と例
-> 現在時刻が 2020-08-05 13:14:15.999999999 +0800 CST であると仮定します。
+> 現在時刻が 2020-08-05 13:14:15.999999999 +0900 JST であると仮定します。
##### グローバルのデフォルト値設定
```go
+carbon.SetLayout(carbon.DateTimeLayout)
+carbon.SetTimezone(carbon.Japan)
+carbon.SetWeekStartsAt(carbon.Sunday)
+carbon.SetLocale("jp")
+
+または
+
carbon.SetDefault(carbon.Default{
Layout: carbon.DateTimeLayout,
Timezone: carbon.Japan,
WeekStartsAt: carbon.Sunday,
- Locale: "jp", // 値の範囲: langディレクトリ下の翻訳ファイル名でファイル拡張子は含まない
+ Locale: "jp",
})
```
->エントリファイル(` main.go `など)に設定することをお勧めします
-
##### Carbon と time.Time 間の変換
```go
// time.Time を Carbon に変換
+carbon.NewCarbon(time.Now())
+// Carbon を time.Time に変換
+carbon.Now().StdTime()
+
+または
+// time.Time を Carbon に変換
carbon.CreateFromStdTime(time.Now())
// Carbon を time.Time に変換
carbon.Now().StdTime()
@@ -79,27 +90,27 @@ carbon.Now().StdTime()
// 現在時刻
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().ToString() // 2020-08-05 13:14:15.999999999 +0900 JST
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(carbon.NewYork).ToDateTimeString() // 2020-08-05 14:14:15
// 現在の秒タイムスタンプ
-carbon.Now().Timestamp() // 1596604455
+carbon.Now().Timestamp() // 1596600855
// 現在のミリ秒タイムスタンプ
-carbon.Now().TimestampMilli() // 1596604455999
+carbon.Now().TimestampMilli() // 1596600855999
// 現在のマイクロ秒タイムスタンプ
-carbon.Now().TimestampMicro() // 1596604455999999
+carbon.Now().TimestampMicro() // 1596600855999999
// 現在のナノ秒タイムスタンプ
-carbon.Now().TimestampNano() // 1596604455999999999
+carbon.Now().TimestampNano() // 1596600855999999999
// 昨日の現在時刻
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().ToString() // 2020-08-04 13:14:15.999999999 +0900 JST
carbon.Yesterday().ToDateTimeString() // 2020-08-04 13:14:15
// 昨日の日付
carbon.Yesterday().ToDateString() // 2020-08-04
@@ -108,20 +119,20 @@ 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(carbon.NewYork).ToDateTimeString() // 2020-08-04 14:14:15
// 昨日の秒タイムスタンプ
-carbon.Yesterday().Timestamp() // 1596518055
+carbon.Yesterday().Timestamp() // 1596514455
// 昨日のミリ秒タイムスタンプ
-carbon.Yesterday().TimestampMilli() // 1596518055999
+carbon.Yesterday().TimestampMilli() // 1596514455999
// 昨日のマイクロ秒タイムスタンプ
-carbon.Yesterday().TimestampMicro() // 1596518055999999
+carbon.Yesterday().TimestampMicro() // 1596514455999999
// 昨日のナノ秒タイムスタンプ
-carbon.Yesterday().TimestampNano() // 1596518055999999999
+carbon.Yesterday().TimestampNano() // 1596514455999999999
// 明日の現在時刻
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().ToString() // 2020-08-06 13:14:15.999999999 +0900 JST
carbon.Tomorrow().ToDateTimeString() // 2020-08-06 13:14:15
// 明日の日付
carbon.Tomorrow().ToDateString() // 2020-08-06
@@ -130,58 +141,58 @@ 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(carbon.NewYork).ToDateTimeString() // 2020-08-06 14:14:15
// 明日の秒タイムスタンプ
-carbon.Tomorrow().Timestamp() // 1596690855
+carbon.Tomorrow().Timestamp() // 1596687255
// 明日のミリ秒タイムスタンプ
-carbon.Tomorrow().TimestampMilli() // 1596690855999
+carbon.Tomorrow().TimestampMilli() // 1596687255999
// 明日のマイクロ秒タイムスタンプ
-carbon.Tomorrow().TimestampMicro() // 1596690855999999
+carbon.Tomorrow().TimestampMicro() // 1596687255999999
// 明日のナノ秒タイムスタンプ
-carbon.Tomorrow().TimestampNano() // 1596690855999999999
+carbon.Tomorrow().TimestampNano() // 1596687255999999999
```
##### 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.CreateFromTimestamp(-1).ToString() // 1970-01-01 08:59:59 +0900 JST
+carbon.CreateFromTimestamp(0).ToString() // 1970-01-01 09:00:00 +0900 JST
+carbon.CreateFromTimestamp(1).ToString() // 1970-01-01 09:00:01 +0900 JST
+carbon.CreateFromTimestamp(1649735755).ToString() // 2022-04-12 12:55:55 +0900 JST
// ミリ秒のタイムスタンプから Carbon インスタンスを作成します
-carbon.CreateFromTimestampMilli(1649735755981).ToString() // 2022-04-12 11:55:55.981 +0800 CST
+carbon.CreateFromTimestampMilli(1649735755981).ToString() // 2022-04-12 12:55:55.981 +0900 JST
// マイクロ秒タイムスタンプから Carbon インスタンスを作成します
-carbon.CreateFromTimestampMicro(1649735755981566).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
+carbon.CreateFromTimestampMicro(1649735755981566).ToString() // 2022-04-12 12:55:55.981566 +0900 JST
// ナノタイムスタンプから Carbon インスタンスを作成します
-carbon.CreateFromTimestampNano(1649735755981566000).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
+carbon.CreateFromTimestampNano(1649735755981566000).ToString() // 2022-04-12 12:55:55.981566 +0900 JST
// 日付と時間から 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.CreateFromDateTimeMilli(2020, 1, 1, 13, 14, 15, 999).ToString() // 2020-01-01 13:14:15.999 +0900 JST
// 日付と時間、マイクロ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateTimeMicro(2020, 1, 1, 13, 14, 15, 999999).ToString() // 2020-01-01 13:14:15.999999 +0800 CST
+carbon.CreateFromDateTimeMicro(2020, 1, 1, 13, 14, 15, 999999).ToString() // 2020-01-01 13:14:15.999999 +0900 JST
// 日付と時間、ナノ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateTimeNano(2020, 1, 1, 13, 14, 15, 999999999).ToString() // 2020-01-01 13:14:15.999999999 +0800 CST
+carbon.CreateFromDateTimeNano(2020, 1, 1, 13, 14, 15, 999999999).ToString() // 2020-01-01 13:14:15.999999999 +0900 JST
// 日付から Carbon インスタンスを作成します
-carbon.CreateFromDate(2020, 8, 5).ToString() // 2020-08-05 00:00:00 +0800 CST
+carbon.CreateFromDate(2020, 8, 5).ToString() // 2020-08-05 00:00:00 +0900 JST
// 日付とミリ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateMilli(2020, 8, 5, 999).ToString() // 2020-08-05 00:00:00.999 +0800 CST
+carbon.CreateFromDateMilli(2020, 8, 5, 999).ToString() // 2020-08-05 00:00:00.999 +0900 JST
// 日付とマイクロ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateMicro(2020, 8, 5, 999999).ToString() // 2020-08-05 00:00:00.999999 +0800 CST
+carbon.CreateFromDateMicro(2020, 8, 5, 999999).ToString() // 2020-08-05 00:00:00.999999 +0900 JST
// 日付とナノ秒から Carbon インスタンスを作成します
-carbon.CreateFromDateNano(2020, 8, 5, 999999999).ToString() // 2020-08-05 00:00:00.999999999 +0800 CST
+carbon.CreateFromDateNano(2020, 8, 5, 999999999).ToString() // 2020-08-05 00:00:00.999999999 +0900 JST
// 時間から Carbon インスタンスを作成します(日付のデフォルトは現在の年月日です)
-carbon.CreateFromTime(13, 14, 15).ToString() // 2020-08-05 13:14:15 +0800 CST
+carbon.CreateFromTime(13, 14, 15).ToString() // 2020-08-05 13:14:15 +0900 JST
// 時間、ミリ秒から Carbon インスタンスを作成します(年月日のデフォルトは現在の年月日です)
-carbon.CreateFromTimeMilli(13, 14, 15, 999).ToString() // 2020-08-05 13:14:15.999 +0800 CST
+carbon.CreateFromTimeMilli(13, 14, 15, 999).ToString() // 2020-08-05 13:14:15.999 +0900 JST
// 時間、マイクロ秒から Carbon インスタンスを作成します(年月日のデフォルトは現在の年月日です)
-carbon.CreateFromTimeMicro(13, 14, 15, 999999).ToString() // 2020-08-05 13:14:15.999999 +0800 CST
+carbon.CreateFromTimeMicro(13, 14, 15, 999999).ToString() // 2020-08-05 13:14:15.999999 +0900 JST
// 時間、ナノ秒から Carbon インスタンスを作成します(年月日のデフォルトは現在の年月日です)
-carbon.CreateFromTimeNano(13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
+carbon.CreateFromTimeNano(13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:15.999999999 +0900 JST
```
##### 時間文字列を Carbon インスタンスにパース
@@ -189,50 +200,67 @@ carbon.CreateFromTimeNano(13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:
```go
carbon.Parse("").ToDateTimeString() // 空の文字列
carbon.Parse("0").ToDateTimeString() // 空の文字列
+carbon.Parse("xxx").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("now").ToString() // 2020-08-05 13:14:15 +0900 JST
+carbon.Parse("yesterday").ToString() // 2020-08-04 13:14:15 +0900 JST
+carbon.Parse("tomorrow").ToString() // 2020-08-06 13:14:15 +0900 JST
-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").ToString() // 2020-01-01 00:00:00 +0900 JST
+carbon.Parse("2020-8").ToString() // 2020-08-01 00:00:00 +0900 JST
+carbon.Parse("2020-08").ToString() // 2020-08-01 00:00:00 +0900 JST
+carbon.Parse("2020-8-5").ToString() // 2020-08-05 00:00:00 +0900 JST
+carbon.Parse("2020-8-05").ToString() // 2020-08-05 00:00:00 +0900 JST
+carbon.Parse("2020-08-05").ToString() // 2020-08-05 00:00:00 +0900 JST
+carbon.Parse("2020-08-05.999").ToString() // 2020-08-05 00:00:00.999 +0900 JST
+carbon.Parse("2020-08-05.999999").ToString() // 2020-08-05 00:00:00.999999 +0900 JST
+carbon.Parse("2020-08-05.999999999").ToString() // 2020-08-05 00:00:00.999999999 +0900 JST
-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-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0900 JST
+carbon.Parse("2020-8-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0900 JST
+carbon.Parse("2020-08-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0900 JST
+carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0900 JST
+carbon.Parse("2020-08-05 13:14:15.999").ToString() // 2020-08-05 13:14:15.999 +0900 JST
+carbon.Parse("2020-08-05 13:14:15.999999").ToString() // 2020-08-05 13:14:15.999999 +0900 JST
+carbon.Parse("2020-08-05 13:14:15.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0900 JST
-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("2020-8-5T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0900 JST
+carbon.Parse("2020-8-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0900 JST
+carbon.Parse("2020-08-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0900 JST
+carbon.Parse("2020-08-05T13:14:15.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0900 JST
+carbon.Parse("2020-08-05T13:14:15.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0900 JST
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0900 JST
-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.Parse("20200805").ToString() // 2020-08-05 00:00:00 +0900 JST
+carbon.Parse("20200805131415").ToString() // 2020-08-05 13:14:15 +0900 JST
+carbon.Parse("20200805131415.999").ToString() // 2020-08-05 13:14:15.999 +0900 JST
+carbon.Parse("20200805131415.999999").ToString() // 2020-08-05 13:14:15.999999 +0900 JST
+carbon.Parse("20200805131415.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0900 JST
+carbon.Parse("20200805131415.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0900 JST
+carbon.Parse("20200805131415.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0900 JST
+carbon.Parse("20200805131415.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0900 JST
```
-##### フォーマットして文字列を Carbon インスタンスにパース
+##### レイアウトし、文字列を `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
+```
+
+##### カスタムレイアウトテンプレートを使用して、時間文字列を `Carbon` インスタンスに解析します
+
+```go
+carbon.ParseWithLayouts("2020|08|05 13|14|15", []string{"2006|01|02 15|04|05", "2006|1|2 3|4|5"}).ToDateTimeString() // 2020-08-05 13:14:15
+carbon.ParseWithLayouts("2020|08|05 13|14|15", []string{"2006|01|02 15|04|05", "2006|1|2 3|4|5"}).CurrentLayout() // 2006|01|02 15|04|05
+```
+
+##### フォーマットして文字列を `Carbon` インスタンスにパース
```go
carbon.ParseByFormat("2020|08|05 13|14|15", "Y|m|d H|i|s").ToDateTimeString() // 2020-08-05 13:14:15
@@ -240,13 +268,31 @@ carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").T
carbon.ParseByFormat("今天是 2020年08月05日13时14分15秒", "今天是 Y年m月d日H时i分s秒").ToDateTimeString() // 2020-08-05 13:14:15
```
-##### レイアウトし、文字列を Carbon インスタンスにパース
+##### カスタムフォーマットテンプレートを使用して、時間文字列を `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
+carbon.ParseWithFormats("2020|08|05 13|14|15", []string{"Y|m|d H|i|s", "y|m|d h|i|s"}).ToDateTimeString() // 2020-08-05 13:14:15
+carbon.ParseWithFormats("2020|08|05 13|14|15", []string{"Y|m|d H|i|s", "y|m|d h|i|s"}).CurrentLayout() // 2006|01|02 15|04|05
+```
+
+##### 時間凍結
+
+```go
+now := carbon.Parse("2020-08-05")
+carbon.SetTestNow(now)
+
+carbon.IsTestNow() // true
+carbon.Now().ToDateString() // 2020-08-05
+carbon.Yesterday().ToDateString() // 2020-08-04
+carbon.Tomorrow().ToDateString() // 2020-08-05
+carbon.Now().DiffForHumans() // just now
+carbon.Yesterday().DiffForHumans() // 1 day ago
+carbon.Tomorrow().DiffForHumans() // 1 day from now
+carbon.Parse("2020-10-05").DiffForHumans() // 2 months from now
+now.DiffForHumans(carbon.Parse("2020-10-05")) // 2 months before
+
+carbon.CleanTestNow()
+carbon.IsTestNow() // false
```
##### 境界
@@ -306,9 +352,9 @@ carbon.Parse("2020-08-05 13:14:15").StartOfMinute().ToDateTimeString() // 2020-0
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").StartOfSecond().ToString() // 2020-08-05 13:14:15 +0900 JST
// 秒終わり
-carbon.Parse("2020-08-05 13:14:15").EndOfSecond().ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
+carbon.Parse("2020-08-05 13:14:15").EndOfSecond().ToString() // 2020-08-05 13:14:15.999999999 +0900 JST
```
##### 大きな時間更新
@@ -354,7 +400,7 @@ carbon.Parse("2020-02-29 13:14:15").AddYears(3).ToDateTimeString() // 2023-03-01
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年追加追加(オーバーフローなし)
+// 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
@@ -461,31 +507,31 @@ carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5s").ToDateTimeString() // 20
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
+carbon.Parse("2020-08-05 13:14:15.222222222").AddMilliseconds(3).ToString() // 2020-08-05 13:14:15.225222222 +0900 JST
// 1ミリ秒追加
-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").AddMillisecond().ToString() // 2020-08-05 13:14:15.223222222 +0900 JST
// 3ミリ秒減らす
-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").SubMilliseconds(3).ToString() // 2020-08-05 13:14:15.219222222 +0900 JST
// 1ミリ秒減らす
-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").SubMillisecond().ToString() // 2020-08-05 13:14:15.221222222 +0900 JST
// 3マイクロ秒追加
-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").AddMicroseconds(3).ToString() // 2020-08-05 13:14:15.222225222 +0900 JST
// 1マイクロ秒追加
-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").AddMicrosecond().ToString() // 2020-08-05 13:14:15.222223222 +0900 JST
// 3マイクロ秒減らす
-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").SubMicroseconds(3).ToString() // 2020-08-05 13:14:15.222219222 +0900 JST
// 1マイクロ秒減らす
-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").SubMicrosecond().ToString() // 2020-08-05 13:14:15.222221222 +0900 JST
// 3ナノ秒追加
-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").AddNanoseconds(3).ToString() // 2020-08-05 13:14:15.222222225 +0900 JST
// 1ナノ秒追加
-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").AddNanosecond().ToString() // 2020-08-05 13:14:15.222222223 +0900 JST
// 3ナノ秒減らす
-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").SubNanoseconds(3).ToString() // 2020-08-05 13:14:15.222222219 +0900 JST
// 1ナノ秒減らす
-carbon.Parse("2020-08-05 13:14:15.222222222").SubNanossecond().ToString() // 2020-08-05 13:14:15.222222221 +0800 CST
+carbon.Parse("2020-08-05 13:14:15.222222222").SubNanosecond().ToString() // 2020-08-05 13:14:15.222222221 +0900 JST
```
##### 時間差分
@@ -558,7 +604,7 @@ 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")
@@ -578,36 +624,49 @@ carbon.Max(yesterday, today, tomorrow) // tomorrow
carbon.Min(yesterday, today, tomorrow) // yesterday
// Carbonの最大値を戻す
-carbon.MaxCarbon().ToString() // 9999-12-31 23:59:59.999999999 +0000 UTC
+carbon.MaxCarbon().ToString() // 9999-12-31 23:59:59.999999999 +0900 JST
// Carbonの最小値を戻す
-carbon.MinCarbon().ToString() // -9998-01-01 00:00:00 +0000 UTC
+carbon.MinCarbon().ToString() // -9998-01-01 00:00:00 +0900 JST
```
-##### 比較
+##### 時間比較
```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
+// エラーがありますか
+carbon.Parse("0001-01-01 00:00:00 +0000 UTC").HasError() // false
+carbon.NewCarbon().HasError() // false
+carbon.Parse("").HasError() // false
+carbon.Parse("0").HasError() // true
+carbon.Parse("xxx").HasError() // true
+carbon.Parse("2020-08-05").IsNil() // false
+
+// nil 時間かどうか
+carbon.Parse("0001-01-01 00:00:00 +0000 UTC").IsNil() // false
+carbon.NewCarbon().IsNil() // false
+carbon.Parse("").IsNil() // true
+carbon.Parse("0").IsNil() // false
+carbon.Parse("xxx").IsNil() // false
+carbon.NewCarbon().IsNil() // false
// ゼロ値の時間かどうか(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("0001-01-01 00:00:00 +0000 UTC").IsZero() // true
+carbon.NewCarbon().IsZero() // true
+carbon.Parse("").IsZero() // false
+carbon.Parse("0").IsZero() // false
+carbon.Parse("xxx").IsZero() // false
+carbon.Parse("0000-00-00 00:00:00").IsZero() // false
+carbon.Parse("0000-00-00").IsZero() // false
+carbon.Parse("00:00:00").IsZero() // false
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("0001-01-01 00:00:00 +0000 UTC").IsValid() // true
+carbon.NewCarbon().IsValid() // true
carbon.Parse("").IsValid() // false
carbon.Parse("0").IsValid() // false
+carbon.Parse("xxx").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
@@ -616,8 +675,11 @@ carbon.Parse("2020-08-05").IsValid() // true
carbon.Parse("2020-08-05").SetTimezone("xxx").IsValid() // false
// 無効な時間かどうか
+carbon.Parse("0001-01-01 00:00:00 +0000 UTC").IsValid() // false
+carbon.NewCarbon().IsValid() // false
carbon.Parse("").IsInvalid() // true
carbon.Parse("0").IsInvalid() // true
+carbon.Parse("xxx").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
@@ -625,6 +687,16 @@ 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("").IsDST() // false
+carbon.Parse("0").IsDST() // false
+carbon.Parse("xxx").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
+
// 午前かどうか
carbon.Parse("2020-08-05 00:00:00").IsAM() // true
carbon.Parse("2020-08-05 08:00:00").IsAM() // true
@@ -789,62 +861,64 @@ carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-04
> 長年の定義については、読んでください 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
+carbon.Parse("2020-08-05 13:14:15").SetTimezone(carbon.UTC).ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-08-05 13:14:15").SetTimezone(carbon.PRC).ToString() // 2020-08-05 21:14:15 +0800 CST
+carbon.Parse("2020-08-05 13:14:15").SetTimezone(carbon.Tokyo).ToString() // 2020-08-05 22:14:15 +0900 JST
// リージョンを設定
utc, _ := time.LoadLocation(carbon.UTC)
-carbon.SetLocation(utc).Now().ToDateTimeString() // 2022-06-28 09:25:38
+carbon.Parse("2020-08-05 13:14:15").SetLocation(utc).ToString() // 2020-08-05 13:14:15 +0000 UTC
+prc, _ := time.LoadLocation(carbon.PRC)
+carbon.Parse("2020-08-05 13:14:15").SetLocation(prc).ToString() // 2020-08-05 21:14:15 +0800 CST
tokyo, _ := time.LoadLocation(carbon.Tokyo)
-carbon.SetLocation(tokyo).Now().ToDateTimeString() // 2022-06-28 18:25:38
+carbon.Parse("2020-08-05 13:14:15").SetLocation(tokyo).ToString() // 2020-08-05 22:14:15 +0900 JST
// ロケールを設定
carbon.Parse("2020-07-05 13:14:15").SetLocale("en").DiffForHumans()) // 1 month ago
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").SetDateTime(2019, 2, 2, 13, 14, 15).ToString() // 2019-02-02 13:14:15 +0900 JST
+carbon.Parse("2020-01-01").SetDateTime(2019, 2, 31, 13, 14, 15).ToString() // 2019-03-03 13:14:15 +0900 JST
// 年月日時分秒ミリ秒を設定する
-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").SetDateTimeMilli(2019, 2, 2, 13, 14, 15, 999).ToString() // 2019-02-02 13:14:15.999 +0900 JST
+carbon.Parse("2020-01-01").SetDateTimeMilli(2019, 2, 31, 13, 14, 15, 999).ToString() // 2019-03-03 13:14:15.999 +0900 JST
// 年月日時分秒微秒を設定する
-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").SetDateTimeMicro(2019, 2, 2, 13, 14, 15, 999999).ToString() // 2019-02-02 13:14:15.999999 +0900 JST
+carbon.Parse("2020-01-01").SetDateTimeMicro(2019, 2, 31, 13, 14, 15, 999999).ToString() // 2019-03-03 13:14:15.999999 +0900 JST
// 年月日時分秒ナノ秒を設定する
-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").SetDateTimeNano(2019, 2, 2, 13, 14, 15, 999999999).ToString() // 2019-02-02 13:14:15.999999999 +0900 JST
+carbon.Parse("2020-01-01").SetDateTimeNano(2019, 2, 31, 13, 14, 15, 999999999).ToString() // 2019-03-03 13:14:15.999999999 +0900 JST
// 年月日を設定する
-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").SetDate(2019, 2, 2).ToString() // 2019-02-02 00:00:00 +0900 JST
+carbon.Parse("2020-01-01").SetDate(2019, 2, 31).ToString() // 2019-03-03 00:00:00 +0900 JST
// 年月日ミリ秒を設定する
-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").SetDateMilli(2019, 2, 2, 999).ToString() // 2019-02-02 00:00:00.999 +0900 JST
+carbon.Parse("2020-01-01").SetDateMilli(2019, 2, 31, 999).ToString() // 2019-03-03 00:00:00.999 +0900 JST
// 年月日微秒を設定する
-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").SetDateMicro(2019, 2, 2, 999999).ToString() // 2019-02-02 00:00:00.999999 +0900 JST
+carbon.Parse("2020-01-01").SetDateMicro(2019, 2, 31, 999999).ToString() // 2019-03-03 00:00:00.999999 +0900 JST
// 年月日ナノ秒を設定する
-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").SetDateNano(2019, 2, 2, 999999999).ToString() // 2019-02-02 00:00:00.999999999 +0900 JST
+carbon.Parse("2020-01-01").SetDateNano(2019, 2, 31, 999999999).ToString() // 2019-03-03 00:00:00.999999999 +0900 JST
// 時分秒を設定する
-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").SetTime(13, 14, 15).ToString() // 2020-01-01 13:14:15 +0900 JST
+carbon.Parse("2020-01-01").SetTime(13, 14, 90).ToString() // 2020-01-01 13:15:30 +0900 JST
// 時分秒ミリ秒を設定する
-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").SetTimeMilli(13, 14, 15, 999).ToString() // 2020-01-01 13:14:15.999 +0900 JST
+carbon.Parse("2020-01-01").SetTimeMilli(13, 14, 90, 999).ToString() // 2020-01-01 13:15:30.999 +0900 JST
// 時分秒微秒を設定する
-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").SetTimeMicro(13, 14, 15, 999999).ToString() // 2020-01-01 13:14:15.999999 +0900 JST
+carbon.Parse("2020-01-01").SetTimeMicro(13, 14, 90, 999999).ToString() // 2020-01-01 13:15:30.999999 +0900 JST
// 時分秒ナノ秒を設定する
-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-01-01").SetTimeNano(13, 14, 15, 999999999).ToString() // 2020-01-01 13:14:15.999999999 +0900 JST
+carbon.Parse("2020-01-01").SetTimeNano(13, 14, 90, 999999999).ToString() // 2020-01-01 13:15:30.999999999 +0900 JST
// 年を設定する
carbon.Parse("2020-02-29").SetYear(2021).ToDateString() // 2021-03-01
@@ -889,7 +963,7 @@ carbon.Parse("2020-08-05 13:14:15").SetNanosecond(100000000).Nanosecond() // 100
carbon.Parse("2020-08-05 13:14:15").SetNanosecond(999999999).Nanosecond() // 999999999
```
-##### 取得
+##### 時間取得
```go
// 年の総日数を取得
@@ -970,46 +1044,54 @@ 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").Timestamp() // 1596600855
// ミリ秒のタイムスタンプを取得
-carbon.Parse("2020-08-05 13:14:15").TimestampMilli() // 1596604455000
+carbon.Parse("2020-08-05 13:14:15").TimestampMilli() // 1596600855000
// マイクロ秒タイムスタンプを取得
-carbon.Parse("2020-08-05 13:14:15").TimestampMicro() // 1596604455000000
+carbon.Parse("2020-08-05 13:14:15").TimestampMicro() // 1596600855000000
// ナノ秒タイムスタンプを取得
-carbon.Parse("2020-08-05 13:14:15").TimestampNano() // 1596604455000000000
+carbon.Parse("2020-08-05 13:14:15").TimestampNano() // 1596600855000000000
-// タイムゾーン名を取得
-carbon.SetTimezone(carbon.PRC).Timezone() // CST
-carbon.SetTimezone(carbon.Tokyo).Timezone() // JST
+// タイムゾーンロケーションの取得
+carbon.SetTimezone(carbon.PRC).Timezone() // PRC
+carbon.SetTimezone(carbon.Tokyo).Timezone() // Asia/Tokyo
-// ロケーション名を取得
-carbon.SetTimezone(carbon.PRC).Location() // PRC
-carbon.SetTimezone(carbon.Tokyo).Location() // Asia/Tokyo
+// タイムゾーン名の取得
+carbon.SetTimezone(carbon.PRC).ZoneName() // CST
+carbon.SetTimezone(carbon.Tokyo).ZoneName() // JST
// UTCタイムゾーンオフセットの秒を取得
-carbon.SetTimezone(carbon.PRC).Offset() // 28800
-carbon.SetTimezone(carbon.Tokyo).Offset() // 32400
+carbon.SetTimezone(carbon.PRC).ZoneOffset() // 28800
+carbon.SetTimezone(carbon.Tokyo).ZoneOffset() // 32400
// ロケール名を取得
-carbon.Now().Locale() // en
-carbon.Now().SetLocale("zh-CN").Locale() // zh-CN
+carbon.Now().Locale() // jp
+carbon.Now().SetLocale("en").Locale() // en
// 星座を取得
-carbon.Now().Constellation() // Leo
+carbon.Now().Constellation() // しし座
carbon.Now().SetLocale("en").Constellation() // Leo
carbon.Now().SetLocale("jp").Constellation() // しし座
// 季節を取得
-carbon.Now().Season() // Summer
+carbon.Now().Season() // 夏
carbon.Now().SetLocale("en").Season() // Summer
carbon.Now().SetLocale("jp").Season() // 夏
+// 週の開始日の取得
+carbon.SetWeekStartsAt(carbon.Sunday).WeekStartsAt() // Sunday
+carbon.SetWeekStartsAt(carbon.Monday).WeekStartsAt() // Monday
+
+// 現在のレイアウトテンプレートの取得
+carbon.Parse("now").CurrentLayout() // "2006-01-02 15:04:05"
+carbon.ParseByLayout("2020-08-05", DateLayout).CurrentLayout() // "2006-01-02"
+
// 年齢を取得
carbon.Parse("2002-01-01 13:14:15").Age() // 17
carbon.Parse("2002-12-31 13:14:15").Age() // 18
```
-##### 出力
+##### 時間出力
```go
// datetimeを文字列出力
@@ -1071,28 +1153,28 @@ 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
+carbon.Parse("2020-08-05 13:14:15").ToUnixDateString() // Wed Aug 5 13:14:15 JST 2020
// RubyDate フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRubyDateString() // Wed Aug 05 13:14:15 +0800 2020
+carbon.Parse("2020-08-05 13:14:15").ToRubyDateString() // Wed Aug 05 13:14:15 +0900 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
+carbon.Parse("2020-08-05 13:14:15").ToCookieString() // Wednesday, 05-Aug-2020 13:14:15 JST
// 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
+carbon.Parse("2020-08-05 13:14:15").ToRssString() // Wed, 05 Aug 2020 13:14:15 +0900
// W3C フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToW3cString() // 2020-08-05T13:14:15+08:00
+carbon.Parse("2020-08-05 13:14:15").ToW3cString() // 2020-08-05T13:14:15+09:00
// ISO8601 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601String() // 2020-08-05T13:14:15+08:00
+carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601String() // 2020-08-05T13:14:15+09:00
// ISO8601Milli フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MilliString() // 2020-08-05T13:14:15.999+08:00
+carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MilliString() // 2020-08-05T13:14:15.999+09:00
// ISO8601Micro フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MicroString() // 2020-08-05T13:14:15.999999+08:00
+carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MicroString() // 2020-08-05T13:14:15.999999+09:00
// ISO8601Nano フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601NanoString() // 2020-08-05T13:14:15.999999999+08:00
+carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601NanoString() // 2020-08-05T13:14:15.999999999+09:00
// ISO8601Zulu フォーマット文字列の出力
carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluString() // 2020-08-05T13:14:15Z
// ISO8601ZuluMilli フォーマット文字列の出力
@@ -1103,36 +1185,36 @@ carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluMicroString() // 2020
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
+carbon.Parse("2020-08-05 13:14:15").ToRfc822String() // 05 Aug 20 13:14 JST
// RFC822Z フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc822zString() // 05 Aug 20 13:14 +0800
+carbon.Parse("2020-08-05 13:14:15").ToRfc822zString() // 05 Aug 20 13:14 +0900
// RFC850 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc850String() // Wednesday, 05-Aug-20 13:14:15 CST
+carbon.Parse("2020-08-05 13:14:15").ToRfc850String() // Wednesday, 05-Aug-20 13:14:15 JST
// RFC1036 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc1036String() // Wed, 05 Aug 20 13:14:15 +0800
+carbon.Parse("2020-08-05 13:14:15").ToRfc1036String() // Wed, 05 Aug 20 13:14:15 +0900
// RFC1123 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123String() // Wed, 05 Aug 2020 13:14:15 CST
+carbon.Parse("2020-08-05 13:14:15").ToRfc1123String() // Wed, 05 Aug 2020 13:14:15 JST
// RFC1123Z フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123zString() // Wed, 05 Aug 2020 13:14:15 +0800
+carbon.Parse("2020-08-05 13:14:15").ToRfc1123zString() // Wed, 05 Aug 2020 13:14:15 +0900
// RFC2822 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc2822String() // Wed, 05 Aug 2020 13:14:15 +0800
+carbon.Parse("2020-08-05 13:14:15").ToRfc2822String() // Wed, 05 Aug 2020 13:14:15 +0900
// RFC7231 フォーマット文字列の出力
-carbon.Parse("2020-08-05 13:14:15").ToRfc7231String() // Wed, 05 Aug 2020 13:14:15 GMT
+carbon.Parse("2020-08-05 13:14:15").ToRfc7231String() // Wed, 05 Aug 2020 13:14:15 JST
// RFC3339 フォーマット文字列の出力
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339String() // 2020-08-05T13:14:15+08:00
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339String() // 2020-08-05T13:14:15+09:00
// RFC3339 フォーマット文字列の出力(ミリ秒を含む)
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MilliString() // 2020-08-05T13:14:15.999+08:00
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MilliString() // 2020-08-05T13:14:15.999+09:00
// RFC3339 フォーマット文字列の出力(マイクロ秒を含む)
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MicroString() // 2020-08-05T13:14:15.999999+08:00
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MicroString() // 2020-08-05T13:14:15.999999+09:00
// RFC3339 フォーマット文字列の出力(ナノ秒を含む)
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339NanoString() // 2020-08-05T13:14:15.999999999+08:00
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339NanoString() // 2020-08-05T13:14:15.999999999+09: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
+carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0900 JST
// "Jan 2, 2006" フォーマット文字列の出力
carbon.Parse("2020-08-05 13:14:15").ToFormattedDateString() // Aug 5, 2020
@@ -1140,7 +1222,7 @@ carbon.Parse("2020-08-05 13:14:15").ToFormattedDateString() // Aug 5, 2020
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(carbon.ISO8601Layout) // 2020-08-05T13:14:15+09: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
@@ -1158,7 +1240,7 @@ carbon.Parse("2020-08-05 13:14:15").Format("\\I\\t \\i\\s Y-m-d H:i:s") // It is
```go
// 星座を取得
-carbon.Parse("2020-08-05 13:14:15").Constellation() // Leo
+carbon.Parse("2020-08-05 13:14:15").Constellation() // しし座
// おひつじ座かどうか
carbon.Parse("2020-08-05 13:14:15").IsAries() // false
@@ -1192,7 +1274,7 @@ carbon.Parse("2020-08-05 13:14:15").IsPisces() // false
```go
// 季節を取得
-carbon.Parse("2020-08-05 13:14:15").Season() // Summer
+carbon.Parse("2020-08-05 13:14:15").Season() // 夏季
// この季節の開始日
carbon.Parse("2020-08-05 13:14:15").StartOfSeason().ToDateTimeString() // 2020-06-01 00:00:00
@@ -1211,111 +1293,94 @@ 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"`
+type User struct {
+ Date carbon.FormatType[carbon.Date] `json:"date"`
+ Time carbon.LayoutType[carbon.Time] `json:"time"`
+ DateTime carbon.LayoutType[carbon.DateTime] `json:"date_time"`
+ Timestamp carbon.TimestampType[carbon.Timestamp] `json:"timestamp"`
+ TimestampMilli carbon.TimestampType[carbon.TimestampMilli] `json:"timestamp_milli"`
+ TimestampMicro carbon.TimestampType[carbon.TimestampMicro] `json:"timestamp_micro"`
+ TimestampNano carbon.TimestampType[carbon.TimestampNano] `json:"timestamp_nano"`
}
-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()),
-}
+var user User
-data, err := json.Marshal(&person)
+c := carbon.Parse("2020-08-05 13:14:15")
+user.Date = carbon.NewFormatType[carbon.Date](c)
+user.Time = carbon.NewLayoutType[carbon.Time](c)
+user.DateTime = carbon.NewLayoutType[carbon.DateTime](c)
+user.Timestamp = carbon.NewTimestampType[carbon.Timestamp](c)
+user.TimestampMilli = carbon.NewTimestampType[carbon.TimestampMilli](c)
+user.TimestampMicro = carbon.NewTimestampType[carbon.TimestampMicro](c)
+user.TimestampNano = carbon.NewTimestampType[carbon.TimestampNano](c)
+
+data, err := json.Marshal(&user)
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
-}
+{"date":"2020-08-05","time":"13:14:15","date_time":"2020-08-05 13:14:15","timestamp":1596633255,"timestamp_milli":1596633255000,"timestamp_micro":1596633255000000,"timestamp_nano":1596671999999999999}
-err := json.Unmarshal([]byte(data), &person)
+var person User
+err := json.Unmarshal(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
+fmt.Printf("%+v", person)
+// 出力
+{Date:2020-08-05 Time:13:14:15 DateTime:2020-08-05 13:14:15 Timestamp:1596633255 TimestampMilli:1596633255000 TimestampMicro:1596633255000000 TimestampNano:1596671999999999999}
+```
-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
+```go
+type RFC3339Layout string
+func (t CustomerLayout) SetLayout() string {
+ return carbon.RFC3339Layout
+}
-person.CreatedAt1.String() // "1596604455"
-person.CreatedAt2.String() // "1596604455999"
-person.CreatedAt3.String() // "1596604455999999"
-person.CreatedAt4.String() // "1596604455999999999"
+type ISO8601Format string
+func (t CustomerFormat) SetFormat() string {
+ return carbon.ISO8601Format
+}
-person.CreatedAt1.Int64() // 1596604455
-person.CreatedAt2.Int64() // 1596604455999
-person.CreatedAt3.Int64() // 1596604455999999
-person.CreatedAt4.Int64() // 1596604455999999999
+type User struct {
+ Customer1 carbon.LayoutType[RFC3339Layout] `json:"customer1"`
+ Customer2 carbon.FormatType[ISO8601Format] `json:"customer2"`
+}
+
+var user User
+
+c := carbon.Parse("2020-08-05 13:14:15")
+user.Customer1 = carbon.NewLayoutType[RFC3339Layout](c)
+user.Customer2 = carbon.NewFormatType[ISO8601Format](c)
+
+data, err := json.Marshal(&user)
+if err != nil {
+ // エラー処理...
+ log.Fatal(err)
+}
+fmt.Printf("%s", data)
+// 出力
+{"customer1":"2020-08-05T13:14:15Z","customer2":"2020-08-05T13:14:15+00:00"}
+
+var person User
+err := json.Unmarshal(data, &person)
+if err != nil {
+ // エラー処理...
+ log.Fatal(err)
+}
+
+fmt.Printf("%+v", person)
+// 出力
+{Customer1:2020-08-05T13:14:15Z Customer2:2020-08-05T13:14:15+00:00}
```
##### カレンダー
@@ -1357,6 +1422,7 @@ person.CreatedAt4.Int64() // 1596604455999999999
* [アラビア語(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") に翻訳
+* [ノルウェー語(nb)](./lang/nb.json "ノルウェー語"): [bendikrb](https://github.com/bendikrb "bendikrb") に翻訳
現在サポートされている方法
@@ -1452,30 +1518,11 @@ 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 {
+if c.HasError() {
// エラー処理...
log.Fatal(c.Error)
}
@@ -1487,46 +1534,45 @@ invalid timezone "xxx", please see the file "$GOROOT/lib/time/zoneinfo.zip" for
##### 書式設定記号表
-| 記号 | 説明 | 長さ | 範囲 | 例 |
-| :------------: | :------------: |:------:|:----------------:| :------------: |
-| 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 |
+| 記号 | 説明 | 長さ | 範囲 | 例 |
+|:--:|:-----------------------------------:|:--:|:----------------:|:-------------------:|
+| 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 |
+| x | マイクロ秒 | - | 1-999999 | 999999 |
+| z | ナノ秒 | - | 1-999999999 | 999999999 |
+| w | 数字表示の曜日 | 1 | 0-6 | 1 |
+| t | 月の総日数 | 2 | 28-31 | 31 |
+| e | タイムゾーン | - | - | America/New_York |
+| q | 四半期 | 1 | 1-4 | 1 |
+| c | 世紀 | - | 0-99 | 21 |
#### FAQ
diff --git a/vendor/github.com/dromara/carbon/v2/README.md b/vendor/github.com/dromara/carbon/v2/README.md
index 8c717e3a..58ed3b64 100644
--- a/vendor/github.com/dromara/carbon/v2/README.md
+++ b/vendor/github.com/dromara/carbon/v2/README.md
@@ -11,7 +11,7 @@ English | [简体中文](README.cn.md) | [日本語](README.jp.md)
#### Introduction
-A simple, semantic and developer-friendly golang package for time, has been included
+A simple, semantic and developer-friendly time package for `golang`, has been included
by [awesome-go](https://github.com/avelino/awesome-go#date-and-time "awesome-go")
#### Repository
@@ -24,7 +24,7 @@ by [awesome-go](https://github.com/avelino/awesome-go#date-and-time "awesome-go"
#### Installation
-##### go version >= 1.17
+##### go version >= 1.18
```go
// By github
@@ -40,7 +40,7 @@ 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
@@ -48,23 +48,36 @@ go mod edit -replace github.com/golang-module/carbon/v2=github.com/dromara/carbo
#### Usage and example
-> Assuming the current time is 2020-08-05 13:14:15.999999999 +0800 CST
+> Assuming the current time is 2020-08-05 13:14:15.999999999 +0000 UTC
-##### Set globally default values
+##### Set globally default
```go
+carbon.SetLayout(carbon.DateTimeLayout)
+carbon.SetTimezone(carbon.UTC)
+carbon.SetWeekStartsAt(carbon.Sunday)
+carbon.SetLocale("en")
+
+or
+
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
+ Locale: "en",
})
```
-> Suggest setting in the entry file such as `main.go`
##### Convert between `Carbon` and `time.Time`
```go
+// Convert standard Time.time to Carbon
+carbon.NewCarbon(time.Now())
+// Convert Carbon to standard Time.time
+carbon.Now().StdTime()
+
+or
+
// Convert standard Time.time to Carbon
carbon.CreateFromStdTime(time.Now())
// Convert Carbon to standard Time.time
@@ -77,14 +90,14 @@ carbon.Now().StdTime()
// 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().ToString() // 2025-03-24 03:13:26.664761 +0000 UTC
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
+carbon.Now(carbon.NewYork).ToDateTimeString() // 2020-08-05 13:14:15
// Return timestamp with second of today
carbon.Now().Timestamp() // 1596604455
// Return timestamp with millisecond of today
@@ -97,89 +110,86 @@ carbon.Now().TimestampNano() // 1596604455999999999
// 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().ToString() // 2020-08-04 13:14:15.999999999 +0000 UTC
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
+carbon.Yesterday(carbon.NewYork).ToDateTimeString() // 2020-08-04 13:14:15
// Return timestamp with second of yesterday
-carbon.Yesterday().Timestamp() // 1596518055
+carbon.Yesterday().Timestamp() // 1596546855
// Return timestamp with millisecond of yesterday
-carbon.Yesterday().TimestampMilli() // 1596518055999
+carbon.Yesterday().TimestampMilli() // 1596546855999
// Return timestamp with microsecond of yesterday
-carbon.Yesterday().TimestampMicro() // 1596518055999999
+carbon.Yesterday().TimestampMicro() // 1596546855999999
// Return timestamp with nanosecond of yesterday
-carbon.Yesterday().TimestampNano() // 1596518055999999999
+carbon.Yesterday().TimestampNano() // 1596546855999999999
// 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().ToString() // 22020-08-06 13:14:15.999999999 +0000 UTC
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
+carbon.Tomorrow(carbon.NewYork).ToDateTimeString() // 2020-08-06 13:14:15
// Return timestamp with second of tomorrow
-carbon.Tomorrow().Timestamp() // 1596690855
+carbon.Tomorrow().Timestamp() // 1596719655
// Return timestamp with millisecond of tomorrow
-carbon.Tomorrow().TimestampMilli() // 1596690855999
+carbon.Tomorrow().TimestampMilli() // 1596719655999
// Return timestamp with microsecond of tomorrow
-carbon.Tomorrow().TimestampMicro() // 1596690855999999
+carbon.Tomorrow().TimestampMicro() // 1596719655999999
// Return timestamp with nanosecond of tomorrow
-carbon.Tomorrow().TimestampNano() // 1596690855999999999
+carbon.Tomorrow().TimestampNano() // 1596719655999999999
```
##### 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
+carbon.CreateFromTimestamp(-1).ToString() // 1969-12-31 23:59:59 +0000 UTC
+carbon.CreateFromTimestamp(0).ToString() // 1970-01-01 00:00:00 +0000 UTC
+carbon.CreateFromTimestamp(1).ToString() // 1970-01-01 00:00:01 +0000 UTC
+carbon.CreateFromTimestamp(1649735755).ToString() // 2022-04-12 03:55:55 +0000 UTC
// Create a Carbon instance from a given timestamp with millisecond
-carbon.CreateFromTimestampMilli(1649735755981).ToString() // 2022-04-12 11:55:55.981 +0800 CST
+carbon.CreateFromTimestampMilli(1649735755981).ToString() // 2022-04-12 03:55:55.981 +0000 UTC
// Create a Carbon instance from a given timestamp with microsecond
-carbon.CreateFromTimestampMicro(1649735755981566).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
+carbon.CreateFromTimestampMicro(1649735755981566).ToString() // 2022-04-12 03:55:55.981566 +0000 UTC
// Create a Carbon instance from a given timestamp with nanosecond
-carbon.CreateFromTimestampNano(1649735755981566000).ToString() // 2022-04-12 11:55:55.981566 +0800 CST
+carbon.CreateFromTimestampNano(1649735755981566000).ToString() // 2022-04-12 03:55:55.981566 +0000 UTC
// 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
+carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToString() // 2020-08-05 13:14:15 +0000 UTC
// 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
+carbon.CreateFromDateTimeMilli(2020, 8, 5, 13, 14, 15, 999).ToString() // 2020-08-05 13:14:15.999 +0000 UTC
// 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
+carbon.CreateFromDateTimeMicro(2020, 8, 5, 13, 14, 15, 999999).ToString() // 2020-08-05 13:14:15.999999 +0000 UTC
// 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
+carbon.CreateFromDateTimeNano(2020, 8, 5, 13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
// 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
+carbon.CreateFromDate(2020, 8, 5).ToString() // 2020-08-05 00:00:00 +0000 UTC
// 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
+carbon.CreateFromDateMilli(2020, 8, 5, 999).ToString() // 2020-08-05 00:00:00.999 +0000 UTC
// 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
+carbon.CreateFromDateMicro(2020, 8, 5, 999999).ToString() // 2020-08-05 00:00:00.999999 +0000 UTC
// 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
+carbon.CreateFromDateNano(2020, 8, 5, 999999999).ToString() // 2020-08-05 00:00:00.999999999 +0000 UTC
// 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
+carbon.CreateFromTime(13, 14, 15).ToString() // 2020-08-05 13:14:15 +0000 UTC
// 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
+carbon.CreateFromTimeMilli(13, 14, 15, 999).ToString() // 2020-08-05 13:14:15.999 +0000 UTC
// 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
+carbon.CreateFromTimeMicro(13, 14, 15, 999999).ToString() // 2020-08-05 13:14:15.999999 +0000 UTC
// 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
+carbon.CreateFromTimeNano(13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
+
```
##### Parse a time string as a `Carbon` instance
@@ -187,47 +197,63 @@ carbon.CreateFromTimeNano(13, 14, 15, 999999999).ToString() // 2020-08-05 13:14:
```go
carbon.Parse("").ToDateTimeString() // empty string
carbon.Parse("0").ToDateTimeString() // empty string
+carbon.Parse("xxx").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("now").ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
+carbon.Parse("yesterday").ToString() // 2020-08-04 13:14:15.999999999 +0000 UTC
+carbon.Parse("tomorrow").ToString() // 2020-08-06 13:14:15.999999999 +0000 UTC
-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").ToString() // 2020-01-01 00:00:00 +0000 UTC
+carbon.Parse("2020-8").ToString() // 2020-08-01 00:00:00 +0000 UTC
+carbon.Parse("2020-08").ToString() // 2020-08-01 00:00:00 +0000 UTC
+carbon.Parse("2020-8-5").ToString() // 2020-08-05 00:00:00 +0000 UTC
+carbon.Parse("2020-8-05").ToString() // 2020-08-05 00:00:00 +0000 UTC
+carbon.Parse("2020-08-05").ToString() // 2020-08-05 00:00:00 +0000 UTC
+carbon.Parse("2020-08-05.999").ToString() // 2020-08-05 00:00:00.999 +0000 UTC
+carbon.Parse("2020-08-05.999999").ToString() // 2020-08-05 00:00:00.999999 +0000 UTC
+carbon.Parse("2020-08-05.999999999").ToString() // 2020-08-05 00:00:00.999999999 +0000 UTC
-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-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-8-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-08-5 13:14:15").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-08-05 13:14:15.999").ToString() // 2020-08-05 13:14:15.999 +0000 UTC
+carbon.Parse("2020-08-05 13:14:15.999999").ToString() // 2020-08-05 13:14:15.999999 +0000 UTC
+carbon.Parse("2020-08-05 13:14:15.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
-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("2020-8-5T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-8-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-08-05T13:14:15+08:00").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-08-05T13:14:15.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0000 UTC
+carbon.Parse("2020-08-05T13:14:15.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0000 UTC
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
-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.Parse("20200805").ToString() // 2020-08-05 00:00:00 +0000 UTC
+carbon.Parse("20200805131415").ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("20200805131415.999").ToString() // 2020-08-05 13:14:15.999 +0000 UTC
+carbon.Parse("20200805131415.999999").ToString() // 2020-08-05 13:14:15.999999 +0000 UTC
+carbon.Parse("20200805131415.999999999").ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
+carbon.Parse("20200805131415.999+08:00").ToString() // 2020-08-05 13:14:15.999 +0000 UTC
+carbon.Parse("20200805131415.999999+08:00").ToString() // 2020-08-05 13:14:15.999999 +0000 UTC
+carbon.Parse("20200805131415.999999999+08:00").ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
+```
+
+##### 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
+```
+
+##### parse a time string as a `Carbon` instance with layouts
+
+```go
+carbon.ParseWithLayouts("2020|08|05 13|14|15", []string{"2006|01|02 15|04|05", "2006|1|2 3|4|5"}).ToDateTimeString() // 2020-08-05 13:14:15
+carbon.ParseWithLayouts("2020|08|05 13|14|15", []string{"2006|01|02 15|04|05", "2006|1|2 3|4|5"}).CurrentLayout() // 2006|01|02 15|04|05
```
##### Parse a time string as a `Carbon` instance by format
@@ -238,14 +264,34 @@ carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").T
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
+##### ##### parse a time string as a `Carbon` instance with formats
```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.ParseWithFormats("2020|08|05 13|14|15", []string{"Y|m|d H|i|s", "y|m|d h|i|s"}).ToDateTimeString() // 2020-08-05 13:14:15
+carbon.ParseWithFormats("2020|08|05 13|14|15", []string{"Y|m|d H|i|s", "y|m|d h|i|s"}).CurrentLayout() // 2006|01|02 15|04|05
```
+##### Freeze
+
+```go
+now := carbon.Parse("2020-08-05")
+carbon.SetTestNow(now)
+
+carbon.IsTestNow() // true
+carbon.Now().ToDateString() // 2020-08-05
+carbon.Yesterday().ToDateString() // 2020-08-04
+carbon.Tomorrow().ToDateString() // 2020-08-05
+carbon.Now().DiffForHumans() // just now
+carbon.Yesterday().DiffForHumans() // 1 day ago
+carbon.Tomorrow().DiffForHumans() // 1 day from now
+carbon.Parse("2020-10-05").DiffForHumans() // 2 months from now
+now.DiffForHumans(carbon.Parse("2020-10-05")) // 2 months before
+
+carbon.CleanTestNow()
+carbon.IsTestNow() // false
+```
+
+
##### Boundary
```go
@@ -303,9 +349,9 @@ carbon.Parse("2020-08-05 13:14:15").StartOfMinute().ToDateTimeString() // 2020-0
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
+carbon.Parse("2020-08-05 13:14:15").StartOfSecond().ToString() // 2020-08-05 13:14:15 +0000 UTC
// End of the second
-carbon.Parse("2020-08-05 13:14:15").EndOfSecond().ToString() // 2020-08-05 13:14:15.999999999 +0800 CST
+carbon.Parse("2020-08-05 13:14:15").EndOfSecond().ToString() // 2020-08-05 13:14:15.999999999 +0000 UTC
```
##### Traveler
@@ -457,31 +503,31 @@ carbon.Parse("2020-08-05 13:14:15").SubDuration("2.5s").ToDateTimeString() // 20
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
+carbon.Parse("2020-08-05 13:14:15.222222222").AddMilliseconds(3).ToString() // 2020-08-05 13:14:15.225222222 +0000 UTC
// Add one millisecond
-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").AddMillisecond().ToString() // 2020-08-05 13:14:15.223222222 +0000 UTC
// Subtract three milliseconds
-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").SubMilliseconds(3).ToString() // 2020-08-05 13:14:15.219222222 +0000 UTC
// Subtract one millisecond
-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").SubMillisecond().ToString() // 2020-08-05 13:14:15.221222222 +0000 UTC
// Add three microseconds
-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").AddMicroseconds(3).ToString() // 2020-08-05 13:14:15.222225222 +0000 UTC
// Add one microsecond
-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").AddMicrosecond().ToString() // 2020-08-05 13:14:15.222223222 +0000 UTC
// Subtract three microseconds
-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").SubMicroseconds(3).ToString() // 2020-08-05 13:14:15.222219222 +0000 UTC
// Subtract one microsecond
-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").SubMicrosecond().ToString() // 2020-08-05 13:14:15.222221222 +0000 UTC
// Add three nanoseconds
-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").AddNanoseconds(3).ToString() // 2020-08-05 13:14:15.222222225 +0000 UTC
// Add one nanosecond
-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").AddNanosecond().ToString() // 2020-08-05 13:14:15.222222223 +0000 UTC
// Subtract three nanoseconds
-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").SubNanoseconds(3).ToString() // 2020-08-05 13:14:15.222222219 +0000 UTC
// Subtract one nanosecond
-carbon.Parse("2020-08-05 13:14:15.222222222").SubNanossecond().ToString() // 2020-08-05 13:14:15.222222221 +0800 CST
+carbon.Parse("2020-08-05 13:14:15.222222222").SubNanosecond().ToString() // 2020-08-05 13:14:15.222222221 +0000 UTC
```
##### Difference
@@ -582,28 +628,41 @@ 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 has error
+carbon.Parse("0001-01-01 00:00:00 +0000 UTC").HasError() // false
+carbon.NewCarbon().HasError() // false
+carbon.Parse("").HasError() // false
+carbon.Parse("0").HasError() // true
+carbon.Parse("xxx").HasError() // true
+carbon.Parse("2020-08-05").IsNil() // false
+
+// Whether is nil time
+carbon.Parse("0001-01-01 00:00:00 +0000 UTC").IsNil() // false
+carbon.NewCarbon().IsNil() // false
+carbon.Parse("").IsNil() // true
+carbon.Parse("0").IsNil() // false
+carbon.Parse("xxx").IsNil() // false
+carbon.NewCarbon().IsNil() // false
// 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("0001-01-01 00:00:00 +0000 UTC").IsZero() // true
+carbon.NewCarbon().IsZero() // true
+carbon.Parse("").IsZero() // false
+carbon.Parse("xxx").IsZero() // false
+carbon.Parse("0").IsZero() // false
+carbon.Parse("0000-00-00 00:00:00").IsZero() // false
+carbon.Parse("0000-00-00").IsZero() // false
+carbon.Parse("00:00:00").IsZero() // false
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("0001-01-01 00:00:00 +0000 UTC").IsValid() // true
+carbon.NewCarbon().IsValid() // true
carbon.Parse("").IsValid() // false
carbon.Parse("0").IsValid() // false
+carbon.Parse("xxx").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
@@ -612,8 +671,11 @@ carbon.Parse("2020-08-05").IsValid() // true
carbon.Parse("2020-08-05").SetTimezone("xxx").IsValid() // false
// Whether is invalid time
+carbon.Parse("0001-01-01 00:00:00 +0000 UTC").IsValid() // false
+carbon.NewCarbon().IsValid() // false
carbon.Parse("").IsInvalid() // true
carbon.Parse("0").IsInvalid() // true
+carbon.Parse("xxx").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
@@ -621,6 +683,16 @@ 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 daylight saving time
+carbon.Parse("").IsDST() // false
+carbon.Parse("0").IsDST() // false
+carbon.Parse("xxx").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 before noon
carbon.Parse("2020-08-05 00:00:00").IsAM() // true
carbon.Parse("2020-08-05 08:00:00").IsAM() // true
@@ -788,58 +860,60 @@ carbon.Parse("2020-08-05 13:14:15").BetweenIncludedBoth(carbon.Parse("2020-08-04
```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
+carbon.Parse("2020-08-05 13:14:15").SetTimezone(carbon.UTC).ToString() // 2020-08-05 13:14:15 +0000 UTC
+carbon.Parse("2020-08-05 13:14:15").SetTimezone(carbon.PRC).ToString() // 2020-08-05 21:14:15 +0800 CST
+carbon.Parse("2020-08-05 13:14:15").SetTimezone(carbon.Tokyo).ToString() // 2020-08-05 22:14:15 +0900 JST
// Set location
utc, _ := time.LoadLocation(carbon.UTC)
-carbon.SetLocation(utc).Now().ToDateTimeString() // 2022-06-28 09:25:38
+carbon.Parse("2020-08-05 13:14:15").SetLocation(utc).ToString() // 2020-08-05 13:14:15 +0000 UTC
+prc, _ := time.LoadLocation(carbon.PRC)
+carbon.Parse("2020-08-05 13:14:15").SetLocation(prc).ToString() // 2020-08-05 21:14:15 +0800 CST
tokyo, _ := time.LoadLocation(carbon.Tokyo)
-carbon.SetLocation(tokyo).Now().ToDateTimeString() // 2022-06-28 18:25:38
+carbon.Parse("2020-08-05 13:14:15").SetLocation(tokyo).ToString() // 2020-08-05 22:14:15 +0900 JST
// Set locale
carbon.Parse("2020-07-05 13:14:15").SetLocale("en").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
+carbon.Parse("2020-01-01").SetDateTime(2019, 2, 2, 13, 14, 15).ToString() // 2019-02-02 13:14:15 +0000 UTC
+carbon.Parse("2020-01-01").SetDateTime(2019, 2, 31, 13, 14, 15).ToString() // 2019-03-03 13:14:15 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetDateTimeMilli(2019, 2, 2, 13, 14, 15, 999).ToString() // 2019-02-02 13:14:15.999 +0000 UTC
+carbon.Parse("2020-01-01").SetDateTimeMilli(2019, 2, 31, 13, 14, 15, 999).ToString() // 2019-03-03 13:14:15.999 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetDateTimeMicro(2019, 2, 2, 13, 14, 15, 999999).ToString() // 2019-02-02 13:14:15.999999 +0000 UTC
+carbon.Parse("2020-01-01").SetDateTimeMicro(2019, 2, 31, 13, 14, 15, 999999).ToString() // 2019-03-03 13:14:15.999999 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetDateTimeNano(2019, 2, 2, 13, 14, 15, 999999999).ToString() // 2019-02-02 13:14:15.999999999 +0000 UTC
+carbon.Parse("2020-01-01").SetDateTimeNano(2019, 2, 31, 13, 14, 15, 999999999).ToString() // 2019-03-03 13:14:15.999999999 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetDate(2019, 2, 2).ToString() // 2019-02-02 00:00:00 +0000 UTC
+carbon.Parse("2020-01-01").SetDate(2019, 2, 31).ToString() // 2019-03-03 00:00:00 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetDateMilli(2019, 2, 2, 999).ToString() // 2019-02-02 00:00:00.999 +0000 UTC
+carbon.Parse("2020-01-01").SetDateMilli(2019, 2, 31, 999).ToString() // 2019-03-03 00:00:00.999 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetDateMicro(2019, 2, 2, 999999).ToString() // 2019-02-02 00:00:00.999999 +0000 UTC
+carbon.Parse("2020-01-01").SetDateMicro(2019, 2, 31, 999999).ToString() // 2019-03-03 00:00:00.999999 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetDateNano(2019, 2, 2, 999999999).ToString() // 2019-02-02 00:00:00.999999999 +0000 UTC
+carbon.Parse("2020-01-01").SetDateNano(2019, 2, 31, 999999999).ToString() // 2019-03-03 00:00:00.999999999 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetTime(13, 14, 15).ToString() // 2020-01-01 13:14:15 +0000 UTC
+carbon.Parse("2020-01-01").SetTime(13, 14, 90).ToString() // 2020-01-01 13:15:30 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetTimeMilli(13, 14, 15, 999).ToString() // 2020-01-01 13:14:15.999 +0000 UTC
+carbon.Parse("2020-01-01").SetTimeMilli(13, 14, 90, 999).ToString() // 2020-01-01 13:15:30.999 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetTimeMicro(13, 14, 15, 999999).ToString() // 2020-01-01 13:14:15.999999 +0000 UTC
+carbon.Parse("2020-01-01").SetTimeMicro(13, 14, 90, 999999).ToString() // 2020-01-01 13:15:30.999999 +0000 UTC
// 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
+carbon.Parse("2020-01-01").SetTimeNano(13, 14, 15, 999999999).ToString() // 2020-01-01 13:14:15.999999999 +0000 UTC
+carbon.Parse("2020-01-01").SetTimeNano(13, 14, 90, 999999999).ToString() // 2020-01-01 13:15:30.999999999 +0000 UTC
// Set year
carbon.Parse("2020-02-29").SetYear(2021).ToDateString() // 2021-03-01
@@ -972,17 +1046,17 @@ 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 location
+carbon.SetTimezone(carbon.PRC).Timezone() // PRC
+carbon.SetTimezone(carbon.Tokyo).Timezone() // Asia/Tokyo
+
// Get timezone name
-carbon.SetTimezone(carbon.PRC).Timezone() // CST
-carbon.SetTimezone(carbon.Tokyo).Timezone() // JST
+carbon.SetTimezone(carbon.PRC).ZoneName() // CST
+carbon.SetTimezone(carbon.Tokyo).ZoneName() // 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 timezone offset seconds from the UTC timezone
+carbon.SetTimezone(carbon.PRC).ZoneOffset() // 28800
+carbon.SetTimezone(carbon.Tokyo).ZoneOffset() // 32400
// Get locale name
carbon.Now().SetLocale("en").Locale() // en
@@ -998,6 +1072,14 @@ carbon.Now().Season() // Summer
carbon.Now().SetLocale("en").Season() // Summer
carbon.Now().SetLocale("zh-CN").Season() // 夏季
+// Get start day of the week
+carbon.SetWeekStartsAt(carbon.Sunday).WeekStartsAt() // Sunday
+carbon.SetWeekStartsAt(carbon.Monday).WeekStartsAt() // Monday
+
+// Get current layout
+carbon.Parse("now").CurrentLayout() // "2006-01-02 15:04:05"
+carbon.ParseByLayout("2020-08-05", DateLayout).CurrentLayout() // "2006-01-02"
+
// Get current age
carbon.Parse("2002-01-01 13:14:15").Age() // 17
carbon.Parse("2002-12-31 13:14:15").Age() // 18
@@ -1065,28 +1147,28 @@ 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
+carbon.Parse("2020-08-05 13:14:15").ToUnixDateString() // Wed Aug 5 13:14:15 UTC 2020
// Output Ruby date format string
-carbon.Parse("2020-08-05 13:14:15").ToRubyDateString() // Wed Aug 05 13:14:15 +0800 2020
+carbon.Parse("2020-08-05 13:14:15").ToRubyDateString() // Wed Aug 05 13:14:15 +0000 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
+carbon.Parse("2020-08-05 13:14:15").ToCookieString() // Wednesday, 05-Aug-2020 13:14:15 UTC
// 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
+carbon.Parse("2020-08-05 13:14:15").ToRssString() // Wed, 05 Aug 2020 13:14:15 +0000
// Output W3C format string
-carbon.Parse("2020-08-05 13:14:15").ToW3cString() // 2020-08-05T13:14:15+08:00
+carbon.Parse("2020-08-05 13:14:15").ToW3cString() // 2020-08-05T13:14:15Z
// Output ISO8601 format string
-carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601String() // 2020-08-05T13:14:15+08:00
+carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601String() // 2020-08-05T13:14:15+00: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
+carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MilliString() // 2020-08-05T13:14:15.999+00: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
+carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601MicroString() // 2020-08-05T13:14:15.999999+00: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
+carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601NanoString() // 2020-08-05T13:14:15.999999999+00: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
@@ -1097,36 +1179,36 @@ carbon.Parse("2020-08-05 13:14:15.999999999").ToIso8601ZuluMicroString() // 2020
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
+carbon.Parse("2020-08-05 13:14:15").ToRfc822String() // 05 Aug 20 13:14 UTC
// Output RFC822Z format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc822zString() // 05 Aug 20 13:14 +0800
+carbon.Parse("2020-08-05 13:14:15").ToRfc822zString() // 05 Aug 20 13:14 +0000
// Output RFC850 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc850String() // Wednesday, 05-Aug-20 13:14:15 CST
+carbon.Parse("2020-08-05 13:14:15").ToRfc850String() // Wednesday, 05-Aug-20 13:14:15 UTC
// Output RFC1036 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc1036String() // Wed, 05 Aug 20 13:14:15 +0800
+carbon.Parse("2020-08-05 13:14:15").ToRfc1036String() // Wed, 05 Aug 20 13:14:15 +0000
// Output RFC1123 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123String() // Wed, 05 Aug 2020 13:14:15 CST
+carbon.Parse("2020-08-05 13:14:15").ToRfc1123String() // Wed, 05 Aug 2020 13:14:15 UTC
// Output RFC1123Z format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc1123zString() // Wed, 05 Aug 2020 13:14:15 +0800
+carbon.Parse("2020-08-05 13:14:15").ToRfc1123zString() // Wed, 05 Aug 2020 13:14:15 +0000
// Output RFC2822 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc2822String() // Wed, 05 Aug 2020 13:14:15 +0800
+carbon.Parse("2020-08-05 13:14:15").ToRfc2822String() // Wed, 05 Aug 2020 13:14:15 +0000
// Output RFC7231 format string
-carbon.Parse("2020-08-05 13:14:15").ToRfc7231String() // Wed, 05 Aug 2020 13:14:15 GMT
+carbon.Parse("2020-08-05 13:14:15").ToRfc7231String() // Wed, 05 Aug 2020 13:14:15 UTC
// Output RFC3339 format string
-carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339String() // 2020-08-05T13:14:15+08:00
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339String() // 2020-08-05T05:14:15Z
// 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
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MilliString() // 2020-08-05T05:14:15.999Z
// 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
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339MicroString() // 2020-08-05T05:14:15.999999Z
// 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
+carbon.Parse("2020-08-05T13:14:15.999999999+08:00").ToRfc3339NanoString() // 2020-08-05T05:14:15.999999999Z
// 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
+carbon.Parse("2020-08-05 13:14:15").ToString() // 2020-08-05 13:14:15 +0000 UTC
// Output "Jan 2, 2006" format string
carbon.Parse("2020-08-05 13:14:15").ToFormattedDateString() // Aug 5, 2020
@@ -1134,7 +1216,7 @@ carbon.Parse("2020-08-05 13:14:15").ToFormattedDateString() // Aug 5, 2020
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(carbon.ISO8601Layout) // 2020-08-05T13:14:15+00: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
@@ -1205,111 +1287,94 @@ carbon.Parse("2020-08-05 13:14:15").IsWinter() // false
##### JSON
+###### Built-in type
+
```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"`
+type User struct {
+ Date carbon.FormatType[carbon.Date] `json:"date"`
+ Time carbon.LayoutType[carbon.Time] `json:"time"`
+ DateTime carbon.LayoutType[carbon.DateTime] `json:"date_time"`
+ Timestamp carbon.TimestampType[carbon.Timestamp] `json:"timestamp"`
+ TimestampMilli carbon.TimestampType[carbon.TimestampMilli] `json:"timestamp_milli"`
+ TimestampMicro carbon.TimestampType[carbon.TimestampMicro] `json:"timestamp_micro"`
+ TimestampNano carbon.TimestampType[carbon.TimestampNano] `json:"timestamp_nano"`
}
-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()),
-}
+var user User
-data, err := json.Marshal(&person)
+c := carbon.Parse("2020-08-05 13:14:15")
+user.Date = carbon.NewFormatType[carbon.Date](c)
+user.Time = carbon.NewLayoutType[carbon.Time](c)
+user.DateTime = carbon.NewLayoutType[carbon.DateTime](c)
+user.Timestamp = carbon.NewTimestampType[carbon.Timestamp](c)
+user.TimestampMilli = carbon.NewTimestampType[carbon.TimestampMilli](c)
+user.TimestampMicro = carbon.NewTimestampType[carbon.TimestampMicro](c)
+user.TimestampNano = carbon.NewTimestampType[carbon.TimestampNano](c)
+
+data, err := json.Marshal(&user)
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
-}
+{"date":"2020-08-05","time":"13:14:15","date_time":"2020-08-05 13:14:15","timestamp":1596633255,"timestamp_milli":1596633255000,"timestamp_micro":1596633255000000,"timestamp_nano":1596671999999999999}
-err := json.Unmarshal([]byte(data), &person)
+var person User
+err := json.Unmarshal(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
+fmt.Printf("%+v", person)
+// Output
+{Date:2020-08-05 Time:13:14:15 DateTime:2020-08-05 13:14:15 Timestamp:1596633255 TimestampMilli:1596633255000 TimestampMicro:1596633255000000 TimestampNano:1596671999999999999}
+```
-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
+###### Customize type
-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
+```go
+type RFC3339Layout string
+func (t CustomerLayout) SetLayout() string {
+ return carbon.RFC3339Layout
+}
-person.CreatedAt1.String() // "1596604455"
-person.CreatedAt2.String() // "1596604455999"
-person.CreatedAt3.String() // "1596604455999999"
-person.CreatedAt4.String() // "1596604455999999999"
+type ISO8601Format string
+func (t CustomerFormat) SetFormat() string {
+ return carbon.ISO8601Format
+}
-person.CreatedAt1.Int64() // 1596604455
-person.CreatedAt2.Int64() // 1596604455999
-person.CreatedAt3.Int64() // 1596604455999999
-person.CreatedAt4.Int64() // 1596604455999999999
+type User struct {
+ Customer1 carbon.LayoutType[RFC3339Layout] `json:"customer1"`
+ Customer2 carbon.FormatType[ISO8601Format] `json:"customer2"`
+}
+
+var user User
+
+c := carbon.Parse("2020-08-05 13:14:15")
+user.Customer1 = carbon.NewLayoutType[RFC3339Layout](c)
+user.Customer2 = carbon.NewFormatType[ISO8601Format](c)
+
+data, err := json.Marshal(&user)
+if err != nil {
+ // Error handle...
+ log.Fatal(err)
+}
+fmt.Printf("%s", data)
+// Output
+{"customer1":"2020-08-05T13:14:15Z","customer2":"2020-08-05T13:14:15+00:00"}
+
+var person User
+err := json.Unmarshal(data, &person)
+if err != nil {
+ // Error handle...
+ log.Fatal(err)
+}
+
+fmt.Printf("%+v", person)
+// Output
+{Customer1:2020-08-05T13:14:15Z Customer2:2020-08-05T13:14:15+00:00}
```
##### Calendar
@@ -1320,7 +1385,7 @@ The following calendars are supported
* [Chinese Lunar](./calendar/lunar/README.md "Chinese Lunar")
* [Persian/Jalaali](./calendar/persian/README.md "Persian/Jalaali")
-##### I18n
+##### i18n
The following languages are supported
@@ -1357,6 +1422,7 @@ The following languages are supported
* [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")
+* [Norwegian(nb)](./lang/nb.json "Norwegian"): translated by [bendikrb](https://github.com/bendikrb "bendikrb")
The following methods are supported
@@ -1452,30 +1518,11 @@ 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 {
+if c.HasError() {
// Error handle...
log.Fatal(c.Error)
}
@@ -1487,46 +1534,45 @@ invalid timezone "xxx", please see the file "$GOROOT/lib/time/zoneinfo.zip" for
##### 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 |
+| 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 | Zone name | - | - | 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 |
+| x | Microsecond | - | 1-999999 | 999999 |
+| z | Nanosecond | - | 1-999999999 | 999999999 |
+| w | Day of the week | 1 | 0-6 | 1 |
+| t | Total days of the month | 2 | 28-31 | 31 |
+| e | Time zone | - | - | America/New_York |
+| q | Quarter | 1 | 1-4 | 1 |
+| c | Century | - | 0-99 | 21 |
#### FAQ
diff --git a/vendor/github.com/dromara/carbon/v2/boundary.go b/vendor/github.com/dromara/carbon/v2/boundary.go
index 879fadfa..0d667fd0 100644
--- a/vendor/github.com/dromara/carbon/v2/boundary.go
+++ b/vendor/github.com/dromara/carbon/v2/boundary.go
@@ -2,72 +2,72 @@ 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)
+ return create(c.Year()/YearsPerCentury*YearsPerCentury, 1, 1, 0, 0, 0, 0, c.Timezone())
}
// 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)
+ return create(c.Year()/YearsPerCentury*YearsPerCentury+99, 12, 31, 23, 59, 59, 999999999, c.Timezone())
}
// 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)
+ return create(c.Year()/YearsPerDecade*YearsPerDecade, 1, 1, 0, 0, 0, 0, c.Timezone())
}
// 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)
+ return create(c.Year()/YearsPerDecade*YearsPerDecade+9, 12, 31, 23, 59, 59, 999999999, c.Timezone())
}
// 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)
+ return create(c.Year(), 1, 1, 0, 0, 0, 0, c.Timezone())
}
// 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)
+ return create(c.Year(), 12, 31, 23, 59, 59, 999999999, c.Timezone())
}
// 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
- return c.create(year, 3*quarter-2, day, 0, 0, 0, 0)
+ return create(year, 3*quarter-2, day, 0, 0, 0, 0, c.Timezone())
}
// 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
@@ -77,33 +77,33 @@ func (c Carbon) EndOfQuarter() Carbon {
case 2, 3:
day = 30
}
- return c.create(year, 3*quarter, day, 23, 59, 59, 999999999)
+ return create(year, 3*quarter, day, 23, 59, 59, 999999999, c.Timezone())
}
// 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()
- return c.create(year, month, 1, 0, 0, 0, 0)
+ return create(year, month, 1, 0, 0, 0, 0, c.Timezone())
}
// 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()
- return c.create(year, month+1, 0, 23, 59, 59, 999999999)
+ return create(year, month+1, 0, 23, 59, 59, 999999999, c.Timezone())
}
// 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)
@@ -112,8 +112,8 @@ func (c Carbon) StartOfWeek() Carbon {
// 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
@@ -122,80 +122,80 @@ func (c Carbon) EndOfWeek() Carbon {
// 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()
- return c.create(year, month, day, 0, 0, 0, 0)
+ return create(year, month, day, 0, 0, 0, 0)
}
// 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()
- return c.create(year, month, day, 23, 59, 59, 999999999)
+ return create(year, month, day, 23, 59, 59, 999999999)
}
// 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()
- return c.create(year, month, day, c.Hour(), 0, 0, 0)
+ return create(year, month, day, c.Hour(), 0, 0, 0)
}
// 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()
- return c.create(year, month, day, c.Hour(), 59, 59, 999999999)
+ return create(year, month, day, c.Hour(), 59, 59, 999999999)
}
// 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()
- return c.create(year, month, day, hour, minute, 0, 0)
+ return create(year, month, day, hour, minute, 0, 0)
}
// 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()
- return c.create(year, month, day, hour, minute, 59, 999999999)
+ return create(year, month, day, hour, minute, 59, 999999999)
}
// 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()
- return c.create(year, month, day, hour, minute, second, 0)
+ return create(year, month, day, hour, minute, second, 0)
}
// 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()
- return c.create(year, month, day, hour, minute, second, 999999999)
+ return create(year, month, day, hour, minute, second, 999999999)
}
diff --git a/vendor/github.com/dromara/carbon/v2/calendar.go b/vendor/github.com/dromara/carbon/v2/calendar.go
index 00fbd4ae..021e727f 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar.go
@@ -8,54 +8,65 @@ import (
// Lunar converts Carbon instance to Lunar instance.
// 将 Carbon 实例转化为 Lunar 实例
-func (c Carbon) Lunar() (l lunar.Lunar) {
- if c.Error != nil {
+func (c *Carbon) Lunar() *lunar.Lunar {
+ l := new(lunar.Lunar)
+ if c.IsNil() {
+ return nil
+ }
+ if c.HasError() {
l.Error = c.Error
- return
+ return l
}
return lunar.FromGregorian(c.StdTime()).ToLunar()
}
// CreateFromLunar creates a Carbon instance from Lunar date and time.
// 从 农历日期 创建 Carbon 实例
-func CreateFromLunar(year, month, day, hour, minute, second int, isLeapMonth bool) Carbon {
+func CreateFromLunar(year, month, day, hour, minute, second int, isLeapMonth bool) *Carbon {
+ l := lunar.FromLunar(year, month, day, hour, minute, second, isLeapMonth)
+ if !l.IsValid() {
+ return nil
+ }
t := lunar.FromLunar(year, month, day, hour, minute, second, isLeapMonth).ToGregorian().Time
return CreateFromStdTime(t)
}
// 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.IsInvalid() {
+ return nil
}
return julian.FromGregorian(c.StdTime()).ToJulian()
}
// CreateFromJulian creates a Carbon instance from Julian Day or Modified Julian Day.
// 从 儒略日/简化儒略日 创建 Carbon 实例
-func CreateFromJulian(f float64) Carbon {
+func CreateFromJulian(f float64) *Carbon {
+ g := julian.FromJulian(f).ToGregorian()
+ if !g.IsValid() {
+ return nil
+ }
t := julian.FromJulian(f).ToGregorian().Time
return CreateFromStdTime(t)
}
// 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 {
+ p := new(persian.Persian)
+ if c.IsInvalid() {
+ return p
}
return persian.FromGregorian(c.StdTime()).ToPersian()
}
// CreateFromPersian creates a Carbon instance from Persian date and time.
// 从 波斯日期 创建 Carbon 实例
-func CreateFromPersian(year, month, day, hour, minute, second int) (c Carbon) {
+func CreateFromPersian(year, month, day, hour, minute, second int) *Carbon {
p := persian.FromPersian(year, month, day, hour, minute, second)
- if p.Error != nil {
- c.Error = p.Error
- return
+ if p == nil || p.Error != nil {
+ return nil
}
- t := p.ToGregorian().Time
- return CreateFromStdTime(t)
+ return CreateFromStdTime(p.ToGregorian().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..ad8ea7bb 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/gregorian.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar/gregorian.go
@@ -132,29 +132,30 @@ type Gregorian struct {
// NewGregorian returns a new Gregorian instance.
// 初始化 Gregorian 结构体
-func NewGregorian(t time.Time) (g Gregorian) {
+func NewGregorian(t time.Time) *Gregorian {
+ g := new(Gregorian)
if t.IsZero() {
- return
+ return g
}
g.Time = t
- return
+ return g
}
// MaxValue returns a Gregorian instance for the greatest supported date.
// 返回 Gregorian 的最大值
-func MaxValue() 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 {
+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) {
+func (g *Gregorian) Date() (year, month, day int) {
if g.IsZero() {
return 0, 0, 0
}
@@ -166,7 +167,7 @@ func (g Gregorian) Date() (year, month, day int) {
// Clock gets gregorian hour, minute, and second like 13, 14, 15.
// 获取公历时、分、秒
-func (g Gregorian) Clock() (hour, minute, second int) {
+func (g *Gregorian) Clock() (hour, minute, second int) {
if g.IsZero() {
return 0, 0, 0
}
@@ -175,7 +176,7 @@ func (g Gregorian) Clock() (hour, minute, second int) {
// Year gets gregorian year like 2020.
// 获取公历年
-func (g Gregorian) Year() int {
+func (g *Gregorian) Year() int {
if g.IsZero() {
return 0
}
@@ -184,7 +185,7 @@ func (g Gregorian) Year() int {
// Month gets gregorian month like 8.
// 获取公历月,如 8
-func (g Gregorian) Month() int {
+func (g *Gregorian) Month() int {
if g.IsZero() {
return 0
}
@@ -193,7 +194,7 @@ func (g Gregorian) Month() int {
// Week gets gregorian week day like 0.
// 获取周
-func (g Gregorian) Week() int {
+func (g *Gregorian) Week() int {
if g.IsZero() {
return 0
}
@@ -202,7 +203,7 @@ func (g Gregorian) Week() int {
// Day gets gregorian day like 5.
// 获取公历日,如 0
-func (g Gregorian) Day() int {
+func (g *Gregorian) Day() int {
if g.IsZero() {
return 0
}
@@ -211,7 +212,7 @@ func (g Gregorian) Day() int {
// Hour gets gregorian hour like 13.
// 获取公历小时,如 13
-func (g Gregorian) Hour() int {
+func (g *Gregorian) Hour() int {
if g.IsZero() {
return 0
}
@@ -220,7 +221,7 @@ func (g Gregorian) Hour() int {
// Minute gets gregorian minute like 14.
// 获取公历分钟数,如 14
-func (g Gregorian) Minute() int {
+func (g *Gregorian) Minute() int {
if g.IsZero() {
return 0
}
@@ -229,7 +230,7 @@ func (g Gregorian) Minute() int {
// Second gets gregorian second like 15.
// 获取公历秒数,如 15
-func (g Gregorian) Second() int {
+func (g *Gregorian) Second() int {
if g.IsZero() {
return 0
}
@@ -238,13 +239,13 @@ func (g Gregorian) Second() int {
// Location gets gregorian timezone information.
// 获取时区信息
-func (g Gregorian) Location() *time.Location {
+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 {
+func (g *Gregorian) String() string {
if g.IsZero() {
return ""
}
@@ -253,13 +254,13 @@ func (g Gregorian) String() string {
// IsZero reports whether is zero time.
// 是否是零值时间
-func (g Gregorian) IsZero() bool {
+func (g *Gregorian) IsZero() bool {
return g.Time.IsZero()
}
// IsValid reports whether is a valid gregorian date.
// 是否是有效的年份
-func (g Gregorian) IsValid() bool {
+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
}
@@ -268,7 +269,7 @@ func (g Gregorian) IsValid() bool {
// IsLeapYear reports whether is a leap year.
// 是否是闰年
-func (g Gregorian) IsLeapYear() bool {
+func (g *Gregorian) IsLeapYear() bool {
if g.IsZero() {
return false
}
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..305889a8 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/julian/julian.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar/julian/julian.go
@@ -9,6 +9,11 @@ import (
"github.com/dromara/carbon/v2/calendar"
)
+const (
+ MinYear = -9997
+ MaxYear = 9998
+)
+
var (
// julian day or modified julian day decimal precision
// 儒略日或简化儒略日小数精度
@@ -33,17 +38,16 @@ type Julian struct {
// FromGregorian creates a Gregorian instance from time.Time.
// 从标准 time.Time 创建 Gregorian 实例
-func FromGregorian(t time.Time) (g Gregorian) {
- if t.IsZero() {
- return
- }
+func FromGregorian(t time.Time) *Gregorian {
+ g := new(Gregorian)
g.Time = t
return g
}
// FromJulian creates a Julian instance from julian day or modified julian day.
// 从 儒略日 或 简化儒略日 创建 Julian 实例
-func FromJulian(f float64) (j Julian) {
+func FromJulian(f float64) (j *Julian) {
+ j = new(Julian)
// get length of the integer part
l := len(strconv.Itoa(int(math.Ceil(f))))
switch l {
@@ -64,8 +68,14 @@ func FromJulian(f float64) (j Julian) {
// ToJulian converts Gregorian instance to Julian instance.
// 将 Gregorian 实例转化为 Julian 实例
-func (g Gregorian) ToJulian() (j Julian) {
+func (g *Gregorian) ToJulian() (j *Julian) {
+ j = new(Julian)
+ if g == nil {
+ return nil
+ }
if g.IsZero() {
+ j.jd = 1721423.5
+ j.mjd = -678577
return
}
y := g.Year()
@@ -90,9 +100,10 @@ func (g Gregorian) ToJulian() (j Julian) {
// ToGregorian converts Julian instance to Gregorian instance.
// 将 Julian 实例转化为 Gregorian 实例
-func (j Julian) ToGregorian() (g Gregorian) {
- if j.IsZero() {
- return
+func (j *Julian) ToGregorian() (g *Gregorian) {
+ g = new(Gregorian)
+ if g == nil || j.jd == 0 {
+ return g
}
d := int(j.jd + 0.5)
f := j.jd + 0.5 - float64(d)
@@ -128,29 +139,28 @@ func (j Julian) ToGregorian() (g Gregorian) {
// 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
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..c8a38323 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/lunar/lunar.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar/lunar/lunar.go
@@ -76,8 +76,8 @@ type Lunar struct {
// MaxValue returns a Lunar instance for the greatest supported date.
// 返回 Carbon 的最大值
-func MaxValue() Lunar {
- return Lunar{
+func MaxValue() *Lunar {
+ return &Lunar{
year: 2100,
month: 12,
day: 31,
@@ -89,8 +89,8 @@ func MaxValue() Lunar {
// MinValue returns a Lunar instance for the lowest supported date.
// 返回 Lunar 的最小值
-func MinValue() Lunar {
- return Lunar{
+func MinValue() *Lunar {
+ return &Lunar{
year: 1900,
month: 1,
day: 1,
@@ -102,37 +102,35 @@ func MinValue() Lunar {
// FromGregorian creates a Gregorian instance from time.Time.
// 从标准 time.Time 创建 Gregorian 实例
-func FromGregorian(t time.Time) (g Gregorian) {
+func FromGregorian(t time.Time) *Gregorian {
+ g := new(Gregorian)
if t.IsZero() {
- return
+ return g
}
g.Time = t
- return
+ return g
}
// FromLunar creates a Lunar instance from lunar datetime.
// 从 农历日期 创建 Lunar 实例
-func FromLunar(year, month, day, hour, minute, second int, isLeapMonth bool) (l Lunar) {
+func FromLunar(year, month, day, hour, minute, second int, isLeapMonth bool) *Lunar {
+ l := new(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
+ return l
}
// ToLunar converts Gregorian instance to Lunar instance.
// 将 Gregorian 实例转化为 Lunar 实例
-func (g Gregorian) ToLunar() (l Lunar) {
+func (g *Gregorian) ToLunar() *Lunar {
+ l := new(Lunar)
if g.IsZero() {
- return
+ return l
}
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()))
for l.year = minYear; l.year <= maxYear && offset > 0; l.year++ {
daysInYear = l.getDaysInYear()
@@ -174,20 +172,22 @@ func (g Gregorian) ToLunar() (l Lunar) {
l.hour, l.minute, l.second = g.Clock()
if !l.IsValid() {
l.Error = InvalidDateError()
- return
+ return l
}
- return
+ return l
}
// ToGregorian converts Lunar instance to Gregorian instance.
// 将 Lunar 实例转化为 Gregorian 实例
-func (l Lunar) ToGregorian() (g Gregorian) {
+func (l *Lunar) ToGregorian() *Gregorian {
+ g := new(Gregorian)
if !l.IsValid() {
- return
+ return g
}
days := l.getDaysInMonth()
offset := l.getOffsetInYear()
offset += l.getOffsetInMonth()
+
// 转换闰月农历 需补充该年闰月的前一个月的时差
if l.isLeapMonth {
offset += days
@@ -195,12 +195,12 @@ func (l Lunar) ToGregorian() (g Gregorian) {
// 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
+ return g
}
// Animal gets lunar animal name like "猴".
// 获取农历生肖
-func (l Lunar) Animal() string {
+func (l *Lunar) Animal() string {
if !l.IsValid() {
return ""
}
@@ -209,7 +209,7 @@ func (l Lunar) Animal() string {
// Festival gets lunar festival name like "春节".
// 获取农历节日
-func (l Lunar) Festival() string {
+func (l *Lunar) Festival() string {
if !l.IsValid() {
return ""
}
@@ -218,7 +218,7 @@ func (l Lunar) Festival() string {
// Year gets lunar year like 2020.
// 获取农历年份
-func (l Lunar) Year() int {
+func (l *Lunar) Year() int {
if l.Error != nil {
return 0
}
@@ -227,7 +227,7 @@ func (l Lunar) Year() int {
// Month gets lunar month like 8.
// 获取农历月份
-func (l Lunar) Month() int {
+func (l *Lunar) Month() int {
if l.Error != nil {
return 0
}
@@ -236,8 +236,8 @@ func (l Lunar) Month() int {
// 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
@@ -245,8 +245,8 @@ func (l Lunar) Day() int {
// Hour gets current hour like 13.
// 获取农历时辰
-func (l Lunar) Hour() int {
- if l.Error != nil {
+func (l *Lunar) Hour() int {
+ if !l.IsValid() {
return 0
}
return l.hour
@@ -254,8 +254,8 @@ func (l Lunar) Hour() int {
// Minute gets current minute like 14.
// 获取农历分钟数
-func (l Lunar) Minute() int {
- if l.Error != nil {
+func (l *Lunar) Minute() int {
+ if !l.IsValid() {
return 0
}
return l.minute
@@ -263,8 +263,8 @@ func (l Lunar) Minute() int {
// Second gets current second like 15.
// 获取农历秒数
-func (l Lunar) Second() int {
- if l.Error != nil {
+func (l *Lunar) Second() int {
+ if !l.IsValid() {
return 0
}
return l.second
@@ -272,20 +272,17 @@ func (l Lunar) Second() int {
// 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 {
+func (l *Lunar) String() string {
if !l.IsValid() {
return ""
}
@@ -294,7 +291,7 @@ func (l Lunar) String() string {
// 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 ""
}
@@ -307,7 +304,7 @@ func (l Lunar) ToYearString() (year string) {
// 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 ""
}
@@ -320,7 +317,7 @@ 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 ""
}
@@ -329,7 +326,7 @@ func (l Lunar) ToWeekString() (month string) {
// 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 +350,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,8 +359,11 @@ 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
@@ -371,8 +371,8 @@ func (l Lunar) IsValid() bool {
// 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
@@ -380,8 +380,8 @@ func (l Lunar) IsLeapYear() bool {
// 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()
@@ -389,8 +389,8 @@ func (l Lunar) IsLeapMonth() bool {
// 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 {
@@ -401,8 +401,8 @@ func (l Lunar) IsRatYear() bool {
// 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 {
@@ -413,8 +413,8 @@ func (l Lunar) IsOxYear() bool {
// 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 {
@@ -425,8 +425,8 @@ func (l Lunar) IsTigerYear() bool {
// 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 {
@@ -437,8 +437,8 @@ func (l Lunar) IsRabbitYear() bool {
// 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 {
@@ -449,8 +449,8 @@ func (l Lunar) IsDragonYear() bool {
// 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 {
@@ -461,8 +461,8 @@ func (l Lunar) IsSnakeYear() bool {
// 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 {
@@ -473,8 +473,8 @@ func (l Lunar) IsHorseYear() bool {
// 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 {
@@ -485,8 +485,8 @@ func (l Lunar) IsGoatYear() bool {
// 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 {
@@ -497,8 +497,8 @@ func (l Lunar) IsMonkeyYear() bool {
// 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 {
@@ -509,8 +509,8 @@ func (l Lunar) IsRoosterYear() bool {
// 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 {
@@ -521,8 +521,8 @@ func (l Lunar) IsDogYear() bool {
// 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 {
@@ -531,13 +531,13 @@ func (l Lunar) IsPigYear() bool {
return false
}
-func (g Gregorian) diffInDays(t time.Time) int {
+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 +553,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 +562,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 +572,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/persian.go b/vendor/github.com/dromara/carbon/v2/calendar/persian/persian.go
index 8b2b7ae0..e02858ec 100644
--- a/vendor/github.com/dromara/carbon/v2/calendar/persian/persian.go
+++ b/vendor/github.com/dromara/carbon/v2/calendar/persian/persian.go
@@ -43,8 +43,8 @@ type Persian struct {
// MaxValue returns a Persian instance for the greatest supported date.
// 返回 Persian 的最大值
-func MaxValue() Persian {
- return Persian{
+func MaxValue() *Persian {
+ return &Persian{
year: 9377,
month: 12,
day: 31,
@@ -56,8 +56,8 @@ func MaxValue() Persian {
// MinValue returns a Persian instance for the lowest supported date.
// 返回 Persian 的最小值
-func MinValue() Persian {
- return Persian{
+func MinValue() *Persian {
+ return &Persian{
year: 1,
month: 1,
day: 1,
@@ -69,29 +69,32 @@ func MinValue() Persian {
// FromGregorian creates a Gregorian instance from time.Time.
// 从标准 time.Time 创建 Gregorian 实例
-func FromGregorian(t time.Time) (g Gregorian) {
+func FromGregorian(t time.Time) *Gregorian {
+ g := new(Gregorian)
if t.IsZero() {
- return
+ return g
}
g.Time = t
- return
+ return g
}
// FromPersian creates a Persian instance from persian datetime.
// 从 波斯日期 创建 Persian 实例
-func FromPersian(year, month, day, hour, minute, second int) (p Persian) {
+func FromPersian(year, month, day, hour, minute, second int) *Persian {
+ p := new(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 p
}
- return
+ return p
}
// ToPersian converts Gregorian instance to Persian instance.
// 将 Gregorian 实例转化为 Persian 实例
-func (g Gregorian) ToPersian() (p Persian) {
+func (g *Gregorian) ToPersian() *Persian {
+ p := new(Persian)
p.hour, p.minute, p.second = g.Hour(), g.Minute(), g.Second()
gjdn := getGregorianJdn(g.Year(), g.Month(), g.Day())
pjdn := getPersianJdn(475, 1, 1)
@@ -111,16 +114,17 @@ func (g Gregorian) ToPersian() (p Persian) {
p.day = gjdn - pjdn + 1
if !p.IsValid() {
p.Error = InvalidDateError()
- return
+ return p
}
- return
+ return p
}
// ToGregorian converts Persian instance to Gregorian instance.
// 将 Persian 实例转化为 Gregorian 实例
-func (p Persian) ToGregorian() (g Gregorian) {
+func (p *Persian) ToGregorian() *Gregorian {
+ g := new(Gregorian)
if !p.IsValid() {
- return
+ return g
}
jdn := getPersianJdn(p.year, p.month, p.day)
@@ -136,12 +140,12 @@ func (p Persian) ToGregorian() (g Gregorian) {
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
+ return g
}
// Year gets lunar year like 2020.
// 获取年份,如 2020
-func (p Persian) Year() int {
+func (p *Persian) Year() int {
if p.Error != nil {
return 0
}
@@ -150,7 +154,7 @@ func (p Persian) Year() int {
// Month gets lunar month like 8.
// 获取月份,如 8
-func (p Persian) Month() int {
+func (p *Persian) Month() int {
if p.Error != nil {
return 0
}
@@ -159,7 +163,7 @@ func (p Persian) Month() int {
// Day gets lunar day like 5.
// 获取日,如 5
-func (p Persian) Day() int {
+func (p *Persian) Day() int {
if p.Error != nil {
return 0
}
@@ -168,7 +172,7 @@ func (p Persian) Day() int {
// Hour gets current hour like 13.
// 获取小时,如 13
-func (p Persian) Hour() int {
+func (p *Persian) Hour() int {
if p.Error != nil {
return 0
}
@@ -177,7 +181,7 @@ func (p Persian) Hour() int {
// Minute gets current minute like 14.
// 获取分钟数,如 14
-func (p Persian) Minute() int {
+func (p *Persian) Minute() int {
if p.Error != nil {
return 0
}
@@ -186,7 +190,7 @@ func (p Persian) Minute() int {
// Second gets current second like 15.
// 获取秒数,如 15
-func (p Persian) Second() int {
+func (p *Persian) Second() int {
if p.Error != nil {
return 0
}
@@ -195,7 +199,7 @@ func (p Persian) Second() int {
// 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 {
+func (p *Persian) String() string {
if !p.IsValid() {
return ""
}
@@ -204,7 +208,7 @@ func (p Persian) String() string {
// ToMonthString outputs a string in persian month format like "فروردین".
// 获取完整月份字符串,如 "فروردین"
-func (p Persian) ToMonthString(locale ...string) (month string) {
+func (p *Persian) ToMonthString(locale ...string) (month string) {
if !p.IsValid() {
return ""
}
@@ -223,7 +227,7 @@ func (p Persian) ToMonthString(locale ...string) (month string) {
// ToShortMonthString outputs a short string in persian month format like "فروردین".
// 获取缩写月份字符串,如 "فروردین"
-func (p Persian) ToShortMonthString(locale ...string) (month string) {
+func (p *Persian) ToShortMonthString(locale ...string) (month string) {
if !p.IsValid() {
return ""
}
@@ -242,7 +246,7 @@ func (p Persian) ToShortMonthString(locale ...string) (month string) {
// ToWeekString outputs a string in week layout like "چهارشنبه".
// 输出完整星期字符串,如 "چهارشنبه"
-func (p Persian) ToWeekString(locale ...string) (month string) {
+func (p *Persian) ToWeekString(locale ...string) (month string) {
if !p.IsValid() {
return ""
}
@@ -261,7 +265,7 @@ func (p Persian) ToWeekString(locale ...string) (month string) {
// ToShortWeekString outputs a short string in week layout like "چهارشنبه".
// 输出缩写星期字符串,如 "چهارشنبه"
-func (p Persian) ToShortWeekString(locale ...string) (month string) {
+func (p *Persian) ToShortWeekString(locale ...string) (month string) {
if !p.IsValid() {
return ""
}
@@ -280,7 +284,7 @@ func (p Persian) ToShortWeekString(locale ...string) (month string) {
// IsValid reports whether is a valid persian date.
// 是否是有效的日期
-func (p Persian) IsValid() bool {
+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 {
return true
}
@@ -289,7 +293,7 @@ func (p Persian) IsValid() bool {
// IsLeapYear reports whether is a persian leap year.
// 是否是闰年
-func (p Persian) IsLeapYear() bool {
+func (p *Persian) IsLeapYear() bool {
if !p.IsValid() {
return false
}
diff --git a/vendor/github.com/dromara/carbon/v2/carbon.go b/vendor/github.com/dromara/carbon/v2/carbon.go
index 321e0842..c163cc85 100644
--- a/vendor/github.com/dromara/carbon/v2/carbon.go
+++ b/vendor/github.com/dromara/carbon/v2/carbon.go
@@ -1,276 +1,21 @@
// @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"
-)
-
// 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
@@ -279,205 +24,35 @@ type Carbon struct {
}
// 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 {
+// 返回 Carbon 实例
+func NewCarbon(time ...time.Time) *Carbon {
+ c := &Carbon{lang: NewLanguage()}
+ c.loc, c.Error = getLocationByTimezone(DefaultTimezone)
+ if weekday, ok := weekdays[DefaultWeekStartsAt]; ok {
c.weekStartsAt = weekday
}
- c.layout = defaultLayout
+ if len(time) > 0 {
+ c.time = time[0]
+ c.loc = time[0].Location()
+ }
+ c.layout = DefaultLayout
return c
}
-// DateTime defines a DateTime struct.
-// 定义 DateTime 结构体
-type DateTime struct {
- Carbon
-}
+// Copy returns a new copy of the current Carbon instance
+// 复制 Carbon 实例
+func (c *Carbon) Copy() *Carbon {
+ newCarbon := NewCarbon()
-// NewDateTime returns a new DateTime instance.
-// 初始化 DateTime 结构体
-func NewDateTime(carbon Carbon) DateTime {
- return DateTime{Carbon: carbon}
-}
+ newCarbon.time = time.Date(c.Year(), time.Month(c.Month()), c.Day(), c.Hour(), c.Minute(), c.Second(), c.Nanosecond(), c.loc)
+ newCarbon.layout = c.layout
+ newCarbon.weekStartsAt = c.weekStartsAt
+ newCarbon.loc = c.loc
+ newCarbon.Error = c.Error
-// DateTimeMilli defines a DateTimeMilli struct.
-// 定义 DateTimeMilli 结构体
-type DateTimeMilli struct {
- Carbon
-}
+ newCarbon.lang.dir = c.lang.dir
+ newCarbon.lang.locale = c.lang.locale
+ newCarbon.lang.Error = c.lang.Error
-// 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}
+ return newCarbon
}
diff --git a/vendor/github.com/dromara/carbon/v2/comparer.go b/vendor/github.com/dromara/carbon/v2/comparer.go
index 1b7bbffb..c9235567 100644
--- a/vendor/github.com/dromara/carbon/v2/comparer.go
+++ b/vendor/github.com/dromara/carbon/v2/comparer.go
@@ -4,79 +4,79 @@ 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 it 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 a nil time.
+// 是否是空时间
+func (c *Carbon) IsNil() bool {
+ if c == nil || &c.time == nil {
return true
}
return false
}
-// IsInvalid reports whether is invalid time.
+// IsZero reports whether is a zero time(0001-01-01 00:00:00 +0000 UTC).
+// 是否是零值时间(0001-01-01 00:00:00 +0000 UTC)
+func (c *Carbon) IsZero() bool {
+ if c.IsNil() || c.HasError() {
+ return false
+ }
+ return c.time.IsZero()
+}
+
+// IsValid reports whether is a valid time.
+// 是否是有效时间
+func (c *Carbon) IsValid() bool {
+ if !c.IsNil() && !c.HasError() {
+ return true
+ }
+ return false
+}
+
+// IsInvalid reports whether is an invalid time.
// 是否是无效时间
-func (c Carbon) IsInvalid() bool {
+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.time.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()
@@ -88,8 +88,8 @@ func (c Carbon) IsLeapYear() bool {
// 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 {
+func (c *Carbon) IsLongYear() bool {
+ if c.IsInvalid() {
return false
}
_, w := time.Date(c.Year(), 12, 31, 0, 0, 0, 0, c.loc).ISOWeek()
@@ -98,8 +98,8 @@ func (c Carbon) IsLongYear() bool {
// 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)
@@ -107,8 +107,8 @@ func (c Carbon) IsJanuary() bool {
// 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)
@@ -116,8 +116,8 @@ func (c Carbon) IsFebruary() bool {
// 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)
@@ -125,8 +125,8 @@ func (c Carbon) IsMarch() bool {
// 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)
@@ -134,8 +134,8 @@ func (c Carbon) IsApril() bool {
// 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)
@@ -143,8 +143,8 @@ func (c Carbon) IsMay() bool {
// 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)
@@ -152,8 +152,8 @@ func (c Carbon) IsJune() bool {
// 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)
@@ -161,8 +161,8 @@ func (c Carbon) IsJuly() bool {
// 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)
@@ -170,8 +170,8 @@ func (c Carbon) IsAugust() bool {
// 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)
@@ -179,8 +179,8 @@ func (c Carbon) IsSeptember() bool {
// 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)
@@ -188,8 +188,8 @@ func (c Carbon) IsOctober() bool {
// 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)
@@ -197,8 +197,8 @@ func (c Carbon) IsNovember() bool {
// 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)
@@ -206,8 +206,8 @@ func (c Carbon) IsDecember() bool {
// 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
@@ -215,8 +215,8 @@ func (c Carbon) IsMonday() bool {
// 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
@@ -224,8 +224,8 @@ func (c Carbon) IsTuesday() bool {
// 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
@@ -233,8 +233,8 @@ func (c Carbon) IsWednesday() bool {
// 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
@@ -242,8 +242,8 @@ func (c Carbon) IsThursday() bool {
// 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
@@ -251,8 +251,8 @@ func (c Carbon) IsFriday() bool {
// 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
@@ -260,8 +260,8 @@ func (c Carbon) IsSaturday() bool {
// 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
@@ -269,8 +269,8 @@ func (c Carbon) IsSunday() bool {
// 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()
@@ -278,17 +278,50 @@ func (c Carbon) IsWeekday() bool {
// 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()
}
+// IsNow reports whether is now time.
+// 是否是当前时间
+func (c *Carbon) IsNow() bool {
+ if c.IsInvalid() {
+ return false
+ }
+ return c.Timestamp() == Now(c.Timezone()).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(c.Timezone()).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(c.Timezone()).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()
@@ -296,8 +329,8 @@ func (c Carbon) IsYesterday() bool {
// 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()
@@ -305,8 +338,8 @@ func (c Carbon) IsToday() bool {
// 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()
@@ -314,8 +347,8 @@ func (c Carbon) IsTomorrow() bool {
// 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()
@@ -323,8 +356,8 @@ func (c Carbon) IsSameCentury(t Carbon) bool {
// 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() {
return false
}
return c.Decade() == t.Decade()
@@ -332,8 +365,8 @@ func (c Carbon) IsSameDecade(t Carbon) bool {
// 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() {
return false
}
return c.Year() == t.Year()
@@ -341,17 +374,17 @@ func (c Carbon) IsSameYear(t Carbon) bool {
// 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() {
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() {
return false
}
return c.Format("Ym") == t.Format("Ym")
@@ -359,8 +392,8 @@ func (c Carbon) IsSameMonth(t Carbon) bool {
// 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() {
return false
}
return c.Format("Ymd") == t.Format("Ymd")
@@ -368,8 +401,8 @@ func (c Carbon) IsSameDay(t Carbon) bool {
// 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() {
return false
}
return c.Format("YmdH") == t.Format("YmdH")
@@ -377,8 +410,8 @@ func (c Carbon) IsSameHour(t Carbon) bool {
// 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() {
return false
}
return c.Format("YmdHi") == t.Format("YmdHi")
@@ -386,8 +419,8 @@ func (c Carbon) IsSameMinute(t Carbon) bool {
// 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() {
return false
}
return c.Format("YmdHis") == t.Format("YmdHis")
@@ -396,8 +429,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() {
return false
}
switch operator {
@@ -419,8 +452,8 @@ 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)
@@ -428,8 +461,8 @@ func (c Carbon) Gt(t Carbon) bool {
// 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)
@@ -437,8 +470,8 @@ func (c Carbon) Lt(t Carbon) bool {
// 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)
@@ -446,14 +479,17 @@ func (c Carbon) Eq(t Carbon) bool {
// 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)
@@ -461,8 +497,8 @@ func (c Carbon) Gte(t Carbon) bool {
// 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)
@@ -470,8 +506,11 @@ func (c Carbon) Lte(t Carbon) bool {
// 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 c.IsInvalid() || start.IsInvalid() || end.IsInvalid() {
+ return false
+ }
+ if start.Gt(end) {
return false
}
if c.Gt(start) && c.Lt(end) {
@@ -482,8 +521,11 @@ 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 c.IsInvalid() || start.IsInvalid() || end.IsInvalid() {
+ return false
+ }
+ if start.Gt(end) {
return false
}
if c.Gte(start) && c.Lt(end) {
@@ -494,8 +536,11 @@ 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 c.IsInvalid() || start.IsInvalid() || end.IsInvalid() {
+ return false
+ }
+ if start.Gt(end) {
return false
}
if c.Gt(start) && c.Lte(end) {
@@ -506,8 +551,11 @@ 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 c.IsInvalid() || start.IsInvalid() || end.IsInvalid() {
+ return false
+ }
+ if start.Gt(end) {
return false
}
if c.Gte(start) && c.Lte(end) {
diff --git a/vendor/github.com/dromara/carbon/v2/constant.go b/vendor/github.com/dromara/carbon/v2/constant.go
new file mode 100644
index 00000000..d287aa1d
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/constant.go
@@ -0,0 +1,288 @@
+package carbon
+
+import (
+ "time"
+)
+
+// Version current version
+// 当前版本号
+const Version = "2.6.1"
+
+// 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 = "January" // 一月
+ February = "February" // 二月
+ March = "March" // 三月
+ April = "April" // 四月
+ May = "May" // 五月
+ June = "June" // 六月
+ July = "July" // 七月
+ August = "August" // 八月
+ September = "September" // 九月
+ October = "October" // 十月
+ November = "November" // 十一月
+ December = "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 = "Monday" // 周一
+ Tuesday = "Tuesday" // 周二
+ Wednesday = "Wednesday" // 周三
+ Thursday = "Thursday" // 周四
+ Friday = "Friday" // 周五
+ Saturday = "Saturday" // 周六
+ Sunday = "Sunday" // 周日
+)
+
+// season constants
+// 季节常量
+const (
+ Spring = "Spring" // 春季
+ Summer = "Summer" // 夏季
+ Autumn = "Autumn" // 秋季
+ Winter = "Winter" // 冬季
+)
+
+// 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"
+)
diff --git a/vendor/github.com/dromara/carbon/v2/constellation.go b/vendor/github.com/dromara/carbon/v2/constellation.go
index 5bfba2d9..733fe954 100644
--- a/vendor/github.com/dromara/carbon/v2/constellation.go
+++ b/vendor/github.com/dromara/carbon/v2/constellation.go
@@ -23,13 +23,13 @@ var constellations = []struct {
}
// Constellation gets constellation name like "Aries", i18n is supported.
-// 获取星座,支持i18n
-func (c Carbon) Constellation() string {
+// 获取星座,支持 i18n
+func (c *Carbon) Constellation() string {
if c.IsInvalid() {
return ""
}
if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
+ c.lang.SetLocale(DefaultLocale)
}
index := -1
_, month, day := c.Date()
@@ -55,7 +55,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
}
@@ -71,7 +71,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
}
@@ -87,7 +87,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
}
@@ -103,7 +103,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
}
@@ -119,7 +119,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
}
@@ -135,7 +135,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
}
@@ -151,7 +151,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
}
@@ -167,7 +167,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
}
@@ -183,7 +183,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
}
@@ -199,7 +199,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
}
@@ -215,7 +215,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
}
@@ -231,7 +231,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..d754e54d 100644
--- a/vendor/github.com/dromara/carbon/v2/creator.go
+++ b/vendor/github.com/dromara/carbon/v2/creator.go
@@ -6,247 +6,154 @@ 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(tt time.Time, timezone ...string) *Carbon {
+ c := NewCarbon(tt)
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- c.time = tt
return c
}
// CreateFromTimestamp creates a Carbon instance from a given timestamp with second.
// 从给定的秒级时间戳创建 Carbon 实例
-func (c Carbon) CreateFromTimestamp(timestamp int64, timezone ...string) Carbon {
+func CreateFromTimestamp(timestamp int64, timezone ...string) *Carbon {
+ c := NewCarbon()
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- if c.Error != nil {
+ if c.HasError() {
return c
}
c.time = time.Unix(timestamp, 0)
return c
}
-// 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 {
+func CreateFromTimestampMilli(timestamp int64, timezone ...string) *Carbon {
+ c := NewCarbon()
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- if c.Error != nil {
+ if c.HasError() {
return c
}
c.time = time.Unix(timestamp/1e3, (timestamp%1e3)*1e6)
return c
}
-// 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 {
+func CreateFromTimestampMicro(timestamp int64, timezone ...string) *Carbon {
+ c := NewCarbon()
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- if c.Error != nil {
+ if c.HasError() {
return c
}
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 {
+func CreateFromTimestampNano(timestamp int64, timezone ...string) *Carbon {
+ c := NewCarbon()
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- if c.Error != nil {
+ if c.HasError() {
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...)
-}
-
// 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...)
-}
-
-// 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...)
+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...)
}
// 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 {
+func create(year, month, day, hour, minute, second, nanosecond int, timezone ...string) *Carbon {
+ c := NewCarbon()
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- if c.Error != nil {
+ if c.HasError() {
return c
}
c.time = time.Date(year, time.Month(month), day, hour, minute, second, nanosecond, c.loc)
diff --git a/vendor/github.com/dromara/carbon/v2/database.go b/vendor/github.com/dromara/carbon/v2/database.go
index 3069eb73..faf99a62 100644
--- a/vendor/github.com/dromara/carbon/v2/database.go
+++ b/vendor/github.com/dromara/carbon/v2/database.go
@@ -3,888 +3,392 @@ package carbon
import (
"bytes"
"database/sql/driver"
- "errors"
"fmt"
"strconv"
"time"
)
-// returns a failed scan error.
+// timestamp precision constants
+// 时间戳精度常量
+const (
+ PrecisionSecond = 9
+ PrecisionMillisecond = 999
+ PrecisionMicrosecond = 999999
+ PrecisionNanosecond = 999999999
+)
+
+// returns a failed scan error
// 失败的扫描错误
var failedScanError = func(src interface{}) error {
- return errors.New(fmt.Sprintf("failed to scan value: %v", src))
+ return fmt.Errorf("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 {
+// LayoutFactory defines a LayoutFactory interface
+// 定义 LayoutFactory 接口
+type LayoutFactory interface {
+ ~string
+ SetLayout() string
+}
+
+// LayoutType defines a LayoutType generic struct
+// 定义 LayoutType 泛型结构体
+type LayoutType[T LayoutFactory] struct {
+ *Carbon
+}
+
+// FormatFactory defines a FormatFactory interface.
+// 定义 FormatFactory 接口
+type FormatFactory interface {
+ ~string
+ SetFormat() string
+}
+
+// FormatType defines a FormatType generic struct.
+// 定义 FormatType 泛型结构体
+type FormatType[T FormatFactory] struct {
+ *Carbon
+}
+
+// TimestampFactory defines a TimestampFactory interface.
+// 定义 TimestampFactory 接口
+type TimestampFactory interface {
+ ~int64
+ SetPrecision() int64
+}
+
+// TimestampType defines a TimestampType generic struct.
+// 定义 TimestampType 泛型结构体
+type TimestampType[T TimestampFactory] struct {
+ *Carbon
+}
+
+// NewLayoutType returns a new LayoutType generic instance.
+// 返回 LayoutType 泛型实例
+func NewLayoutType[T LayoutFactory](carbon *Carbon) LayoutType[T] {
+ return LayoutType[T]{
+ Carbon: carbon,
+ }
+}
+
+// NewFormatType returns a new FormatType generic instance.
+// 返回 FormatType 泛型实例
+func NewFormatType[T FormatFactory](carbon *Carbon) FormatType[T] {
+ return FormatType[T]{
+ Carbon: carbon,
+ }
+}
+
+// NewTimestampType returns a new TimestampType generic instance.
+// 返回 TimestampType 泛型实例
+func NewTimestampType[T TimestampFactory](carbon *Carbon) TimestampType[T] {
+ return TimestampType[T]{
+ Carbon: carbon,
+ }
+}
+
+// Scan implements driver.Scanner interface for LayoutType generic struct.
+// 实现 driver.Scanner 接口
+func (t *LayoutType[T]) Scan(src interface{}) error {
+ c := NewCarbon()
switch v := src.(type) {
case []byte:
- *c = Parse(string(v))
+ c = Parse(string(v), DefaultTimezone)
case string:
- *c = Parse(v)
+ c = Parse(v, DefaultTimezone)
case time.Time:
- *c = CreateFromStdTime(v)
+ c = CreateFromStdTime(v, DefaultTimezone)
+ case int64:
+ c = CreateFromTimestamp(v, DefaultTimezone)
+ default:
+ return failedScanError(v)
}
- if c.Error == nil {
- return nil
- }
- return failedScanError(src)
+ *t = NewLayoutType[T](c)
+ return t.Error
}
-// Value the interface providing the Value method for package database/sql/driver.
-func (c Carbon) Value() (driver.Value, error) {
- if c.IsZero() {
+// Value implements driver.Valuer interface for LayoutType generic struct.
+// 实现 driver.Valuer 接口
+func (t LayoutType[T]) Value() (driver.Value, error) {
+ if t.IsNil() || t.IsZero() {
return nil, nil
}
- return c.StdTime(), nil
+ if t.HasError() {
+ return nil, t.Error
+ }
+ return t.StdTime(), nil
}
-// MarshalJSON implements the interface json.Marshal for Carbon struct.
+// MarshalJSON implements json.Marshal interface for LayoutType generic struct.
// 实现 json.Marshaler 接口
-func (c Carbon) MarshalJSON() ([]byte, error) {
- return []byte(fmt.Sprintf(`"%s"`, c.Layout(c.layout))), nil
+func (t LayoutType[T]) MarshalJSON() ([]byte, error) {
+ emptyBytes := []byte(`""`)
+ if t.IsNil() || t.IsZero() {
+ return emptyBytes, nil
+ }
+ if t.HasError() {
+ return emptyBytes, t.Error
+ }
+ return []byte(fmt.Sprintf(`"%s"`, t.Layout(t.getLayout(), t.Timezone()))), nil
}
-// UnmarshalJSON implements the interface json.Unmarshal for Carbon struct.
+// UnmarshalJSON implements json.Unmarshal interface for LayoutType generic struct.
// 实现 json.Unmarshaler 接口
-func (c *Carbon) UnmarshalJSON(b []byte) error {
- value := fmt.Sprintf("%s", bytes.Trim(b, `"`))
- if value == "" || value == "null" {
+func (t *LayoutType[T]) UnmarshalJSON(b []byte) error {
+ value := string(bytes.Trim(b, `"`))
+ if value == "" || value == "null" || value == "0" {
+ t.Carbon = nil
return nil
}
- *c = ParseByLayout(value, c.layout)
- return c.Error
+ *t = NewLayoutType[T](ParseByLayout(value, t.getLayout()))
+ return t.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 {
+// String implements Stringer interface for LayoutType generic struct.
+// 实现 Stringer 接口
+func (t LayoutType[T]) String() string {
+ if t.IsZero() || t.IsInvalid() {
+ return ""
+ }
+ return t.Layout(t.getLayout(), t.Timezone())
+}
+
+// GormDataType sets gorm data type for LayoutType generic struct.
+// 设置 gorm 数据类型
+func (t LayoutType[T]) GormDataType() string {
+ return "time"
+}
+
+// getLayout returns the set layout.
+// 返回设置的布局模板
+func (t LayoutType[T]) getLayout() string {
+ var factory T
+ return factory.SetLayout()
+}
+
+// Scan implements driver.Scanner interface for FormatType generic struct.
+// 实现 driver.Scanner 接口
+func (t *FormatType[T]) Scan(src interface{}) error {
+ c := NewCarbon()
switch v := src.(type) {
case []byte:
- *t = NewDateTime(Parse(string(v)))
+ c = Parse(string(v), DefaultTimezone)
case string:
- *t = NewDateTime(Parse(v))
+ c = Parse(v, DefaultTimezone)
case time.Time:
- *t = NewDateTime(CreateFromStdTime(v))
+ c = CreateFromStdTime(v, DefaultTimezone)
+ case int64:
+ c = CreateFromTimestamp(v, DefaultTimezone)
+ default:
+ return failedScanError(v)
}
- if t.Error == nil {
- return nil
- }
- return failedScanError(src)
+ *t = NewFormatType[T](c)
+ return t.Error
}
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *DateTime) Value() (driver.Value, error) {
- if t.IsZero() {
+// Value implements driver.Valuer interface for FormatType generic struct.
+// 实现 driver.Valuer 接口
+func (t FormatType[T]) Value() (driver.Value, error) {
+ if t.IsNil() || t.IsZero() {
return nil, nil
}
+ if t.HasError() {
+ return nil, t.Error
+ }
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
+// MarshalJSON implements json.Marshal interface for FormatType generic struct.
+// 实现 json.Marshaler 接口
+func (t FormatType[T]) MarshalJSON() ([]byte, error) {
+ emptyBytes := []byte(`""`)
+ if t.IsNil() || t.IsZero() {
+ return emptyBytes, nil
+ }
+ if t.HasError() {
+ return emptyBytes, t.Error
+ }
+ return []byte(fmt.Sprintf(`"%s"`, t.Format(t.getFormat(), t.Timezone()))), 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" {
+// UnmarshalJSON implements json.Unmarshal interface for FormatType generic struct.
+// 实现 json.Unmarshaler 接口
+func (t *FormatType[T]) UnmarshalJSON(b []byte) error {
+ value := string(bytes.Trim(b, `"`))
+ if value == "" || value == "null" || value == "0" {
+ t.Carbon = nil
return nil
}
- c := ParseByLayout(value, DateTimeLayout)
- if c.Error == nil {
- *t = NewDateTime(c)
- }
- return c.Error
+ *t = NewFormatType[T](ParseByFormat(value, t.getFormat()))
+ return t.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 {
+// String implements Stringer interface for FormatType generic struct.
+// 实现 Stringer 接口
+func (t FormatType[T]) String() string {
+ if t.IsZero() || t.IsInvalid() {
+ return ""
+ }
+ return t.Format(t.getFormat(), t.Timezone())
+}
+
+// GormDataType sets gorm data type for FormatType generic struct.
+// 设置 gorm 数据类型
+func (t FormatType[T]) GormDataType() string {
+ return "time"
+}
+
+// getFormat returns the set format.
+// 返回设置的格式模板
+func (t FormatType[T]) getFormat() string {
+ var factory T
+ return factory.SetFormat()
+}
+
+// Scan implements driver.Scanner interface for TimestampType generic struct.
+// 实现 driver.Scanner 接口
+func (t *TimestampType[T]) Scan(src interface{}) (err error) {
+ ts := int64(0)
+ c := NewCarbon()
switch v := src.(type) {
case []byte:
- *t = NewDateTimeMilli(Parse(string(v)))
+ ts, err = strconv.ParseInt(string(v), 10, 64)
+ if err != nil {
+ return invalidTimestampError(string(v))
+ }
case string:
- *t = NewDateTimeMilli(Parse(v))
+ ts, err = strconv.ParseInt(v, 10, 64)
+ if err != nil {
+ return invalidTimestampError(v)
+ }
+ case int64:
+ ts = v
case time.Time:
- *t = NewDateTimeMilli(CreateFromStdTime(v))
+ c = CreateFromStdTime(v, DefaultTimezone)
+ *t = NewTimestampType[T](c)
+ return t.Error
+ default:
+ return failedScanError(src)
}
- if t.Error == nil {
- return nil
+ 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)
}
- return failedScanError(src)
+ *t = NewTimestampType[T](c)
+ return t.Error
}
-// Value the interface providing the Value method for package database/sql/driver.
-func (t *DateTimeMilli) Value() (driver.Value, error) {
- if t.IsZero() {
+// Value implements driver.Valuer interface for TimestampType generic struct.
+// 实现 driver.Valuer 接口
+func (t TimestampType[T]) Value() (driver.Value, error) {
+ if t.IsNil() || t.IsZero() {
return nil, nil
}
- return t.StdTime(), nil
+ if t.HasError() {
+ return nil, t.Error
+ }
+ v := int64(0)
+ switch t.getPrecision() {
+ case PrecisionSecond:
+ v = t.Timestamp()
+ case PrecisionMillisecond:
+ v = t.TimestampMilli()
+ case PrecisionMicrosecond:
+ v = t.TimestampMicro()
+ case PrecisionNanosecond:
+ v = t.TimestampNano()
+ }
+ return v, 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
+// MarshalJSON implements json.Marshal interface for TimestampType generic struct.
+// 实现 json.Marshaler 接口
+func (t TimestampType[T]) MarshalJSON() ([]byte, error) {
+ ts := int64(0)
+ if t.IsNil() || t.IsZero() {
+ return []byte(fmt.Sprintf(`%d`, ts)), nil
+ }
+ if t.HasError() {
+ return []byte(fmt.Sprintf(`%d`, ts)), t.Error
+ }
+ 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(fmt.Sprintf(`%d`, ts)), 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" {
+// UnmarshalJSON implements json.Unmarshal interface for TimestampType generic struct.
+// 实现 json.Unmarshaler 接口
+func (t *TimestampType[T]) UnmarshalJSON(b []byte) error {
+ value := string(bytes.Trim(b, `"`))
+ c := NewCarbon()
+ if value == "" || value == "null" || value == "0" {
+ t.Carbon = nil
return nil
}
- c := ParseByLayout(value, DateTimeMilliLayout)
- if c.Error == nil {
- *t = NewDateTimeMilli(c)
+ ts, err := strconv.ParseInt(value, 10, 64)
+ if err != nil {
+ return invalidTimestampError(value)
}
- return c.Error
+ 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
}
-// 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.
+// String implements Stringer interface for TimestampType generic struct.
// 实现 Stringer 接口
-func (t DateTime) String() string {
- return t.ToDateTimeString()
+func (t TimestampType[T]) String() string {
+ return strconv.FormatInt(t.Int64(), 10)
}
-// String implements the interface Stringer for DateTimeMilli struct.
-// 实现 Stringer 接口
-func (t DateTimeMilli) String() string {
- return t.ToDateTimeMilliString()
+func (t TimestampType[T]) Int64() int64 {
+ ts := int64(0)
+ if t.IsZero() || t.IsInvalid() {
+ return ts
+ }
+ switch t.getPrecision() {
+ case PrecisionSecond:
+ ts = t.Timestamp()
+ case PrecisionMillisecond:
+ ts = t.TimestampMilli()
+ case PrecisionMicrosecond:
+ ts = t.TimestampMicro()
+ case PrecisionNanosecond:
+ ts = t.TimestampNano()
+ }
+ return ts
}
-// String implements the interface Stringer for DateTimeMicro struct.
-// 实现 Stringer 接口
-func (t DateTimeMicro) String() string {
- return t.ToDateTimeMicroString()
+// GormDataType sets gorm data type for TimestampType generic struct.
+// 设置 gorm 数据类型
+func (t TimestampType[T]) GormDataType() string {
+ return "time"
}
-// 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)
+// getPrecision returns the set timestamp precision.
+// 返回设置的时间戳精度
+func (t TimestampType[T]) getPrecision() int64 {
+ var factory T
+ return factory.SetPrecision()
}
diff --git a/vendor/github.com/dromara/carbon/v2/default.go b/vendor/github.com/dromara/carbon/v2/default.go
index aab8ca60..de2cc2ac 100644
--- a/vendor/github.com/dromara/carbon/v2/default.go
+++ b/vendor/github.com/dromara/carbon/v2/default.go
@@ -1,21 +1,23 @@
package carbon
+import "time"
+
var (
- // default layout
+ // DefaultLayout default layout
// 默认布局模板
- defaultLayout = DateTimeLayout
+ DefaultLayout = DateTimeLayout
- // default timezone
+ // DefaultTimezone default timezone
// 默认时区
- defaultTimezone = Local
+ DefaultTimezone = UTC
- // default week start date
+ // DefaultWeekStartsAt default default week start date
// 默认一周开始日期
- defaultWeekStartsAt = Sunday
+ DefaultWeekStartsAt = Sunday
- // default language locale
+ // DefaultLocale default language locale
// 默认语言区域
- defaultLocale = "en"
+ DefaultLocale = "en"
)
// Default defines a Default struct.
@@ -31,15 +33,28 @@ type Default struct {
// 设置全局默认值
func SetDefault(d Default) {
if d.Layout != "" {
- defaultLayout = d.Layout
+ DefaultLayout = d.Layout
}
if d.Timezone != "" {
- defaultTimezone = d.Timezone
+ loc, err := getLocationByTimezone(d.Timezone)
+ if err == nil {
+ time.Local = loc
+ DefaultTimezone = d.Timezone
+ }
}
if d.WeekStartsAt != "" {
- defaultWeekStartsAt = d.WeekStartsAt
+ DefaultWeekStartsAt = d.WeekStartsAt
}
if d.Locale != "" {
- defaultLocale = d.Locale
+ DefaultLocale = d.Locale
}
}
+
+// ResetDefault resets default.
+// 重置全局默认值
+func ResetDefault() {
+ DefaultLayout = DateTimeLayout
+ DefaultTimezone = UTC
+ DefaultWeekStartsAt = Sunday
+ DefaultLocale = "en"
+}
diff --git a/vendor/github.com/dromara/carbon/v2/difference.go b/vendor/github.com/dromara/carbon/v2/difference.go
index 414be971..045f85dc 100644
--- a/vendor/github.com/dromara/carbon/v2/difference.go
+++ b/vendor/github.com/dromara/carbon/v2/difference.go
@@ -13,14 +13,14 @@ const (
// 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, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
+ if start.IsInvalid() || 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) {
dy--
@@ -33,20 +33,20 @@ 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, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
+ if start.IsInvalid() || end.IsInvalid() {
+ return 0
+ }
if start.Month() == end.Month() && start.Year() == end.Year() {
return 0
}
@@ -56,161 +56,155 @@ 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, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
+ if start.IsInvalid() || 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, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
+ if start.IsInvalid() || 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, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
- return c.DiffInSeconds(end) / SecondsPerHour
+ if start.IsInvalid() || 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, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
- return c.DiffInSeconds(end) / SecondsPerMinute
+ if start.IsInvalid() || 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, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
- return end.Timestamp() - c.Timestamp()
+ if start.IsInvalid() || 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())
- }
+// 相差字符串,支持 i18n
+func (c *Carbon) DiffInString(carbon ...*Carbon) string {
+ start, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
- if c.Error != nil || end.Error != nil {
+ if start.IsInvalid() || end.IsInvalid() {
return ""
}
- unit, value := c.diff(end)
+ 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())
- }
+// 相差字符串,支持 i18n(绝对值)
+func (c *Carbon) DiffAbsInString(carbon ...*Carbon) string {
+ start, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
- if c.Error != nil || end.Error != nil {
+ if start.IsInvalid() || end.IsInvalid() {
return ""
}
- unit, value := c.diff(end)
+ 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) time.Duration {
+ start, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
- return end.StdTime().Sub(c.StdTime())
+ if start.IsInvalid() || 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 {
+func (c *Carbon) DiffAbsInDuration(carbon ...*Carbon) time.Duration {
d := c.DiffInDuration(carbon...)
if d >= 0 {
return d
@@ -219,19 +213,16 @@ func (c Carbon) DiffAbsInDuration(carbon ...Carbon) time.Duration {
}
// 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())
- }
+// 获取对人类友好的可读格式时间差,支持 i18n
+func (c *Carbon) DiffForHumans(carbon ...*Carbon) string {
+ start, end := c, Now(c.Timezone())
if len(carbon) > 0 {
end = carbon[0]
}
- if c.Error != nil || end.Error != nil {
+ if start.IsInvalid() || end.IsInvalid() {
return ""
}
- unit, value := c.diff(end)
+ unit, value := start.diff(end)
translation := c.lang.translate(unit, getAbsValue(value))
if unit == "now" {
return translation
@@ -250,7 +241,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 +271,19 @@ 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)
+ y, m, d, h, i, s, ns := start.DateTimeNano()
+ endYear, endMonth, _ := end.Date()
+
+ yearDiff := endYear - y
+ monthDiff := endMonth - m
+ totalMonths := yearDiff*12 + monthDiff
+
+ if time.Date(y, time.Month(m+totalMonths), d, h, i, s, ns, start.StdTime().Location()).After(end.StdTime()) {
+ return int64(totalMonths - 1)
+ }
+ return int64(totalMonths)
}
diff --git a/vendor/github.com/dromara/carbon/v2/errors.go b/vendor/github.com/dromara/carbon/v2/errors.go
index 0f2ca0b5..d8aec160 100644
--- a/vendor/github.com/dromara/carbon/v2/errors.go
+++ b/vendor/github.com/dromara/carbon/v2/errors.go
@@ -4,16 +4,46 @@ import (
"fmt"
)
+// returns a failed parse error.
+// 解析失败错误
+var failedParseError = func(value string) error {
+ return fmt.Errorf("cannot parse %q as carbon, please make sure the value is valid", value)
+}
+
+// returns a invalid timestamp error.
+// 无效的时间戳错误
+var invalidTimestampError = func(value string) error {
+ return fmt.Errorf("invalid timestamp %s, please make sure the timestamp is valid", value)
+}
+
+// returns a nil location error.
+// 无效的位置错误
+var nilLocationError = func() error {
+ return fmt.Errorf("location cannot be nil")
+}
+
+// returns a nil language error.
+// 无效的语言错误
+var nilLanguageError = func() error {
+ return fmt.Errorf("language cannot be nil")
+}
+
+// returns a empty timezone error.
+// 空的时区错误
+var emptyTimezoneError = func() error {
+ return fmt.Errorf("timezone cannot be empty")
+}
+
// 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")
}
-// returns an invalid location error.
-// 无效的地区错误
-var invalidLocationError = func() error {
- return fmt.Errorf("invalid location, please make sure the location is valid")
+// returns an empty duration error.
+// 空的时长错误
+var emptyDurationError = func() error {
+ return fmt.Errorf("duration cannot be empty")
}
// returns an invalid duration error.
@@ -22,10 +52,10 @@ var invalidDurationError = func(duration string) error {
return fmt.Errorf("invalid duration %q, please make sure the duration is valid", duration)
}
-// 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)
+// returns an empty layout error.
+// 空的布局模板错误
+var emptyLayoutError = func() error {
+ return fmt.Errorf("layout cannot be empty")
}
// returns an invalid layout error.
@@ -34,8 +64,26 @@ 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)
}
+// returns an empty format error.
+// 空的格式模板错误
+var emptyFormatError = func() error {
+ return fmt.Errorf("format cannot be empty")
+}
+
// 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)
}
+
+// returns an empty week starts day error.
+// 空的周起始日期错误
+var emptyWeekStartsDayError = func() error {
+ return fmt.Errorf("week start day cannot be empty")
+}
+
+// returns an invalid week starts at day error.
+// 无效的周起始日期错误
+var invalidWeekStartsAtError = func(day string) error {
+ return fmt.Errorf("invalid week starts at day %s, please make sure the day is valid", day)
+}
diff --git a/vendor/github.com/dromara/carbon/v2/extremum.go b/vendor/github.com/dromara/carbon/v2/extremum.go
index 22a39a78..3ccb2465 100644
--- a/vendor/github.com/dromara/carbon/v2/extremum.go
+++ b/vendor/github.com/dromara/carbon/v2/extremum.go
@@ -2,51 +2,24 @@ 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)
+func MaxValue() *Carbon {
+ return create(9999, 12, 31, 23, 59, 59, 999999999, UTC)
}
// 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)
-}
-
-// 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
-}
-
-// 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
+func MinValue() *Carbon {
+ return create(-9998, 1, 1, 0, 0, 0, 0, UTC)
}
// Max returns the maximum Carbon instance from the given Carbon instance (second-precision).
// 返回最大的 Carbon 实例
-func Max(c1 Carbon, c2 ...Carbon) (c Carbon) {
+func Max(c1 *Carbon, c2 ...*Carbon) (c *Carbon) {
c = c1
for i := range c2 {
+ if c.IsInvalid() || c2[i].IsInvalid() {
+ return nil
+ }
if c2[i].Gte(c) {
c = c2[i]
}
@@ -56,12 +29,39 @@ func Max(c1 Carbon, c2 ...Carbon) (c Carbon) {
// Min returns the minimum Carbon instance from the given Carbon instance (second-precision).
// 返回最小的 Carbon 实例
-func Min(c1 Carbon, c2 ...Carbon) (c Carbon) {
+func Min(c1 *Carbon, c2 ...*Carbon) (c *Carbon) {
c = c1
for i := range c2 {
+ if c.IsInvalid() || c2[i].IsInvalid() {
+ return nil
+ }
if c2[i].Lte(c) {
c = c2[i]
}
}
return
}
+
+// Closest returns the closest Carbon instance from the given Carbon instance.
+// 返回离给定 carbon 实例最近的 Carbon 实例
+func (c *Carbon) Closest(c1 *Carbon, c2 *Carbon) *Carbon {
+ if c.IsInvalid() || c1.IsInvalid() || c2.IsInvalid() {
+ return nil
+ }
+ if c.DiffAbsInSeconds(c1) < c.DiffAbsInSeconds(c2) {
+ return c1
+ }
+ return c2
+}
+
+// Farthest returns the farthest Carbon instance from the given Carbon instance.
+// 返回离给定 carbon 实例最远的 Carbon 实例
+func (c *Carbon) Farthest(c1 *Carbon, c2 *Carbon) *Carbon {
+ if c.IsInvalid() || c1.IsInvalid() || c2.IsInvalid() {
+ return nil
+ }
+ if c.DiffAbsInSeconds(c1) > c.DiffAbsInSeconds(c2) {
+ return c1
+ }
+ return c2
+}
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..9c66a60a
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/frozen.go
@@ -0,0 +1,41 @@
+package carbon
+
+import "sync"
+
+type TestNow struct {
+ isFrozen bool
+ frozenNow *Carbon
+ rw *sync.RWMutex
+}
+
+var testNow = &TestNow{
+ rw: new(sync.RWMutex),
+}
+
+// SetTestNow sets a test Carbon instance (real or mock) to be returned when a "now" instance is created.
+// 设置当前测试时间
+func SetTestNow(carbon *Carbon) {
+ testNow.rw.Lock()
+ defer testNow.rw.Unlock()
+
+ testNow.isFrozen = true
+ testNow.frozenNow = carbon
+}
+
+// CleanTestNow clears a test Carbon instance (real or mock) to be returned when a "now" instance is created.
+// 清除当前测试时间
+func CleanTestNow() {
+ testNow.rw.Lock()
+ defer testNow.rw.Unlock()
+
+ testNow.isFrozen = false
+}
+
+// IsTestNow report whether is testing time.
+// 是否是测试时间
+func IsTestNow() bool {
+ testNow.rw.Lock()
+ defer testNow.rw.Unlock()
+
+ return testNow.isFrozen
+}
diff --git a/vendor/github.com/dromara/carbon/v2/getter.go b/vendor/github.com/dromara/carbon/v2/getter.go
index 112848c8..7ec81368 100644
--- a/vendor/github.com/dromara/carbon/v2/getter.go
+++ b/vendor/github.com/dromara/carbon/v2/getter.go
@@ -6,8 +6,8 @@ import (
// StdTime gets standard time.Time.
// 获取标准 time.Time
-func (c Carbon) StdTime() time.Time {
- if c.time.IsZero() {
+func (c *Carbon) StdTime() time.Time {
+ if c.loc == nil {
return c.time
}
return c.time.In(c.loc)
@@ -15,8 +15,8 @@ func (c Carbon) StdTime() time.Time {
// 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() {
@@ -27,8 +27,8 @@ 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()
@@ -36,8 +36,8 @@ func (c Carbon) DaysInMonth() int {
// 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())
@@ -45,8 +45,8 @@ func (c Carbon) MonthOfYear() int {
// 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()
@@ -54,8 +54,8 @@ func (c Carbon) DayOfYear() int {
// 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()
@@ -63,8 +63,8 @@ func (c Carbon) DayOfMonth() int {
// DayOfWeek gets day of week like 6.
// 获取本周的第几天
-func (c Carbon) DayOfWeek() int {
- if c.Error != nil {
+func (c *Carbon) DayOfWeek() int {
+ if c.IsInvalid() {
return 0
}
day := int(c.StdTime().Weekday())
@@ -76,8 +76,8 @@ func (c Carbon) DayOfWeek() int {
// 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 {
+func (c *Carbon) WeekOfYear() int {
+ if c.IsInvalid() {
return 0
}
_, week := c.StdTime().ISOWeek()
@@ -86,8 +86,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
@@ -99,8 +99,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()
@@ -110,8 +110,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()
@@ -120,8 +120,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()
@@ -130,8 +130,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()
@@ -140,8 +140,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
@@ -151,8 +151,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()
@@ -161,8 +161,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()
@@ -171,8 +171,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()
@@ -181,8 +181,8 @@ 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()
@@ -190,8 +190,8 @@ func (c Carbon) Time() (hour, minute, second int) {
// 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()
@@ -200,8 +200,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()
@@ -210,8 +210,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()
@@ -220,8 +220,8 @@ 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
@@ -229,8 +229,8 @@ func (c Carbon) Century() int {
// 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
@@ -238,8 +238,8 @@ func (c Carbon) Decade() int {
// 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()
@@ -247,8 +247,8 @@ func (c Carbon) Year() int {
// 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()
@@ -267,14 +267,14 @@ 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
@@ -282,14 +282,14 @@ func (c Carbon) Week() int {
// 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()
@@ -297,17 +297,17 @@ func (c Carbon) Hour() int {
// 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.
+// Second gets current second like 9.
// 获取当前秒数
-func (c Carbon) Second() int {
- if c.Error != nil {
+func (c *Carbon) Second() int {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Second()
@@ -315,8 +315,8 @@ func (c Carbon) Second() int {
// 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
@@ -324,8 +324,8 @@ func (c Carbon) Millisecond() int {
// 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
@@ -333,8 +333,8 @@ func (c Carbon) Microsecond() int {
// 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()
@@ -342,8 +342,8 @@ func (c Carbon) Nanosecond() int {
// Timestamp gets timestamp with second like 1596604455.
// 输出秒级时间戳
-func (c Carbon) Timestamp() int64 {
- if c.Error != nil {
+func (c *Carbon) Timestamp() int64 {
+ if c.IsInvalid() {
return 0
}
return c.StdTime().Unix()
@@ -351,8 +351,8 @@ func (c Carbon) Timestamp() int64 {
// TimestampMilli gets timestamp with millisecond like 1596604455000.
// 获取毫秒级时间戳
-func (c Carbon) TimestampMilli() int64 {
- if c.Error != nil {
+func (c *Carbon) TimestampMilli() int64 {
+ if c.IsInvalid() {
return 0
}
t := c.StdTime()
@@ -361,8 +361,8 @@ func (c Carbon) TimestampMilli() int64 {
// TimestampMicro gets timestamp with microsecond like 1596604455000000.
// 获取微秒级时间戳
-func (c Carbon) TimestampMicro() int64 {
- if c.Error != nil {
+func (c *Carbon) TimestampMicro() int64 {
+ if c.IsInvalid() {
return 0
}
t := c.StdTime()
@@ -371,62 +371,87 @@ func (c Carbon) TimestampMicro() int64 {
// TimestampNano gets timestamp with nanosecond like 1596604455000000000.
// 获取纳秒级时间戳
-func (c Carbon) TimestampNano() int64 {
- if c.Error != nil {
+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 ""
}
+ if c.IsZero() {
+ // prevent returning to LMT timezone before 1901
+ name, _ := time.Now().In(c.loc).Zone()
+ return name
+ }
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
}
+ if c.IsZero() {
+ // prevent returning to LMT timezone before 1901
+ _, offset := time.Now().In(c.loc).Zone()
+ return offset
+ }
_, offset := c.StdTime().Zone()
return offset
}
// 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
}
+// WeekStartsAt returns start day of the week.
+// 获取一周的开始日期
+func (c *Carbon) WeekStartsAt() string {
+ if c.IsInvalid() {
+ return ""
+ }
+ return c.weekStartsAt.String()
+}
+
+// CurrentLayout returns the layout used for parsing the time string.
+// 获取当前布局模板
+func (c *Carbon) CurrentLayout() string {
+ if c.IsInvalid() {
+ return ""
+ }
+ return c.layout
+}
+
// Age gets age like 18.
// 获取年龄
-func (c Carbon) Age() int {
- if c.Error != nil {
+func (c *Carbon) Age() int {
+ if c.IsInvalid() {
return 0
}
- now := c.Now()
- if c.IsSetTestNow() {
- now = CreateFromTimestampNano(c.testNow, c.Location())
- }
- if c.TimestampNano() > now.TimestampNano() {
+ now := Now(c.Timezone())
+ 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..287b2565 100644
--- a/vendor/github.com/dromara/carbon/v2/helper.go
+++ b/vendor/github.com/dromara/carbon/v2/helper.go
@@ -17,9 +17,9 @@ var weekdays = map[string]time.Weekday{
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.
@@ -45,15 +45,20 @@ var formats = map[byte]string{
'V': "timestampMilli", // TimestampMilli with second. Eg: 1596604455666.
'X': "timestampMicro", // TimestampMicro with second. Eg: 1596604455666666.
'Z': "timestampNano", // TimestampNano with second. Eg: 1596604455666666666.
+
+ 'v': "999", // Millisecond. Eg: 999.
+ 'x': "999999", // Microsecond. Eg: 999999.
+ 'z': "999999999", // Nanosecond. Eg: 999999999.
}
-// common layout symbols
-// 常规布局模板符号
-var layouts = []string{
- DayDateTimeLayout,
- DateTimeLayout, DateTimeNanoLayout, ShortDateTimeLayout, ShortDateTimeNanoLayout,
+// supported layouts
+// 支持的布局模板
+var supportedLayouts = []string{
+ DateTimeLayout, DateLayout, TimeLayout,
+ ISO8601Layout, DayDateTimeLayout, ISO8601NanoLayout,
+ DateTimeNanoLayout, ShortDateTimeLayout, ShortDateTimeNanoLayout,
DateLayout, DateNanoLayout, ShortDateLayout, ShortDateNanoLayout,
- ISO8601Layout, ISO8601NanoLayout,
+ TimeMicroLayout, TimeMilliLayout, TimeNanoLayout,
RFC822Layout, RFC822ZLayout, RFC850Layout, RFC1123Layout, RFC1123ZLayout, RFC3339Layout, RFC3339NanoLayout, RFC1036Layout, RFC7231Layout,
KitchenLayout,
CookieLayout,
@@ -84,7 +89,7 @@ var layouts = []string{
func format2layout(format string) string {
buffer := bytes.NewBuffer(nil)
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] {
@@ -103,6 +108,9 @@ func format2layout(format string) string {
// gets a Location instance by a timezone string.
// 通过时区获取 Location 实例
func getLocationByTimezone(timezone string) (*time.Location, error) {
+ if timezone == "" {
+ return nil, emptyTimezoneError()
+ }
loc, err := time.LoadLocation(timezone)
if err != nil {
err = invalidTimezoneError(timezone)
@@ -113,6 +121,9 @@ func getLocationByTimezone(timezone string) (*time.Location, error) {
// parses as a Duration instance by a duration string.
// 通过时长解析
func parseByDuration(duration string) (time.Duration, error) {
+ if duration == "" {
+ return 0, emptyDurationError()
+ }
td, err := time.ParseDuration(duration)
if err != nil {
err = invalidDurationError(duration)
diff --git a/vendor/github.com/dromara/carbon/v2/lang/ar.json b/vendor/github.com/dromara/carbon/v2/lang/ar.json
index 26d78f5f..04ff75d8 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/ar.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/ar.json
@@ -1,5 +1,6 @@
{
"name": "Arabic",
+ "author": "zumoshi",
"months": "يناير|فبراير|مارس|أبريل|مايو|يونيو|يوليو|أغسطس|سبتمبر|أكتوبر|نوفمبر|ديسمبر",
"short_months": "يناير|فبراير|مارس|أبريل|مايو|يونيو|يوليو|أغسطس|سبتمبر|أكتوبر|نوفمبر|ديسمبر",
"weeks": "الأحد|الإثنين|الثلاثاء|الأربعاء|الخميس|الجمعة|السبت",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/bg.json b/vendor/github.com/dromara/carbon/v2/lang/bg.json
index 8bd3fa7f..53a982a9 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/bg.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/bg.json
@@ -1,5 +1,6 @@
{
- "name": "Български",
+ "name": "Bulgarian",
+ "author": "yuksbg",
"months": "Януари|Февруари|Март|Април|Май|Юни|Юли|Август|Септември|Октомври|Ноември|Декември",
"short_months": "Ян|Фев|Март|Апр|Май|Юни|Юли|Авг|Сеп|Окт|Ноем|Дек",
"weeks": "Неделя|Понеделник|Вторник|Сряда|Четвъртък|Петък|Събота",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/de.json b/vendor/github.com/dromara/carbon/v2/lang/de.json
index fa5d809b..b373f318 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/de.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/de.json
@@ -1,5 +1,6 @@
{
"name": "German",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/dk.json b/vendor/github.com/dromara/carbon/v2/lang/dk.json
index a4230316..790fc186 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/dk.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/dk.json
@@ -1,5 +1,6 @@
{
"name": "Dansk",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/en.json b/vendor/github.com/dromara/carbon/v2/lang/en.json
index 6dbc46a2..80489cc6 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/en.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/en.json
@@ -1,5 +1,6 @@
{
"name": "English",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/es.json b/vendor/github.com/dromara/carbon/v2/lang/es.json
index 3b8ac7d2..e66e00d4 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/es.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/es.json
@@ -1,5 +1,6 @@
{
"name": "Spanish",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/fa.json b/vendor/github.com/dromara/carbon/v2/lang/fa.json
index 7d10d9d2..edba18ad 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/fa.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/fa.json
@@ -1,5 +1,6 @@
{
"name": "Farsi",
+ "author": "erfanMomeniii",
"months": "ژانویه|فوریه|مارس|آوریل|مه|ژوئن|ژوئیه|اوت|سپتامبر|اکتبر|نوامبر|دسامبر",
"short_months": "ژانویه|فوریه|مارس|آوریل|مه|ژوئن|ژوئیه|اوت|سپتامبر|اکتبر|نوامبر|دسامبر",
"weeks": "یکشنبه|دوشنبه|سهشنبه|چهارشنبه|پنجشنبه|جمعه|شنبه",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/fr.json b/vendor/github.com/dromara/carbon/v2/lang/fr.json
index 4fd0f57b..95ae5a84 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/fr.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/fr.json
@@ -1,5 +1,6 @@
{
"name": "French",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/hi.json b/vendor/github.com/dromara/carbon/v2/lang/hi.json
index 72b44bad..d9246d22 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/hi.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/hi.json
@@ -1,5 +1,6 @@
{
"name": "Hindi",
+ "author": "chauhan17nitin",
"months": "जनवरी|फ़रवरी|मार्च|अप्रैल|मई|जून|जुलाई|अगस्त|सितंबर|अक्टूबर|नवंबर|दिसंबर",
"short_months": "जन|फ़र|मार्च|अप्रैल|मई|जून|जुलाई|अगस्त|सितंबर|अक्टूबर|नवंबर|दिसंबर",
"weeks": "रविवार|सोमवार|मंगलवार|बुधवार|गुरुवार|शुक्रवार|शनिवार",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/hu.json b/vendor/github.com/dromara/carbon/v2/lang/hu.json
index edcf23f1..f5a09f2e 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/hu.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/hu.json
@@ -1,5 +1,6 @@
{
"name": "Hungarian",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/id.json b/vendor/github.com/dromara/carbon/v2/lang/id.json
index e57fdfce..ed79a4d7 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/id.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/id.json
@@ -1,5 +1,6 @@
{
"name": "Indonesian",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/it.json b/vendor/github.com/dromara/carbon/v2/lang/it.json
index a2164f45..41b4f13f 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/it.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/it.json
@@ -1,5 +1,6 @@
{
"name": "Italian",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/jp.json b/vendor/github.com/dromara/carbon/v2/lang/jp.json
index e5808401..1ac0a3bf 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/jp.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/jp.json
@@ -1,5 +1,6 @@
{
"name": "Japanese",
+ "author": "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": "日曜日|月曜日|火曜日|水曜日|木曜日|金曜日|土曜日",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/kr.json b/vendor/github.com/dromara/carbon/v2/lang/kr.json
index 978d3a88..038ce6ae 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/kr.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/kr.json
@@ -1,5 +1,6 @@
{
"name": "Korean",
+ "author": "nannul",
"months": "일월|이월|삼월|사월|오월|유월|칠월|팔월|구월|시월|십일월|십이월",
"short_months": "1월|2월|3월|4월|5월|6월|7월|8월|9월|10월|11월|12월",
"weeks": "일요일|월요일|화요일|수요일|목요일|금요일|토요일",
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..fd75cd1a 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/ms-MY.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/ms-MY.json
@@ -1,5 +1,6 @@
{
"name": "Bahasa Malaysia",
+ "author": "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",
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..5a3d5ddf
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/lang/nb.json
@@ -0,0 +1,21 @@
+{
+ "name": "Norsk bokmål",
+ "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..d009e105 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/nl.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/nl.json
@@ -1,5 +1,6 @@
{
"name": "Dutch",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/pl.json b/vendor/github.com/dromara/carbon/v2/lang/pl.json
index 03ba9d98..05840ca6 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/pl.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/pl.json
@@ -1,5 +1,6 @@
{
"name": "Polish",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/pt.json b/vendor/github.com/dromara/carbon/v2/lang/pt.json
index 1602eead..15cef82d 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/pt.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/pt.json
@@ -1,5 +1,6 @@
{
"name": "Portuguese",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/ro.json b/vendor/github.com/dromara/carbon/v2/lang/ro.json
index a11bc4b6..5230557c 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/ro.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/ro.json
@@ -1,5 +1,6 @@
{
"name": "Romanian",
+ "author": "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ă",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/ru.json b/vendor/github.com/dromara/carbon/v2/lang/ru.json
index 74439744..3331ee5b 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/ru.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/ru.json
@@ -1,5 +1,6 @@
{
"name": "Russian",
+ "author": "zemlyak",
"months": "Январь|Февраль|Март|Апрель|Май|Июнь|Июль|Август|Сентябрь|Октябрь|Ноябрь|Декабрь",
"short_months": "Янв|Фев|Мар|Апр|Май|Июн|Июл|Авг|Сен|Окт|Ноя|Дек",
"weeks": "Воскресенье|Понедельник|Вторник|Среда|Четверг|Пятница|Суббота",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/se.json b/vendor/github.com/dromara/carbon/v2/lang/se.json
index 5b210026..e8a71920 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/se.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/se.json
@@ -1,5 +1,6 @@
{
"name": "Swedish",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/th.json b/vendor/github.com/dromara/carbon/v2/lang/th.json
index 4ca378f4..4aadcc96 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/th.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/th.json
@@ -1,5 +1,6 @@
{
"name": "Thailand",
+ "author": "izcream",
"months": "มกราคม|กุมภาพันธ์|มีนาคม|เมษายน|พฤษภาคม|มิถุนายน|กรกฎาคม|สิงหาคม|กันยายน|ตุลาคม|พฤศจิกายน|ธันวาคม",
"short_months": "ม.ค.|ก.พ.|มี.ค.|เม.ย.|พ.ค.|มิ.ย.|ก.ค.|ส.ค.|ก.ย.|ต.ค.|พ.ย.|ธ.ค.",
"weeks": "อาทิตย์|จันทร์|อังคาร|พุธ|พฤหัสบดี|ศุกร์|เสาร์",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/tr.json b/vendor/github.com/dromara/carbon/v2/lang/tr.json
index c2bcddc8..17a2a5b5 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/tr.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/tr.json
@@ -1,5 +1,6 @@
{
"name": "Turkish",
+ "author": "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",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/uk.json b/vendor/github.com/dromara/carbon/v2/lang/uk.json
index e9791585..d81fd208 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/uk.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/uk.json
@@ -1,5 +1,6 @@
{
"name": "Ukrainian",
+ "author": "zumoshi",
"months": "січня|лютого|березня|квітня|травня|червня|липня|серпня|вересня|жовтня|листопада|грудня",
"short_months": "січ|лют|бер|квіт|трав|черв|лип|серп|вер|жовт|лист|груд",
"weeks": "неділя|понеділок|вівторок|середа|четвер|п’ятниця|субота",
diff --git a/vendor/github.com/dromara/carbon/v2/lang/vi.json b/vendor/github.com/dromara/carbon/v2/lang/vi.json
index 87a8ee9c..2af537cf 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/vi.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/vi.json
@@ -1,5 +1,6 @@
{
"name": "VietNamese",
+ "author": "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",
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..8a8e4340 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/zh-CN.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/zh-CN.json
@@ -1,5 +1,6 @@
{
"name": "Simplified Chinese",
+ "author": "gouguoyin",
"months": "一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月",
"short_months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
"weeks": "星期日|星期一|星期二|星期三|星期四|星期五|星期六",
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..12350d96 100644
--- a/vendor/github.com/dromara/carbon/v2/lang/zh-TW.json
+++ b/vendor/github.com/dromara/carbon/v2/lang/zh-TW.json
@@ -1,5 +1,6 @@
{
"name": "Traditional Chinese",
+ "author": "gouguoyin",
"months": "一月|二月|三月|四月|五月|六月|七月|八月|九月|十月|十一月|十二月",
"short_months": "1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月",
"weeks": "星期日|星期一|星期二|星期三|星期四|星期五|星期六",
diff --git a/vendor/github.com/dromara/carbon/v2/language.go b/vendor/github.com/dromara/carbon/v2/language.go
index e16e4522..33f62483 100644
--- a/vendor/github.com/dromara/carbon/v2/language.go
+++ b/vendor/github.com/dromara/carbon/v2/language.go
@@ -13,11 +13,23 @@ import (
var fs embed.FS
var (
+ // empty locale error
+ // 空区域错误
+ emptyLocaleError = func() error {
+ return fmt.Errorf("locale cannot be empty")
+ }
+
// 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)
}
+
+ // invalid resources error
+ // 无效的资源错误
+ invalidResourcesError = func() error {
+ return fmt.Errorf("invalid resources, please make sure the resources exists and is valid")
+ }
)
// Language defines a Language struct.
@@ -35,30 +47,27 @@ type Language struct {
func NewLanguage() *Language {
return &Language{
dir: "lang/",
- locale: defaultLocale,
+ 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
-}
-
// SetLocale sets language locale.
// 设置区域
func (lang *Language) SetLocale(locale string) *Language {
+ if lang == nil || lang.Error != nil {
+ return lang
+ }
+
+ if locale == "" {
+ lang.Error = emptyLocaleError()
+ 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)
@@ -73,6 +82,15 @@ func (lang *Language) SetLocale(locale string) *Language {
// SetResources sets language resources.
// 设置资源
func (lang *Language) SetResources(resources map[string]string) *Language {
+ if lang == nil || lang.Error != nil {
+ return lang
+ }
+
+ if resources == nil {
+ lang.Error = invalidResourcesError()
+ return lang
+ }
+
lang.rw.Lock()
defer lang.rw.Unlock()
@@ -91,8 +109,17 @@ func (lang *Language) SetResources(resources map[string]string) *Language {
// 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..0120c2cc 100644
--- a/vendor/github.com/dromara/carbon/v2/outputer.go
+++ b/vendor/github.com/dromara/carbon/v2/outputer.go
@@ -9,13 +9,16 @@ import (
// String implements the interface Stringer for Carbon struct.
// 实现 Stringer 接口
-func (c Carbon) String() string {
- return c.Layout(c.layout, c.Location())
+func (c *Carbon) String() string {
+ if c.IsInvalid() {
+ return ""
+ }
+ return c.Layout(c.layout, c.Timezone())
}
// GoString implements fmt.GoStringer and formats c to be printed in Go source code.
// 实现 fmt.GoStringer 接口,并格式化 c 以在 Go 源代码中打印
-func (c Carbon) GoString() string {
+func (c *Carbon) GoString() string {
if c.IsInvalid() {
return ""
}
@@ -24,30 +27,31 @@ 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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().String()
}
// ToMonthString outputs a string in month layout like "January", i18n is supported.
-// 输出完整月份字符串,支持i18n
-func (c Carbon) ToMonthString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+// 输出完整月份字符串,支持 i18n
+func (c *Carbon) ToMonthString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
+ 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,16 +62,16 @@ 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 {
- if c.IsInvalid() {
- return ""
- }
+// 输出缩写月份字符串,支持 i18n
+func (c *Carbon) ToShortMonthString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
+ c.lang.SetLocale(DefaultLocale)
}
c.lang.rw.RLock()
defer c.lang.rw.RUnlock()
@@ -81,16 +85,16 @@ 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 {
- if c.IsInvalid() {
- return ""
- }
+// 输出完整星期字符串,支持 i18n
+func (c *Carbon) ToWeekString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
+ c.lang.SetLocale(DefaultLocale)
}
c.lang.rw.RLock()
defer c.lang.rw.RUnlock()
@@ -104,16 +108,16 @@ 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 {
- if c.IsInvalid() {
- return ""
- }
+// 输出缩写星期字符串,支持 i18n
+func (c *Carbon) ToShortWeekString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
+ c.lang.SetLocale(DefaultLocale)
}
c.lang.rw.RLock()
defer c.lang.rw.RUnlock()
@@ -128,688 +132,688 @@ 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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToDayDateTimeString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToDateTimeString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToDateTimeMilliString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToDateTimeMicroString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToDateTimeNanoString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(DateTimeNanoLayout)
}
// ToShortDateTimeString outputs a string in "20060102150405" layout.
// 输出 "20060102150405" 格式字符串
-func (c Carbon) ToShortDateTimeString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortDateTimeString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortDateTimeLayout)
}
// ToShortDateTimeMilliString outputs a string in "20060102150405.999" layout.
// 输出 "20060102150405.999" 格式字符串
-func (c Carbon) ToShortDateTimeMilliString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortDateTimeMilliString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortDateTimeMilliLayout)
}
// ToShortDateTimeMicroString outputs a string in "20060102150405.999999" layout.
// 输出 "20060102150405.999999" 格式字符串
-func (c Carbon) ToShortDateTimeMicroString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortDateTimeMicroString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortDateTimeMicroLayout)
}
// ToShortDateTimeNanoString outputs a string in "20060102150405.999999999" layout.
// 输出 "20060102150405.999999999" 格式字符串
-func (c Carbon) ToShortDateTimeNanoString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortDateTimeNanoString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortDateTimeNanoLayout)
}
// ToDateString outputs a string in "2006-01-02" layout.
// 输出 "2006-01-02" 格式字符串
-func (c Carbon) ToDateString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToDateString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToDateMilliString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToDateMicroString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToDateNanoString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(DateNanoLayout)
}
// ToShortDateString outputs a string in "20060102" layout.
// 输出 "20060102" 格式字符串
-func (c Carbon) ToShortDateString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortDateString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortDateLayout)
}
// ToShortDateMilliString outputs a string in "20060102.999" layout.
// 输出 "20060102.999" 格式字符串
-func (c Carbon) ToShortDateMilliString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortDateMilliString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortDateMilliLayout)
}
// ToShortDateMicroString outputs a string in "20060102.999999" layout.
// 输出 "20060102.999999" 格式字符串
-func (c Carbon) ToShortDateMicroString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortDateMicroString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortDateMicroLayout)
}
// ToShortDateNanoString outputs a string in "20060102.999999999" layout.
// 输出 "20060102.999999999" 格式字符串
-func (c Carbon) ToShortDateNanoString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortDateNanoString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortDateNanoLayout)
}
// ToTimeString outputs a string in "15:04:05" layout.
// 输出 "15:04:05" 格式字符串
-func (c Carbon) ToTimeString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToTimeString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToTimeMilliString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToTimeMicroString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToTimeNanoString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(TimeNanoLayout)
}
// ToShortTimeString outputs a string in "150405" layout.
// 输出 "150405" 格式字符串
-func (c Carbon) ToShortTimeString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortTimeString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortTimeLayout)
}
// ToShortTimeMilliString outputs a string in "150405.999" layout.
// 输出 "150405.999" 格式字符串
-func (c Carbon) ToShortTimeMilliString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortTimeMilliString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortTimeMilliLayout)
}
// ToShortTimeMicroString outputs a string in "150405.999999" layout.
// 输出 "150405.999999" 格式字符串
-func (c Carbon) ToShortTimeMicroString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortTimeMicroString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(ShortTimeMicroLayout)
}
// ToShortTimeNanoString outputs a string in "150405.999999999" layout.
// 输出 "150405.999999999" 格式字符串
-func (c Carbon) ToShortTimeNanoString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToShortTimeNanoString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToAtomString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToAnsicString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToCookieString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRssString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToW3cString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToUnixDateString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRubyDateString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(RubyDateLayout)
}
// ToKitchenString outputs a string in "3:04PM" layout.
// 输出 "3:04PM" 格式字符串
-func (c Carbon) ToKitchenString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToKitchenString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToIso8601String(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToIso8601MilliString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToIso8601MicroString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToIso8601NanoString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToIso8601ZuluString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToIso8601ZuluMilliString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToIso8601ZuluMicroString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToIso8601ZuluNanoString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc822String(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc822zString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc850String(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc1036String(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc1123String(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc1123zString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc2822String(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc3339String(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc3339MilliString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc3339MicroString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc3339NanoString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToRfc7231String(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(RFC7231Layout)
}
// ToFormattedDateString outputs a string in "Jan 2, 2006" layout.
// 输出 "Jan 2, 2006" 格式字符串
-func (c Carbon) ToFormattedDateString(timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToFormattedDateString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
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 {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) ToFormattedDayDateString(timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(FormattedDayDateLayout)
}
// Layout outputs a string by layout.
// 输出指定布局模板的时间字符串
-func (c Carbon) Layout(layout string, timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) Layout(layout string, timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
return c.StdTime().Format(layout)
}
// Format outputs a string by format.
// 输出指定格式模板的时间字符串
-func (c Carbon) Format(format string, timezone ...string) string {
- if c.IsInvalid() {
- return ""
- }
+func (c *Carbon) Format(format string, timezone ...string) string {
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.IsInvalid() {
+ return ""
+ }
buffer := bytes.NewBuffer(nil)
for i := 0; i < len(format); i++ {
- if layout, ok := formats[format[i]]; ok {
+ if layout, ok := formatMap[format[i]]; ok {
// support for i18n specific symbols
switch format[i] {
case 'l': // week, such as Monday
@@ -862,26 +866,15 @@ 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
+ buffer.WriteString(c.Timezone())
+ 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..bd319b59 100644
--- a/vendor/github.com/dromara/carbon/v2/parser.go
+++ b/vendor/github.com/dromara/carbon/v2/parser.go
@@ -7,86 +7,102 @@ import (
// 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
+func Parse(value string, timezone ...string) *Carbon {
+ c := NewCarbon()
+ if value == "" {
+ return nil
}
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
+ if c.HasError() {
+ return c
+ }
switch value {
case "now":
- return c.Now(timezone...)
+ return Now(c.Timezone())
case "yesterday":
- return c.Yesterday(timezone...)
+ return Yesterday(c.Timezone())
case "tomorrow":
- return c.Tomorrow(timezone...)
+ return Tomorrow(c.Timezone())
}
- for _, layout := range layouts {
- t, err := time.ParseInLocation(layout, value, c.loc)
- if err == nil {
- c.time = t
+ for _, layout := range supportedLayouts {
+ if tt, err := time.ParseInLocation(layout, value, c.loc); err == nil {
+ c.time = tt
+ c.layout = layout
return c
}
}
- c.Error = invalidValueError(value)
+ c.Error = failedParseError(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)
+func ParseByFormat(value, format string, timezone ...string) *Carbon {
+ c := NewCarbon()
+ if value == "" {
+ return nil
}
- 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...)
+ if format == "" {
+ c.Error = emptyFormatError()
+ return c
+ }
+ c = ParseByLayout(value, format2layout(format), timezone...)
+ if c.HasError() {
+ c.Error = invalidFormatError(value, format)
+ }
+ return c
}
// 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)
+func ParseByLayout(value, layout string, timezone ...string) *Carbon {
+ c := NewCarbon()
+ if value == "" {
+ return nil
+ }
+ if layout == "" {
+ c.Error = emptyLayoutError()
return c
}
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- if c.Error != nil {
+ if c.HasError() {
return c
}
- if len(layout) == 0 {
- layout = defaultLayout
- }
if layout == "timestamp" {
- timestamp, _ := strconv.ParseInt(value, 10, 64)
- return c.CreateFromTimestamp(timestamp)
+ ts, err := strconv.ParseInt(value, 10, 64)
+ if err != nil {
+ c.Error = invalidTimestampError(value)
+ return c
+ }
+ return CreateFromTimestamp(ts, c.Timezone())
}
if layout == "timestampMilli" {
- timestamp, _ := strconv.ParseInt(value, 10, 64)
- return c.CreateFromTimestampMilli(timestamp)
+ ts, err := strconv.ParseInt(value, 10, 64)
+ if err != nil {
+ c.Error = invalidTimestampError(value)
+ return c
+ }
+ return CreateFromTimestampMilli(ts, c.Timezone())
}
if layout == "timestampMicro" {
- timestamp, _ := strconv.ParseInt(value, 10, 64)
- return c.CreateFromTimestampMicro(timestamp)
+ ts, err := strconv.ParseInt(value, 10, 64)
+ if err != nil {
+ c.Error = invalidTimestampError(value)
+ return c
+ }
+ return CreateFromTimestampMicro(ts, c.Timezone())
}
if layout == "timestampNano" {
- timestamp, _ := strconv.ParseInt(value, 10, 64)
- return c.CreateFromTimestampNano(timestamp)
+ ts, err := strconv.ParseInt(value, 10, 64)
+ if err != nil {
+ c.Error = invalidTimestampError(value)
+ return c
+ }
+ return CreateFromTimestampNano(ts, c.Timezone())
}
tt, err := time.ParseInLocation(layout, value, c.loc)
if err != nil {
@@ -94,11 +110,56 @@ func (c Carbon) ParseByLayout(value, layout string, timezone ...string) Carbon {
return c
}
c.time = tt
+ c.layout = 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...)
+// ParseWithLayouts parses time string with layouts as a Carbon instance.
+// 通过自定义布局模板将时间字符串解析成 Carbon 实例
+func ParseWithLayouts(value string, layouts []string, timezone ...string) *Carbon {
+ c := NewCarbon()
+ if value == "" {
+ return nil
+ }
+ if len(timezone) > 0 {
+ c.loc, c.Error = getLocationByTimezone(timezone[0])
+ }
+ if c.HasError() {
+ return c
+ }
+ if len(layouts) == 0 {
+ return Parse(value, timezone...)
+ }
+ for _, layout := range append(supportedLayouts, layouts...) {
+ if tt, err := time.ParseInLocation(layout, value, c.loc); err == nil {
+ c.time = tt
+ c.layout = layout
+ return c
+ }
+ }
+ c.Error = failedParseError(value)
+ return c
+}
+
+// ParseWithFormats parses time string with formats as a Carbon instance.
+// 通过自定义格式化模板将时间字符串解析成 Carbon 实例
+func ParseWithFormats(value string, formats []string, timezone ...string) *Carbon {
+ c := NewCarbon()
+ if value == "" {
+ return nil
+ }
+ if len(timezone) > 0 {
+ c.loc, c.Error = getLocationByTimezone(timezone[0])
+ }
+ if c.HasError() {
+ return c
+ }
+ if len(formats) == 0 {
+ return Parse(value, timezone...)
+ }
+ var layouts []string
+ for _, format := range formats {
+ layouts = append(layouts, format2layout(format))
+ }
+ return ParseWithLayouts(value, layouts, timezone...)
}
diff --git a/vendor/github.com/dromara/carbon/v2/season.go b/vendor/github.com/dromara/carbon/v2/season.go
index 76402c75..9d74b9bc 100644
--- a/vendor/github.com/dromara/carbon/v2/season.go
+++ b/vendor/github.com/dromara/carbon/v2/season.go
@@ -22,13 +22,13 @@ 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 {
+// 获取当前季节(以气象划分),支持 i18n
+func (c *Carbon) Season() string {
+ if c.IsInvalid() {
return ""
}
if len(c.lang.resources) == 0 {
- c.lang.SetLocale(defaultLocale)
+ c.lang.SetLocale(DefaultLocale)
}
index := -1
month := c.Month()
@@ -51,37 +51,37 @@ 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()
if month == 1 || month == 2 {
- return c.create(year-1, 12, 1, 0, 0, 0, 0)
+ return create(year-1, 12, 1, 0, 0, 0, 0, c.Timezone())
}
- return c.create(year, month/3*3, 1, 0, 0, 0, 0)
+ return create(year, month/3*3, 1, 0, 0, 0, 0, c.Timezone())
}
// 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()
if month == 1 || month == 2 {
- return c.create(year, 3, 0, 23, 59, 59, 999999999)
+ return create(year, 3, 0, 23, 59, 59, 999999999, c.Timezone())
}
if month == 12 {
- return c.create(year+1, 3, 0, 23, 59, 59, 999999999)
+ return create(year+1, 3, 0, 23, 59, 59, 999999999, c.Timezone())
}
- return c.create(year, month/3*3+3, 0, 23, 59, 59, 999999999)
+ return create(year, month/3*3+3, 0, 23, 59, 59, 999999999, c.Timezone())
}
// 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()
@@ -93,8 +93,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()
@@ -106,8 +106,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()
@@ -119,8 +119,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..3992fa39 100644
--- a/vendor/github.com/dromara/carbon/v2/setter.go
+++ b/vendor/github.com/dromara/carbon/v2/setter.go
@@ -4,63 +4,135 @@ import (
"time"
)
-// SetWeekStartsAt sets start day of the week.
-// 设置一周的开始日期
-func (c Carbon) SetWeekStartsAt(day string) Carbon {
- if c.Error != nil {
+// SetLayout sets layout.
+// 设置布局模板
+func (c *Carbon) SetLayout(layout string) *Carbon {
+ if layout == "" {
+ c.Error = emptyLayoutError()
+ }
+ if c.IsInvalid() {
return c
}
- if weekday, ok := weekdays[day]; ok {
- c.weekStartsAt = weekday
+ c.layout = layout
+ return c
+}
+
+// SetLayout sets globally default layout.
+// 设置全局默认布局模板
+func SetLayout(layout string) *Carbon {
+ c := NewCarbon().SetLayout(layout)
+ if !c.HasError() {
+ DefaultLayout = layout
+ }
+ return c
+}
+
+// SetFormat sets format.
+// 设置格式模板
+func (c *Carbon) SetFormat(format string) *Carbon {
+ if format == "" {
+ c.Error = emptyFormatError()
+ }
+ if c.IsInvalid() {
+ return c
+ }
+ c.layout = format2layout(format)
+ return c
+}
+
+// SetFormat sets globally default format.
+// 设置全局默认格式模板
+func SetFormat(format string) *Carbon {
+ layout := format2layout(format)
+ 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)
+// 设置周起始日期
+func (c *Carbon) SetWeekStartsAt(day string) *Carbon {
+ if day == "" {
+ c.Error = emptyWeekStartsDayError()
+ }
+ if c.IsInvalid() {
+ return c
+ }
+ if weekday, ok := weekdays[day]; ok {
+ c.weekStartsAt = weekday
+ } else {
+ c.Error = invalidWeekStartsAtError(day)
+ }
+ return c
+}
+
+// SetWeekStartsAt sets globally default start day of the week.
+// 设置全局默认周起始日期
+func SetWeekStartsAt(day string) *Carbon {
+ c := NewCarbon().SetWeekStartsAt(day)
+ if !c.HasError() {
+ DefaultWeekStartsAt = day
+ }
+ return c
}
// SetTimezone sets timezone.
// 设置时区
-func (c Carbon) SetTimezone(name string) Carbon {
- if c.Error != nil {
+func (c *Carbon) SetTimezone(name string) *Carbon {
+ if name == "" {
+ c.Error = emptyTimezoneError()
+ }
+ if c.IsInvalid() {
return c
}
c.loc, c.Error = getLocationByTimezone(name)
return c
}
-// SetTimezone sets timezone.
-// 设置时区
-func SetTimezone(name string) Carbon {
- return NewCarbon().SetTimezone(name)
+// SetTimezone sets globally default timezone.
+// 设置全局默认时区
+func SetTimezone(name string) *Carbon {
+ c := NewCarbon().SetTimezone(name)
+ if !c.HasError() {
+ time.Local = c.loc
+ DefaultTimezone = name
+ }
+ return c
}
// SetLocation sets location.
-// 设置地区
-func (c Carbon) SetLocation(loc *time.Location) Carbon {
- if c.Error != nil {
- return c
- }
+// 设置位置
+func (c *Carbon) SetLocation(loc *time.Location) *Carbon {
if loc == nil {
- c.Error = invalidLocationError()
+ c.Error = nilLocationError()
+ }
+ if c.IsInvalid() {
+ return c
}
c.loc = loc
return c
}
-// SetLocation sets location.
-// 设置地区
-func SetLocation(loc *time.Location) Carbon {
- return NewCarbon().SetLocation(loc)
+// SetLocation sets globally default location.
+// 设置全局默认位置
+func SetLocation(loc *time.Location) *Carbon {
+ c := NewCarbon().SetLocation(loc)
+ if !c.HasError() {
+ time.Local = loc
+ DefaultTimezone = loc.String()
+ }
+ return c
}
// 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 = emptyLocaleError()
+ }
+ if c.IsInvalid() {
return c
}
c.lang.SetLocale(locale)
@@ -68,145 +140,169 @@ func (c Carbon) SetLocale(locale string) Carbon {
return c
}
-// SetLocale sets locale.
-// 设置语言区域
-func SetLocale(locale string) Carbon {
- c := NewCarbon()
- c.lang.SetLocale(locale)
- c.Error = c.lang.Error
+// SetLocale sets globally default locale.
+// 设置全局默认语言区域
+func SetLocale(locale string) *Carbon {
+ c := NewCarbon().SetLocale(locale)
+ if !c.HasError() {
+ DefaultLocale = locale
+ }
+ return c
+}
+
+// SetLanguage sets language.
+// 设置语言对象
+func SetLanguage(lang *Language) *Carbon {
+ return NewCarbon().SetLanguage(lang)
+}
+
+// SetLanguage sets language.
+// 设置语言对象
+func (c *Carbon) SetLanguage(lang *Language) *Carbon {
+ if c.IsInvalid() {
+ return c
+ }
+ if lang == nil {
+ c.Error = nilLanguageError()
+ 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())
+ return create(year, month, day, hour, minute, second, c.Nanosecond(), c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, millisecond*1e6, c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, microsecond*1e3, c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, nanosecond, c.Timezone())
}
// 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())
+ return create(year, month, day, hour, minute, second, c.Nanosecond(), c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, millisecond*1e6, c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, microsecond*1e3, c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, nanosecond, c.Timezone())
}
// 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())
+ return create(year, month, day, hour, minute, second, c.Nanosecond(), c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, millisecond*1e6, c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, microsecond*1e3, c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, nanosecond, c.Timezone())
}
// 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())
+ return create(year, month, day, hour, minute, second, c.Nanosecond(), c.Timezone())
}
// 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())
@@ -214,18 +310,18 @@ func (c Carbon) SetYearNoOverflow(year int) Carbon {
// 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())
+ return create(year, month, day, hour, minute, second, c.Nanosecond(), c.Timezone())
}
// 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())
@@ -233,70 +329,70 @@ func (c Carbon) SetMonthNoOverflow(month int) Carbon {
// 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())
+ return create(year, month, day, hour, minute, second, c.Nanosecond(), c.Timezone())
}
// 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())
+ return create(year, month, day, hour, minute, second, c.Nanosecond(), c.Timezone())
}
// 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())
+ return create(year, month, day, hour, minute, second, c.Nanosecond(), c.Timezone())
}
// 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())
+ return create(year, month, day, hour, minute, second, c.Nanosecond(), c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, millisecond*1e6, c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, microsecond*1e3, c.Timezone())
}
// 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)
+ return create(year, month, day, hour, minute, second, nanosecond, c.Timezone())
}
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..0a0bfda6 100644
--- a/vendor/github.com/dromara/carbon/v2/traveler.go
+++ b/vendor/github.com/dromara/carbon/v2/traveler.go
@@ -6,186 +6,167 @@ import (
// Now returns a Carbon instance for now.
// 当前
-func (c Carbon) Now(timezone ...string) Carbon {
+func Now(timezone ...string) *Carbon {
+ c := NewCarbon()
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- if c.Error != nil {
+ if c.HasError() {
return c
}
- if c.IsSetTestNow() {
- now := CreateFromTimestampNano(c.testNow, c.Location())
- now.testNow = c.testNow
- return now
+ if IsTestNow() {
+ return testNow.frozenNow
}
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 {
+func Tomorrow(timezone ...string) *Carbon {
+ c := NewCarbon()
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- if c.Error != nil {
+ if c.HasError() {
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(c.Timezone()).Copy().AddDay()
}
// Yesterday returns a Carbon instance for yesterday.
// 昨天
-func (c Carbon) Yesterday(timezone ...string) Carbon {
+func Yesterday(timezone ...string) *Carbon {
+ c := NewCarbon()
if len(timezone) > 0 {
c.loc, c.Error = getLocationByTimezone(timezone[0])
}
- if c.Error != nil {
+ if c.HasError() {
return c
}
- if !c.IsZero() {
- return c.SubDay()
- }
- return c.Now().SubDay()
-}
-
-// Yesterday returns a Carbon instance for yesterday.
-// 昨天
-func Yesterday(timezone ...string) Carbon {
- return NewCarbon().Yesterday(timezone...)
+ return Now(c.Timezone()).Copy().SubDay()
}
// AddDuration adds one duration.
// 按照时长增加时间,支持整数/浮点数和符号ns(纳秒)、us(微妙)、ms(毫秒)、s(秒)、m(分钟)、h(小时)的组合
-func (c Carbon) AddDuration(duration string) Carbon {
+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
+ if 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 {
+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
}
@@ -195,35 +176,35 @@ 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()
+ lastYear, lastMonth, lastDay := create(year+years, month+1, 0, hour, minute, second, nanosecond, c.Timezone()).Date()
if day > lastDay {
day = lastDay
}
- return c.create(lastYear, lastMonth, day, hour, minute, second, nanosecond)
+ return create(lastYear, lastMonth, day, hour, minute, second, nanosecond, c.Timezone())
}
// 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
}
@@ -232,73 +213,73 @@ 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
}
@@ -308,83 +289,83 @@ 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()
+ lastYear, lastMonth, lastDay := create(year, month+months+1, 0, hour, minute, second, nanosecond, c.Timezone()).Date()
if day > lastDay {
day = lastDay
}
- return c.create(lastYear, lastMonth, day, hour, minute, second, nanosecond)
+ return create(lastYear, lastMonth, day, hour, minute, second, nanosecond, c.Timezone())
}
// 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
}
@@ -394,25 +375,25 @@ 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
}
@@ -423,25 +404,25 @@ func (c Carbon) AddHours(hours int) Carbon {
// 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
}
@@ -452,25 +433,25 @@ func (c Carbon) AddMinutes(minutes int) Carbon {
// 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
}
@@ -481,25 +462,25 @@ func (c Carbon) AddSeconds(seconds int) Carbon {
// 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
}
@@ -510,25 +491,25 @@ func (c Carbon) AddMilliseconds(milliseconds int) Carbon {
// 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
}
@@ -539,25 +520,25 @@ func (c Carbon) AddMicroseconds(microseconds int) Carbon {
// 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
}
@@ -568,18 +549,18 @@ func (c Carbon) AddNanoseconds(nanoseconds int) Carbon {
// 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/types.go b/vendor/github.com/dromara/carbon/v2/types.go
new file mode 100644
index 00000000..9ccba8fb
--- /dev/null
+++ b/vendor/github.com/dromara/carbon/v2/types.go
@@ -0,0 +1,89 @@
+package carbon
+
+// Timestamp defines a Timestamp type.
+// 定义 Timestamp 字段类型
+type Timestamp int64
+
+// SetPrecision implements TimestampFactory interface for Timestamp type.
+// 实现 TimestampFactory 接口
+func (t Timestamp) SetPrecision() int64 {
+ return PrecisionSecond
+}
+
+// TimestampMilli defines a TimestampMilli type.
+// 定义 TimestampMilli 字段类型
+type TimestampMilli int64
+
+// SetPrecision implements TimestampFactory interface for TimestampMilli type.
+// 实现 TimestampFactory 接口
+func (t TimestampMilli) SetPrecision() int64 {
+ return PrecisionMillisecond
+}
+
+// TimestampMicro defines a TimestampMicro type.
+// 定义 TimestampMicro 字段类型
+type TimestampMicro int64
+
+// SetPrecision implements TimestampFactory interface for TimestampMicro type.
+// 实现 TimestampFactory 接口
+func (t TimestampMicro) SetPrecision() int64 {
+ return PrecisionMicrosecond
+}
+
+// TimestampNano defines a TimestampNano type.
+// 定义 TimestampNano 字段类型
+type TimestampNano int64
+
+// SetPrecision implements TimestampFactory interface for TimestampNano type.
+// 实现 TimestampFactory 接口
+func (t TimestampNano) SetPrecision() int64 {
+ return PrecisionNanosecond
+}
+
+// DateTime defines a DateTime type.
+// 定义 DateTime 字段类型
+type DateTime string
+
+// SetFormat implements FormatFactory interface for DateTime type.
+// 实现 FormatFactory 接口
+func (t DateTime) SetFormat() string {
+ return DateTimeFormat
+}
+
+// SetLayout implements LayoutFactory interface for DateTime type.
+// 实现 LayoutFactory 接口
+func (t DateTime) SetLayout() string {
+ return DateTimeLayout
+}
+
+// Date defines a Date type.
+// 定义 Date 字段类型
+type Date string
+
+// SetFormat implements FormatFactory interface for Date type.
+// 实现 FormatFactory 接口
+func (t Date) SetFormat() string {
+ return DateFormat
+}
+
+// SetLayout implements LayoutFactory interface for Date type.
+// 实现 LayoutFactory 接口
+func (t Date) SetLayout() string {
+ return DateLayout
+}
+
+// Time defines a Time struct.
+// 定义 Time 字段类型
+type Time string
+
+// SetFormat implements FormatFactory interface for Time type.
+// 实现 FormatFactory 接口
+func (t Time) SetFormat() string {
+ return TimeFormat
+}
+
+// SetLayout implements LayoutFactory interface for Time type.
+// 实现 LayoutFactory 接口
+func (t Time) SetLayout() string {
+ return TimeLayout
+}
diff --git a/vendor/gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/sync_exchange.go b/vendor/gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/sync_exchange.go
index 4f67dfbf..8444856a 100644
--- a/vendor/gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/sync_exchange.go
+++ b/vendor/gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/sync_exchange.go
@@ -413,3 +413,16 @@ func SendResponse(packIn *sync_types.SyncPackage, packOut sync_types.SyncPackage
return nil
}
+
+func SendRawMessage(topic string, data []byte) error {
+ if !getIsInited() {
+ return fmt.Errorf("SendRawMessage, not inited")
+ }
+
+ // Отправка сообщения
+ err := nc.Publish(topic, data)
+ if err != nil {
+ return fmt.Errorf("SendRawMessage, Error: %v", err)
+ }
+ return nil
+}
diff --git a/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/db/tables/table_connections/table_connections.go b/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/db/tables/table_connections/table_connections.go
index 2e9bcde7..3180960d 100644
--- a/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/db/tables/table_connections/table_connections.go
+++ b/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/db/tables/table_connections/table_connections.go
@@ -11,6 +11,7 @@ type Table_Connection struct {
Name string `json:"name" gorm:"column:name;default:\"\""` //Наименование
Password string `json:"password" gorm:"column:password;default:\"\""` //Пароль
Port string `json:"port" gorm:"column:port;default:\"\""` //Номер порта
+ Prefix string `json:"prefix" gorm:"column:prefix;default:\"\""` //Префикс для автоматизации
Server string `json:"server" gorm:"column:server;default:\"\""` //Имя сервера, или ip-адрес
}
diff --git a/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/connections/connections_crud.go b/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/connections/connections_crud.go
index 0f2c6883..828ec62c 100644
--- a/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/connections/connections_crud.go
+++ b/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/connections/connections_crud.go
@@ -35,6 +35,7 @@ type ICrud_Connection interface {
Update_Name(*Connection) error
Update_Password(*Connection) error
Update_Port(*Connection) error
+ Update_Prefix(*Connection) error
Update_Server(*Connection) error
}
diff --git a/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/connections/connections_update.go b/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/connections/connections_update.go
index 7c7bb060..c9677045 100644
--- a/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/connections/connections_update.go
+++ b/vendor/gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/connections/connections_update.go
@@ -92,6 +92,17 @@ func (m *Connection) Update_Port() error {
return err
}
+// Update_Prefix - изменяет объект в БД по ID, присваивает Prefix
+func (m *Connection) Update_Prefix() error {
+ if Crud_Connection == nil {
+ return db_constants.ErrorCrudIsNotInit
+ }
+
+ err := Crud_Connection.Update_Prefix(m)
+
+ return err
+}
+
// Update_Server - изменяет объект в БД по ID, присваивает Server
func (m *Connection) Update_Server() error {
if Crud_Connection == nil {
diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go
index 948a3ee6..b8322598 100644
--- a/vendor/golang.org/x/sync/errgroup/errgroup.go
+++ b/vendor/golang.org/x/sync/errgroup/errgroup.go
@@ -118,6 +118,7 @@ func (g *Group) TryGo(f func() error) bool {
// SetLimit limits the number of active goroutines in this group to at most n.
// A negative value indicates no limit.
+// A limit of zero will prevent any new goroutines from being added.
//
// Any subsequent call to the Go method will block until it can add an active
// goroutine without exceeding the configured limit.
diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go
index 02609d5b..9c105f23 100644
--- a/vendor/golang.org/x/sys/cpu/cpu.go
+++ b/vendor/golang.org/x/sys/cpu/cpu.go
@@ -72,6 +72,9 @@ var X86 struct {
HasSSSE3 bool // Supplemental streaming SIMD extension 3
HasSSE41 bool // Streaming SIMD extension 4 and 4.1
HasSSE42 bool // Streaming SIMD extension 4 and 4.2
+ HasAVXIFMA bool // Advanced vector extension Integer Fused Multiply Add
+ HasAVXVNNI bool // Advanced vector extension Vector Neural Network Instructions
+ HasAVXVNNIInt8 bool // Advanced vector extension Vector Neural Network Int8 instructions
_ CacheLinePad
}
diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go
index 600a6807..1e642f33 100644
--- a/vendor/golang.org/x/sys/cpu/cpu_x86.go
+++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go
@@ -53,6 +53,9 @@ func initOptions() {
{Name: "sse41", Feature: &X86.HasSSE41},
{Name: "sse42", Feature: &X86.HasSSE42},
{Name: "ssse3", Feature: &X86.HasSSSE3},
+ {Name: "avxifma", Feature: &X86.HasAVXIFMA},
+ {Name: "avxvnni", Feature: &X86.HasAVXVNNI},
+ {Name: "avxvnniint8", Feature: &X86.HasAVXVNNIInt8},
// These capabilities should always be enabled on amd64:
{Name: "sse2", Feature: &X86.HasSSE2, Required: runtime.GOARCH == "amd64"},
@@ -106,7 +109,7 @@ func archInit() {
return
}
- _, ebx7, ecx7, edx7 := cpuid(7, 0)
+ eax7, ebx7, ecx7, edx7 := cpuid(7, 0)
X86.HasBMI1 = isSet(3, ebx7)
X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX
X86.HasBMI2 = isSet(8, ebx7)
@@ -134,14 +137,24 @@ func archInit() {
X86.HasAVX512VAES = isSet(9, ecx7)
X86.HasAVX512VBMI2 = isSet(6, ecx7)
X86.HasAVX512BITALG = isSet(12, ecx7)
-
- eax71, _, _, _ := cpuid(7, 1)
- X86.HasAVX512BF16 = isSet(5, eax71)
}
X86.HasAMXTile = isSet(24, edx7)
X86.HasAMXInt8 = isSet(25, edx7)
X86.HasAMXBF16 = isSet(22, edx7)
+
+ // These features depend on the second level of extended features.
+ if eax7 >= 1 {
+ eax71, _, _, edx71 := cpuid(7, 1)
+ if X86.HasAVX512 {
+ X86.HasAVX512BF16 = isSet(5, eax71)
+ }
+ if X86.HasAVX {
+ X86.HasAVXIFMA = isSet(23, eax71)
+ X86.HasAVXVNNI = isSet(4, eax71)
+ X86.HasAVXVNNIInt8 = isSet(4, edx71)
+ }
+ }
}
func isSet(bitpos uint, value uint32) bool {
diff --git a/vendor/golang.org/x/sys/unix/auxv.go b/vendor/golang.org/x/sys/unix/auxv.go
new file mode 100644
index 00000000..37a82528
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/auxv.go
@@ -0,0 +1,36 @@
+// Copyright 2025 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build go1.21 && (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos)
+
+package unix
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+//go:linkname runtime_getAuxv runtime.getAuxv
+func runtime_getAuxv() []uintptr
+
+// Auxv returns the ELF auxiliary vector as a sequence of key/value pairs.
+// The returned slice is always a fresh copy, owned by the caller.
+// It returns an error on non-ELF platforms, or if the auxiliary vector cannot be accessed,
+// which happens in some locked-down environments and build modes.
+func Auxv() ([][2]uintptr, error) {
+ vec := runtime_getAuxv()
+ vecLen := len(vec)
+
+ if vecLen == 0 {
+ return nil, syscall.ENOENT
+ }
+
+ if vecLen%2 != 0 {
+ return nil, syscall.EINVAL
+ }
+
+ result := make([]uintptr, vecLen)
+ copy(result, vec)
+ return unsafe.Slice((*[2]uintptr)(unsafe.Pointer(&result[0])), vecLen/2), nil
+}
diff --git a/vendor/golang.org/x/sys/unix/auxv_unsupported.go b/vendor/golang.org/x/sys/unix/auxv_unsupported.go
new file mode 100644
index 00000000..1200487f
--- /dev/null
+++ b/vendor/golang.org/x/sys/unix/auxv_unsupported.go
@@ -0,0 +1,13 @@
+// Copyright 2025 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build !go1.21 && (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos)
+
+package unix
+
+import "syscall"
+
+func Auxv() ([][2]uintptr, error) {
+ return nil, syscall.ENOTSUP
+}
diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go
index 21974af0..abc39554 100644
--- a/vendor/golang.org/x/sys/unix/syscall_solaris.go
+++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go
@@ -1102,3 +1102,90 @@ func (s *Strioctl) SetInt(i int) {
func IoctlSetStrioctlRetInt(fd int, req int, s *Strioctl) (int, error) {
return ioctlPtrRet(fd, req, unsafe.Pointer(s))
}
+
+// Ucred Helpers
+// See ucred(3c) and getpeerucred(3c)
+
+//sys getpeerucred(fd uintptr, ucred *uintptr) (err error)
+//sys ucredFree(ucred uintptr) = ucred_free
+//sys ucredGet(pid int) (ucred uintptr, err error) = ucred_get
+//sys ucredGeteuid(ucred uintptr) (uid int) = ucred_geteuid
+//sys ucredGetegid(ucred uintptr) (gid int) = ucred_getegid
+//sys ucredGetruid(ucred uintptr) (uid int) = ucred_getruid
+//sys ucredGetrgid(ucred uintptr) (gid int) = ucred_getrgid
+//sys ucredGetsuid(ucred uintptr) (uid int) = ucred_getsuid
+//sys ucredGetsgid(ucred uintptr) (gid int) = ucred_getsgid
+//sys ucredGetpid(ucred uintptr) (pid int) = ucred_getpid
+
+// Ucred is an opaque struct that holds user credentials.
+type Ucred struct {
+ ucred uintptr
+}
+
+// We need to ensure that ucredFree is called on the underlying ucred
+// when the Ucred is garbage collected.
+func ucredFinalizer(u *Ucred) {
+ ucredFree(u.ucred)
+}
+
+func GetPeerUcred(fd uintptr) (*Ucred, error) {
+ var ucred uintptr
+ err := getpeerucred(fd, &ucred)
+ if err != nil {
+ return nil, err
+ }
+ result := &Ucred{
+ ucred: ucred,
+ }
+ // set the finalizer on the result so that the ucred will be freed
+ runtime.SetFinalizer(result, ucredFinalizer)
+ return result, nil
+}
+
+func UcredGet(pid int) (*Ucred, error) {
+ ucred, err := ucredGet(pid)
+ if err != nil {
+ return nil, err
+ }
+ result := &Ucred{
+ ucred: ucred,
+ }
+ // set the finalizer on the result so that the ucred will be freed
+ runtime.SetFinalizer(result, ucredFinalizer)
+ return result, nil
+}
+
+func (u *Ucred) Geteuid() int {
+ defer runtime.KeepAlive(u)
+ return ucredGeteuid(u.ucred)
+}
+
+func (u *Ucred) Getruid() int {
+ defer runtime.KeepAlive(u)
+ return ucredGetruid(u.ucred)
+}
+
+func (u *Ucred) Getsuid() int {
+ defer runtime.KeepAlive(u)
+ return ucredGetsuid(u.ucred)
+}
+
+func (u *Ucred) Getegid() int {
+ defer runtime.KeepAlive(u)
+ return ucredGetegid(u.ucred)
+}
+
+func (u *Ucred) Getrgid() int {
+ defer runtime.KeepAlive(u)
+ return ucredGetrgid(u.ucred)
+}
+
+func (u *Ucred) Getsgid() int {
+ defer runtime.KeepAlive(u)
+ return ucredGetsgid(u.ucred)
+}
+
+func (u *Ucred) Getpid() int {
+ defer runtime.KeepAlive(u)
+ return ucredGetpid(u.ucred)
+}
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go
index 6ebc48b3..4f432bfe 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go
@@ -1245,6 +1245,7 @@ const (
FAN_REPORT_DFID_NAME = 0xc00
FAN_REPORT_DFID_NAME_TARGET = 0x1e00
FAN_REPORT_DIR_FID = 0x400
+ FAN_REPORT_FD_ERROR = 0x2000
FAN_REPORT_FID = 0x200
FAN_REPORT_NAME = 0x800
FAN_REPORT_PIDFD = 0x80
@@ -1330,8 +1331,10 @@ const (
FUSE_SUPER_MAGIC = 0x65735546
FUTEXFS_SUPER_MAGIC = 0xbad1dea
F_ADD_SEALS = 0x409
+ F_CREATED_QUERY = 0x404
F_DUPFD = 0x0
F_DUPFD_CLOEXEC = 0x406
+ F_DUPFD_QUERY = 0x403
F_EXLCK = 0x4
F_GETFD = 0x1
F_GETFL = 0x3
@@ -1551,6 +1554,7 @@ const (
IPPROTO_ROUTING = 0x2b
IPPROTO_RSVP = 0x2e
IPPROTO_SCTP = 0x84
+ IPPROTO_SMC = 0x100
IPPROTO_TCP = 0x6
IPPROTO_TP = 0x1d
IPPROTO_UDP = 0x11
@@ -1623,6 +1627,8 @@ const (
IPV6_UNICAST_IF = 0x4c
IPV6_USER_FLOW = 0xe
IPV6_V6ONLY = 0x1a
+ IPV6_VERSION = 0x60
+ IPV6_VERSION_MASK = 0xf0
IPV6_XFRM_POLICY = 0x23
IP_ADD_MEMBERSHIP = 0x23
IP_ADD_SOURCE_MEMBERSHIP = 0x27
@@ -1867,6 +1873,7 @@ const (
MADV_UNMERGEABLE = 0xd
MADV_WILLNEED = 0x3
MADV_WIPEONFORK = 0x12
+ MAP_DROPPABLE = 0x8
MAP_FILE = 0x0
MAP_FIXED = 0x10
MAP_FIXED_NOREPLACE = 0x100000
@@ -1967,6 +1974,7 @@ const (
MSG_PEEK = 0x2
MSG_PROXY = 0x10
MSG_RST = 0x1000
+ MSG_SOCK_DEVMEM = 0x2000000
MSG_SYN = 0x400
MSG_TRUNC = 0x20
MSG_TRYHARD = 0x4
@@ -2083,6 +2091,7 @@ const (
NFC_ATR_REQ_MAXSIZE = 0x40
NFC_ATR_RES_GB_MAXSIZE = 0x2f
NFC_ATR_RES_MAXSIZE = 0x40
+ NFC_ATS_MAXSIZE = 0x14
NFC_COMM_ACTIVE = 0x0
NFC_COMM_PASSIVE = 0x1
NFC_DEVICE_NAME_MAXSIZE = 0x8
@@ -2163,6 +2172,7 @@ const (
NFNL_SUBSYS_QUEUE = 0x3
NFNL_SUBSYS_ULOG = 0x4
NFS_SUPER_MAGIC = 0x6969
+ NFT_BITWISE_BOOL = 0x0
NFT_CHAIN_FLAGS = 0x7
NFT_CHAIN_MAXNAMELEN = 0x100
NFT_CT_MAX = 0x17
@@ -2491,6 +2501,7 @@ const (
PR_GET_PDEATHSIG = 0x2
PR_GET_SECCOMP = 0x15
PR_GET_SECUREBITS = 0x1b
+ PR_GET_SHADOW_STACK_STATUS = 0x4a
PR_GET_SPECULATION_CTRL = 0x34
PR_GET_TAGGED_ADDR_CTRL = 0x38
PR_GET_THP_DISABLE = 0x2a
@@ -2499,6 +2510,7 @@ const (
PR_GET_TIMING = 0xd
PR_GET_TSC = 0x19
PR_GET_UNALIGN = 0x5
+ PR_LOCK_SHADOW_STACK_STATUS = 0x4c
PR_MCE_KILL = 0x21
PR_MCE_KILL_CLEAR = 0x0
PR_MCE_KILL_DEFAULT = 0x2
@@ -2525,6 +2537,8 @@ const (
PR_PAC_GET_ENABLED_KEYS = 0x3d
PR_PAC_RESET_KEYS = 0x36
PR_PAC_SET_ENABLED_KEYS = 0x3c
+ PR_PMLEN_MASK = 0x7f000000
+ PR_PMLEN_SHIFT = 0x18
PR_PPC_DEXCR_CTRL_CLEAR = 0x4
PR_PPC_DEXCR_CTRL_CLEAR_ONEXEC = 0x10
PR_PPC_DEXCR_CTRL_EDITABLE = 0x1
@@ -2592,6 +2606,7 @@ const (
PR_SET_PTRACER = 0x59616d61
PR_SET_SECCOMP = 0x16
PR_SET_SECUREBITS = 0x1c
+ PR_SET_SHADOW_STACK_STATUS = 0x4b
PR_SET_SPECULATION_CTRL = 0x35
PR_SET_SYSCALL_USER_DISPATCH = 0x3b
PR_SET_TAGGED_ADDR_CTRL = 0x37
@@ -2602,6 +2617,9 @@ const (
PR_SET_UNALIGN = 0x6
PR_SET_VMA = 0x53564d41
PR_SET_VMA_ANON_NAME = 0x0
+ PR_SHADOW_STACK_ENABLE = 0x1
+ PR_SHADOW_STACK_PUSH = 0x4
+ PR_SHADOW_STACK_WRITE = 0x2
PR_SME_GET_VL = 0x40
PR_SME_SET_VL = 0x3f
PR_SME_SET_VL_ONEXEC = 0x40000
@@ -2911,7 +2929,6 @@ const (
RTM_NEWNEXTHOP = 0x68
RTM_NEWNEXTHOPBUCKET = 0x74
RTM_NEWNSID = 0x58
- RTM_NEWNVLAN = 0x70
RTM_NEWPREFIX = 0x34
RTM_NEWQDISC = 0x24
RTM_NEWROUTE = 0x18
@@ -2920,6 +2937,7 @@ const (
RTM_NEWTCLASS = 0x28
RTM_NEWTFILTER = 0x2c
RTM_NEWTUNNEL = 0x78
+ RTM_NEWVLAN = 0x70
RTM_NR_FAMILIES = 0x1b
RTM_NR_MSGTYPES = 0x6c
RTM_SETDCB = 0x4f
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
index c0d45e32..75207613 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
@@ -116,6 +116,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -304,6 +306,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
index c731d24f..c68acda5 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
@@ -116,6 +116,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -305,6 +307,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
index 680018a4..a8c607ab 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -310,6 +312,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
index a63909f3..18563dd8 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
@@ -109,6 +109,7 @@ const (
F_SETOWN = 0x8
F_UNLCK = 0x2
F_WRLCK = 0x1
+ GCS_MAGIC = 0x47435300
HIDIOCGRAWINFO = 0x80084803
HIDIOCGRDESC = 0x90044802
HIDIOCGRDESCSIZE = 0x80044801
@@ -119,6 +120,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -302,6 +305,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
index 9b0a2573..22912cda 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go
@@ -116,6 +116,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -297,6 +299,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
index 958e6e06..29344eb3 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x80
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
+ IPV6_FLOWINFO_MASK = 0xfffffff
+ IPV6_FLOWLABEL_MASK = 0xfffff
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -303,6 +305,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
index 50c7f25b..20d51fb9 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x80
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
+ IPV6_FLOWINFO_MASK = 0xfffffff
+ IPV6_FLOWLABEL_MASK = 0xfffff
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -303,6 +305,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
index ced21d66..321b6090 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x80
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -303,6 +305,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
index 226c0441..9bacdf1e 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x80
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -303,6 +305,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
index 3122737c..c2242726 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
+ IPV6_FLOWINFO_MASK = 0xfffffff
+ IPV6_FLOWLABEL_MASK = 0xfffff
ISIG = 0x80
IUCLC = 0x1000
IXOFF = 0x400
@@ -358,6 +360,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
index eb5d3467..6270c8ee 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
+ IPV6_FLOWINFO_MASK = 0xfffffff
+ IPV6_FLOWLABEL_MASK = 0xfffff
ISIG = 0x80
IUCLC = 0x1000
IXOFF = 0x400
@@ -362,6 +364,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
index e921ebc6..9966c194 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
ISIG = 0x80
IUCLC = 0x1000
IXOFF = 0x400
@@ -362,6 +364,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
index 38ba81c5..848e5fcc 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
+ IPV6_FLOWINFO_MASK = 0xffffff0f
+ IPV6_FLOWLABEL_MASK = 0xffff0f00
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -294,6 +296,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
index 71f04009..669b2adb 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
@@ -115,6 +115,8 @@ const (
IN_CLOEXEC = 0x80000
IN_NONBLOCK = 0x800
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9
+ IPV6_FLOWINFO_MASK = 0xfffffff
+ IPV6_FLOWLABEL_MASK = 0xfffff
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -366,6 +368,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x36
SCM_TIMESTAMPING_PKTINFO = 0x3a
SCM_TIMESTAMPNS = 0x23
+ SCM_TS_OPT_ID = 0x51
SCM_TXTIME = 0x3d
SCM_WIFI_STATUS = 0x29
SECCOMP_IOCTL_NOTIF_ADDFD = 0x40182103
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
index c44a3133..4834e575 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go
@@ -119,6 +119,8 @@ const (
IN_CLOEXEC = 0x400000
IN_NONBLOCK = 0x4000
IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9
+ IPV6_FLOWINFO_MASK = 0xfffffff
+ IPV6_FLOWLABEL_MASK = 0xfffff
ISIG = 0x1
IUCLC = 0x200
IXOFF = 0x1000
@@ -357,6 +359,7 @@ const (
SCM_TIMESTAMPING_OPT_STATS = 0x38
SCM_TIMESTAMPING_PKTINFO = 0x3c
SCM_TIMESTAMPNS = 0x21
+ SCM_TS_OPT_ID = 0x5a
SCM_TXTIME = 0x3f
SCM_WIFI_STATUS = 0x25
SECCOMP_IOCTL_NOTIF_ADDFD = 0x80182103
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
index 829b87fe..c6545413 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go
@@ -141,6 +141,16 @@ import (
//go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so"
//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so"
//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so"
+//go:cgo_import_dynamic libc_getpeerucred getpeerucred "libc.so"
+//go:cgo_import_dynamic libc_ucred_get ucred_get "libc.so"
+//go:cgo_import_dynamic libc_ucred_geteuid ucred_geteuid "libc.so"
+//go:cgo_import_dynamic libc_ucred_getegid ucred_getegid "libc.so"
+//go:cgo_import_dynamic libc_ucred_getruid ucred_getruid "libc.so"
+//go:cgo_import_dynamic libc_ucred_getrgid ucred_getrgid "libc.so"
+//go:cgo_import_dynamic libc_ucred_getsuid ucred_getsuid "libc.so"
+//go:cgo_import_dynamic libc_ucred_getsgid ucred_getsgid "libc.so"
+//go:cgo_import_dynamic libc_ucred_getpid ucred_getpid "libc.so"
+//go:cgo_import_dynamic libc_ucred_free ucred_free "libc.so"
//go:cgo_import_dynamic libc_port_create port_create "libc.so"
//go:cgo_import_dynamic libc_port_associate port_associate "libc.so"
//go:cgo_import_dynamic libc_port_dissociate port_dissociate "libc.so"
@@ -280,6 +290,16 @@ import (
//go:linkname procgetpeername libc_getpeername
//go:linkname procsetsockopt libc_setsockopt
//go:linkname procrecvfrom libc_recvfrom
+//go:linkname procgetpeerucred libc_getpeerucred
+//go:linkname procucred_get libc_ucred_get
+//go:linkname procucred_geteuid libc_ucred_geteuid
+//go:linkname procucred_getegid libc_ucred_getegid
+//go:linkname procucred_getruid libc_ucred_getruid
+//go:linkname procucred_getrgid libc_ucred_getrgid
+//go:linkname procucred_getsuid libc_ucred_getsuid
+//go:linkname procucred_getsgid libc_ucred_getsgid
+//go:linkname procucred_getpid libc_ucred_getpid
+//go:linkname procucred_free libc_ucred_free
//go:linkname procport_create libc_port_create
//go:linkname procport_associate libc_port_associate
//go:linkname procport_dissociate libc_port_dissociate
@@ -420,6 +440,16 @@ var (
procgetpeername,
procsetsockopt,
procrecvfrom,
+ procgetpeerucred,
+ procucred_get,
+ procucred_geteuid,
+ procucred_getegid,
+ procucred_getruid,
+ procucred_getrgid,
+ procucred_getsuid,
+ procucred_getsgid,
+ procucred_getpid,
+ procucred_free,
procport_create,
procport_associate,
procport_dissociate,
@@ -2029,6 +2059,90 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl
// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+func getpeerucred(fd uintptr, ucred *uintptr) (err error) {
+ _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetpeerucred)), 2, uintptr(fd), uintptr(unsafe.Pointer(ucred)), 0, 0, 0, 0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ucredGet(pid int) (ucred uintptr, err error) {
+ r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procucred_get)), 1, uintptr(pid), 0, 0, 0, 0, 0)
+ ucred = uintptr(r0)
+ if e1 != 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ucredGeteuid(ucred uintptr) (uid int) {
+ r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procucred_geteuid)), 1, uintptr(ucred), 0, 0, 0, 0, 0)
+ uid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ucredGetegid(ucred uintptr) (gid int) {
+ r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procucred_getegid)), 1, uintptr(ucred), 0, 0, 0, 0, 0)
+ gid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ucredGetruid(ucred uintptr) (uid int) {
+ r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procucred_getruid)), 1, uintptr(ucred), 0, 0, 0, 0, 0)
+ uid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ucredGetrgid(ucred uintptr) (gid int) {
+ r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procucred_getrgid)), 1, uintptr(ucred), 0, 0, 0, 0, 0)
+ gid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ucredGetsuid(ucred uintptr) (uid int) {
+ r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procucred_getsuid)), 1, uintptr(ucred), 0, 0, 0, 0, 0)
+ uid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ucredGetsgid(ucred uintptr) (gid int) {
+ r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procucred_getsgid)), 1, uintptr(ucred), 0, 0, 0, 0, 0)
+ gid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ucredGetpid(ucred uintptr) (pid int) {
+ r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procucred_getpid)), 1, uintptr(ucred), 0, 0, 0, 0, 0)
+ pid = int(r0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func ucredFree(ucred uintptr) {
+ sysvicall6(uintptr(unsafe.Pointer(&procucred_free)), 1, uintptr(ucred), 0, 0, 0, 0, 0)
+ return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
func port_create() (n int, err error) {
r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_create)), 0, 0, 0, 0, 0, 0, 0)
n = int(r0)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go
index 524b0820..c79aaff3 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go
@@ -458,4 +458,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go
index f485dbf4..5eb45069 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go
@@ -381,4 +381,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go
index 70b35bf3..05e50297 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go
@@ -422,4 +422,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go
index 1893e2fe..38c53ec5 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go
@@ -325,4 +325,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go
index 16a4017d..31d2e71a 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go
@@ -321,4 +321,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go
index 7e567f1e..f4184a33 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go
@@ -442,4 +442,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 4460
SYS_LSM_LIST_MODULES = 4461
SYS_MSEAL = 4462
+ SYS_SETXATTRAT = 4463
+ SYS_GETXATTRAT = 4464
+ SYS_LISTXATTRAT = 4465
+ SYS_REMOVEXATTRAT = 4466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go
index 38ae55e5..05b99622 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go
@@ -372,4 +372,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 5460
SYS_LSM_LIST_MODULES = 5461
SYS_MSEAL = 5462
+ SYS_SETXATTRAT = 5463
+ SYS_GETXATTRAT = 5464
+ SYS_LISTXATTRAT = 5465
+ SYS_REMOVEXATTRAT = 5466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go
index 55e92e60..43a256e9 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go
@@ -372,4 +372,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 5460
SYS_LSM_LIST_MODULES = 5461
SYS_MSEAL = 5462
+ SYS_SETXATTRAT = 5463
+ SYS_GETXATTRAT = 5464
+ SYS_LISTXATTRAT = 5465
+ SYS_REMOVEXATTRAT = 5466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go
index 60658d6a..eea5ddfc 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go
@@ -442,4 +442,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 4460
SYS_LSM_LIST_MODULES = 4461
SYS_MSEAL = 4462
+ SYS_SETXATTRAT = 4463
+ SYS_GETXATTRAT = 4464
+ SYS_LISTXATTRAT = 4465
+ SYS_REMOVEXATTRAT = 4466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go
index e203e8a7..0d777bfb 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go
@@ -449,4 +449,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go
index 5944b97d..b4463650 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go
@@ -421,4 +421,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go
index c66d416d..0c7d21c1 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go
@@ -421,4 +421,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go
index a5459e76..84053916 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go
@@ -326,4 +326,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
index 01d86825..fcf1b790 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go
@@ -387,4 +387,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go
index 7b703e77..52d15b5f 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go
@@ -400,4 +400,8 @@ const (
SYS_LSM_SET_SELF_ATTR = 460
SYS_LSM_LIST_MODULES = 461
SYS_MSEAL = 462
+ SYS_SETXATTRAT = 463
+ SYS_GETXATTRAT = 464
+ SYS_LISTXATTRAT = 465
+ SYS_REMOVEXATTRAT = 466
)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go
index 5537148d..a46abe64 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go
@@ -4747,7 +4747,7 @@ const (
NL80211_ATTR_MAC_HINT = 0xc8
NL80211_ATTR_MAC_MASK = 0xd7
NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca
- NL80211_ATTR_MAX = 0x14c
+ NL80211_ATTR_MAX = 0x14d
NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4
NL80211_ATTR_MAX_CSA_COUNTERS = 0xce
NL80211_ATTR_MAX_MATCH_SETS = 0x85
@@ -5519,7 +5519,7 @@ const (
NL80211_MNTR_FLAG_CONTROL = 0x3
NL80211_MNTR_FLAG_COOK_FRAMES = 0x5
NL80211_MNTR_FLAG_FCSFAIL = 0x1
- NL80211_MNTR_FLAG_MAX = 0x6
+ NL80211_MNTR_FLAG_MAX = 0x7
NL80211_MNTR_FLAG_OTHER_BSS = 0x4
NL80211_MNTR_FLAG_PLCPFAIL = 0x2
NL80211_MPATH_FLAG_ACTIVE = 0x1
@@ -6174,3 +6174,5 @@ type SockDiagReq struct {
Family uint8
Protocol uint8
}
+
+const RTM_NEWNVLAN = 0x70
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 50fa202a..6c6008cb 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -122,8 +122,8 @@ github.com/denisenkom/go-mssqldb/internal/cp
github.com/denisenkom/go-mssqldb/internal/decimal
github.com/denisenkom/go-mssqldb/internal/querytext
github.com/denisenkom/go-mssqldb/msdsn
-# github.com/dromara/carbon/v2 v2.5.2
-## explicit; go 1.17
+# github.com/dromara/carbon/v2 v2.6.1
+## explicit; go 1.18
github.com/dromara/carbon/v2
github.com/dromara/carbon/v2/calendar
github.com/dromara/carbon/v2/calendar/julian
@@ -592,7 +592,7 @@ github.com/vmihailenco/tagparser/v2/internal/parser
# github.com/xhit/go-simple-mail/v2 v2.16.0
## explicit; go 1.13
github.com/xhit/go-simple-mail/v2
-# gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange v0.0.33
+# gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange v0.0.34
## explicit; go 1.22
gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange
gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/data_packer
@@ -600,8 +600,8 @@ gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/liveness
gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/sync_confirm
gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/sync_global
gitlab.aescorp.ru/dsp_dev/claim/common/sync_exchange/sync_types
-# gitlab.aescorp.ru/dsp_dev/claim/sync_service v1.2.242
-## explicit; go 1.22
+# gitlab.aescorp.ru/dsp_dev/claim/sync_service v1.2.268
+## explicit; go 1.22.1
gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/db/calc_struct_version
gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/db/db_constants
gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/db/tables/table_connections
@@ -728,7 +728,7 @@ golang.org/x/crypto/nacl/secretbox
golang.org/x/crypto/pbkdf2
golang.org/x/crypto/salsa20/salsa
golang.org/x/crypto/ssh/terminal
-# golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8
+# golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c
## explicit; go 1.22.0
golang.org/x/exp/constraints
golang.org/x/exp/maps
@@ -758,12 +758,12 @@ golang.org/x/oauth2/google/internal/stsexchange
golang.org/x/oauth2/internal
golang.org/x/oauth2/jws
golang.org/x/oauth2/jwt
-# golang.org/x/sync v0.10.0
+# golang.org/x/sync v0.11.0
## explicit; go 1.18
golang.org/x/sync/errgroup
golang.org/x/sync/semaphore
golang.org/x/sync/singleflight
-# golang.org/x/sys v0.29.0
+# golang.org/x/sys v0.30.0
## explicit; go 1.18
golang.org/x/sys/cpu
golang.org/x/sys/execabs
@@ -774,7 +774,7 @@ golang.org/x/sys/windows/registry
# golang.org/x/term v0.28.0
## explicit; go 1.18
golang.org/x/term
-# golang.org/x/text v0.21.0
+# golang.org/x/text v0.22.0
## explicit; go 1.18
golang.org/x/text/cases
golang.org/x/text/encoding
@@ -794,7 +794,7 @@ golang.org/x/text/transform
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm
golang.org/x/text/width
-# google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287
+# google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489
## explicit; go 1.22
google.golang.org/genproto/googleapis/rpc/status
# google.golang.org/grpc v1.70.0