From 8ee7b433383c56eabd0d58d2595fb96ccc10f372 Mon Sep 17 00:00:00 2001 From: Nikitin Aleksandr Date: Thu, 3 Apr 2025 14:37:57 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20Start=5F?= =?UTF-8?q?PprofNats()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 16 +- go.sum | 16 + pkg/version/version.txt | 2 +- .../sync_exchange_connect.go | 66 + .../sync_exchange_connect_test.go | 15 +- .../dromara/carbon/v2/.golangci.yml | 177 +++ .../github.com/dromara/carbon/v2/README.cn.md | 455 ++++--- .../github.com/dromara/carbon/v2/README.jp.md | 708 ++++++----- vendor/github.com/dromara/carbon/v2/README.md | 676 +++++----- .../github.com/dromara/carbon/v2/boundary.go | 116 +- .../github.com/dromara/carbon/v2/calendar.go | 45 +- .../dromara/carbon/v2/calendar/gregorian.go | 39 +- .../carbon/v2/calendar/julian/julian.go | 60 +- .../dromara/carbon/v2/calendar/lunar/lunar.go | 164 +-- .../carbon/v2/calendar/persian/persian.go | 62 +- vendor/github.com/dromara/carbon/v2/carbon.go | 475 +------ .../github.com/dromara/carbon/v2/comparer.go | 328 +++-- .../github.com/dromara/carbon/v2/constant.go | 288 +++++ .../dromara/carbon/v2/constellation.go | 30 +- .../github.com/dromara/carbon/v2/creator.go | 183 +-- .../github.com/dromara/carbon/v2/database.go | 1128 +++++------------ .../github.com/dromara/carbon/v2/default.go | 39 +- .../dromara/carbon/v2/difference.go | 169 ++- vendor/github.com/dromara/carbon/v2/errors.go | 64 +- .../github.com/dromara/carbon/v2/extremum.go | 72 +- vendor/github.com/dromara/carbon/v2/frozen.go | 41 + vendor/github.com/dromara/carbon/v2/getter.go | 217 ++-- vendor/github.com/dromara/carbon/v2/helper.go | 31 +- .../github.com/dromara/carbon/v2/lang/ar.json | 1 + .../github.com/dromara/carbon/v2/lang/bg.json | 3 +- .../github.com/dromara/carbon/v2/lang/de.json | 1 + .../github.com/dromara/carbon/v2/lang/dk.json | 1 + .../github.com/dromara/carbon/v2/lang/en.json | 1 + .../github.com/dromara/carbon/v2/lang/es.json | 1 + .../github.com/dromara/carbon/v2/lang/fa.json | 1 + .../github.com/dromara/carbon/v2/lang/fr.json | 1 + .../github.com/dromara/carbon/v2/lang/hi.json | 1 + .../github.com/dromara/carbon/v2/lang/hu.json | 1 + .../github.com/dromara/carbon/v2/lang/id.json | 1 + .../github.com/dromara/carbon/v2/lang/it.json | 1 + .../github.com/dromara/carbon/v2/lang/jp.json | 1 + .../github.com/dromara/carbon/v2/lang/kr.json | 1 + .../dromara/carbon/v2/lang/ms-MY.json | 1 + .../github.com/dromara/carbon/v2/lang/nb.json | 21 + .../github.com/dromara/carbon/v2/lang/nl.json | 1 + .../github.com/dromara/carbon/v2/lang/pl.json | 1 + .../github.com/dromara/carbon/v2/lang/pt.json | 1 + .../github.com/dromara/carbon/v2/lang/ro.json | 1 + .../github.com/dromara/carbon/v2/lang/ru.json | 1 + .../github.com/dromara/carbon/v2/lang/se.json | 1 + .../github.com/dromara/carbon/v2/lang/th.json | 1 + .../github.com/dromara/carbon/v2/lang/tr.json | 1 + .../github.com/dromara/carbon/v2/lang/uk.json | 1 + .../github.com/dromara/carbon/v2/lang/vi.json | 1 + .../dromara/carbon/v2/lang/zh-CN.json | 1 + .../dromara/carbon/v2/lang/zh-TW.json | 1 + .../github.com/dromara/carbon/v2/language.go | 55 +- .../github.com/dromara/carbon/v2/outputer.go | 541 ++++---- vendor/github.com/dromara/carbon/v2/parser.go | 157 ++- vendor/github.com/dromara/carbon/v2/season.go | 42 +- vendor/github.com/dromara/carbon/v2/setter.go | 296 +++-- vendor/github.com/dromara/carbon/v2/test.go | 19 - .../github.com/dromara/carbon/v2/traveler.go | 211 ++- vendor/github.com/dromara/carbon/v2/types.go | 89 ++ .../common/sync_exchange/sync_exchange.go | 13 + .../table_connections/table_connections.go | 1 + .../entities/connections/connections_crud.go | 1 + .../connections/connections_update.go | 11 + vendor/golang.org/x/sync/errgroup/errgroup.go | 1 + vendor/golang.org/x/sys/cpu/cpu.go | 3 + vendor/golang.org/x/sys/cpu/cpu_x86.go | 21 +- vendor/golang.org/x/sys/unix/auxv.go | 36 + .../golang.org/x/sys/unix/auxv_unsupported.go | 13 + .../golang.org/x/sys/unix/syscall_solaris.go | 87 ++ vendor/golang.org/x/sys/unix/zerrors_linux.go | 20 +- .../x/sys/unix/zerrors_linux_386.go | 3 + .../x/sys/unix/zerrors_linux_amd64.go | 3 + .../x/sys/unix/zerrors_linux_arm.go | 3 + .../x/sys/unix/zerrors_linux_arm64.go | 4 + .../x/sys/unix/zerrors_linux_loong64.go | 3 + .../x/sys/unix/zerrors_linux_mips.go | 3 + .../x/sys/unix/zerrors_linux_mips64.go | 3 + .../x/sys/unix/zerrors_linux_mips64le.go | 3 + .../x/sys/unix/zerrors_linux_mipsle.go | 3 + .../x/sys/unix/zerrors_linux_ppc.go | 3 + .../x/sys/unix/zerrors_linux_ppc64.go | 3 + .../x/sys/unix/zerrors_linux_ppc64le.go | 3 + .../x/sys/unix/zerrors_linux_riscv64.go | 3 + .../x/sys/unix/zerrors_linux_s390x.go | 3 + .../x/sys/unix/zerrors_linux_sparc64.go | 3 + .../x/sys/unix/zsyscall_solaris_amd64.go | 114 ++ .../x/sys/unix/zsysnum_linux_386.go | 4 + .../x/sys/unix/zsysnum_linux_amd64.go | 4 + .../x/sys/unix/zsysnum_linux_arm.go | 4 + .../x/sys/unix/zsysnum_linux_arm64.go | 4 + .../x/sys/unix/zsysnum_linux_loong64.go | 4 + .../x/sys/unix/zsysnum_linux_mips.go | 4 + .../x/sys/unix/zsysnum_linux_mips64.go | 4 + .../x/sys/unix/zsysnum_linux_mips64le.go | 4 + .../x/sys/unix/zsysnum_linux_mipsle.go | 4 + .../x/sys/unix/zsysnum_linux_ppc.go | 4 + .../x/sys/unix/zsysnum_linux_ppc64.go | 4 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 4 + .../x/sys/unix/zsysnum_linux_riscv64.go | 4 + .../x/sys/unix/zsysnum_linux_s390x.go | 4 + .../x/sys/unix/zsysnum_linux_sparc64.go | 4 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 6 +- vendor/modules.txt | 20 +- 108 files changed, 4093 insertions(+), 3502 deletions(-) create mode 100644 vendor/github.com/dromara/carbon/v2/.golangci.yml create mode 100644 vendor/github.com/dromara/carbon/v2/constant.go create mode 100644 vendor/github.com/dromara/carbon/v2/frozen.go create mode 100644 vendor/github.com/dromara/carbon/v2/lang/nb.json delete mode 100644 vendor/github.com/dromara/carbon/v2/test.go create mode 100644 vendor/github.com/dromara/carbon/v2/types.go create mode 100644 vendor/golang.org/x/sys/unix/auxv.go create mode 100644 vendor/golang.org/x/sys/unix/auxv_unsupported.go 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