carbon/carbon.go

484 lines
14 KiB
Go
Raw Permalink Normal View History

2021-08-10 10:56:06 +08:00
// @Package carbon
// @Description a simple, semantic and developer-friendly golang package for datetime
2024-11-24 23:57:25 +08:00
// @Page github.com/dromara/carbon
2022-05-20 00:01:49 +08:00
// @Developer gouguoyin
2024-11-25 03:58:40 +08:00
// @Blog www.gouguoyin.com
// @Email 245629560@qq.com
2021-02-23 09:32:55 +08:00
2021-08-10 10:56:06 +08:00
// Package carbon is a simple, semantic and developer-friendly golang package for datetime.
2020-09-07 17:10:33 +08:00
package carbon
import (
"time"
)
2021-02-18 14:32:31 +08:00
// Version current version
// 当前版本号
2024-11-29 11:21:28 +08:00
const Version = "2.5.1"
2022-04-19 22:50:03 +08:00
// timezone constants
2021-02-18 14:32:31 +08:00
// 时区常量
const (
Local = "Local" // 本地时间
UTC = "UTC" // 世界协调时间
GMT = "GMT" // 格林尼治标准时间
CST = "CST" // 中国标准时间
EET = "EET" // 欧洲东部标准时间
WET = "WET" // 欧洲西部标准时间
CET = "CET" // 欧洲中部标准时间
EST = "EST" // 美国东部标准时间
MST = "MST" // 美国山地标准时间
2021-02-18 14:32:31 +08:00
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" // 哈尔滨
2022-11-03 21:44:26 +08:00
Urumqi = "Asia/Urumqi" // 乌鲁木齐
HongKong = "Asia/Hong_Kong" // 香港
Macao = "Asia/Macao" // 澳门
Taipei = "Asia/Taipei" // 台北
Tokyo = "Asia/Tokyo" // 东京
2024-01-12 10:57:10 +08:00
HoChiMinh = "Asia/Ho_Chi_Minh" // 胡志明
Hanoi = "Asia/Hanoi" // 河内
Saigon = "Asia/Saigon" // 西贡
Seoul = "Asia/Seoul" // 首尔
2024-01-12 10:57:10 +08:00
Pyongyang = "Asia/Pyongyang" // 平壤
Bangkok = "Asia/Bangkok" // 曼谷
Dubai = "Asia/Dubai" // 迪拜
2024-01-12 10:57:10 +08:00
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" // 芝加哥
2024-01-12 10:57:10 +08:00
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" // 达尔文
2020-09-07 17:10:33 +08:00
)
// month constants
2021-02-18 14:32:31 +08:00
// 月份常量
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
2021-02-18 14:32:31 +08:00
// 星期常量
const (
Monday = "Monday" // 周一
Tuesday = "Tuesday" // 周二
Wednesday = "Wednesday" // 周三
Thursday = "Thursday" // 周四
Friday = "Friday" // 周五
Saturday = "Saturday" // 周六
Sunday = "Sunday" // 周日
)
// number constants
2021-02-18 14:32:31 +08:00
// 数字常量
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秒
2021-02-18 14:32:31 +08:00
)
// layout constants
2022-05-01 09:05:23 +08:00
// 布局模板常量
2021-02-18 14:32:31 +08:00
const (
AtomLayout = RFC3339Layout
2023-12-25 09:43:41 +08:00
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
2023-12-25 09:43:41 +08:00
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"
2024-03-06 08:06:22 +08: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"
2022-04-24 22:15:44 +08:00
DayDateTimeLayout = "Mon, Jan 2, 2006 3:04 PM"
DateTimeLayout = "2006-01-02 15:04:05"
DateTimeMilliLayout = "2006-01-02 15:04:05.999"
DateTimeMicroLayout = "2006-01-02 15:04:05.999999"
DateTimeNanoLayout = "2006-01-02 15:04:05.999999999"
ShortDateTimeLayout = "20060102150405"
ShortDateTimeMilliLayout = "20060102150405.999"
ShortDateTimeMicroLayout = "20060102150405.999999"
ShortDateTimeNanoLayout = "20060102150405.999999999"
2023-12-25 09:43:41 +08:00
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"
2021-02-18 14:32:31 +08:00
)
// 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"
2024-03-06 08:06:22 +08:00
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.
2021-07-28 15:18:05 +08:00
// 定义 Carbon 结构体
2020-09-12 08:32:15 +08:00
type Carbon struct {
2021-09-06 10:50:38 +08:00
time time.Time
2024-01-02 23:23:43 +08:00
testNow int64 // nanosecond timestamp of test now time
2024-11-24 23:57:25 +08:00
layout string
weekStartsAt time.Weekday
loc *time.Location
lang *Language
Error error
}
2021-08-10 10:56:06 +08:00
// NewCarbon returns a new Carbon instance.
2021-07-28 15:18:05 +08:00
// 初始化 Carbon 结构体
func NewCarbon() Carbon {
2024-01-12 10:57:10 +08:00
c := Carbon{lang: NewLanguage()}
2024-01-07 20:02:09 +08:00
c.loc, c.Error = getLocationByTimezone(defaultTimezone)
2024-01-12 10:57:10 +08:00
if weekday, ok := weekdays[defaultWeekStartsAt]; ok {
c.weekStartsAt = weekday
}
2024-10-11 22:51:44 +08:00
c.layout = defaultLayout
2023-08-25 17:35:21 +08:00
return c
2020-09-07 17:10:33 +08:00
}
2024-11-25 16:13:37 +08:00
// DateTime defines a DateTime struct.
// 定义 DateTime 结构体
type DateTime struct {
Carbon
}
// NewDateTime returns a new DateTime instance.
// 初始化 DateTime 结构体
func NewDateTime(carbon Carbon) DateTime {
return DateTime{Carbon: carbon}
}
// DateTimeMilli defines a DateTimeMilli struct.
// 定义 DateTimeMilli 结构体
type DateTimeMilli struct {
Carbon
}
// NewDateTimeMilli returns a new DateTimeMilli instance.
// 初始化 DateTimeMilli 结构体
func NewDateTimeMilli(carbon Carbon) DateTimeMilli {
return DateTimeMilli{Carbon: carbon}
}
// DateTimeMicro defines a DateTimeMicro struct.
// 定义 DateTimeMicro 结构体
type DateTimeMicro struct {
Carbon
}
// NewDateTimeMicro returns a new DateTimeMicro instance.
// 初始化 DateTimeMicro 结构体
func NewDateTimeMicro(carbon Carbon) DateTimeMicro {
return DateTimeMicro{Carbon: carbon}
}
// DateTimeNano defines a DateTimeNano struct.
// 定义 DateTimeNano 结构体
type DateTimeNano struct {
Carbon
}
// NewDateTimeNano returns a new DateTimeNano instance.
// 初始化 DateTimeNano 结构体
func NewDateTimeNano(carbon Carbon) DateTimeNano {
return DateTimeNano{Carbon: carbon}
}
// Date defines a Date struct.
// 定义 Date 结构体
type Date struct {
Carbon
}
// NewDate returns a new Date instance.
// 初始化 Date 结构体
func NewDate(carbon Carbon) Date {
return Date{Carbon: carbon}
}
// DateMilli defines a DateMilli struct.
// 定义 DateMilli 结构体
type DateMilli struct {
Carbon
}
// NewDateMilli returns a new DateMilli instance.
// 初始化 DateMilli 结构体
func NewDateMilli(carbon Carbon) DateMilli {
return DateMilli{Carbon: carbon}
}
// DateMicro defines a DateMicro struct.
// 定义 DateMicro 结构体
type DateMicro struct {
Carbon
}
// NewDateMicro returns a new DateMicro instance.
// 初始化 DateMicro 结构体
func NewDateMicro(carbon Carbon) DateMicro {
return DateMicro{Carbon: carbon}
}
// DateNano defines a DateNano struct.
// 定义 DateNano 结构体
type DateNano struct {
Carbon
}
// NewDateNano returns a new DateNano instance.
// 初始化 DateNano 结构体
func NewDateNano(carbon Carbon) DateNano {
return DateNano{Carbon: carbon}
}
// Time defines a Time struct.
// 定义 Time 结构体
type Time struct {
Carbon
}
// NewTime returns a new Time instance.
// 初始化 Time 结构体
func NewTime(carbon Carbon) Time {
return Time{Carbon: carbon}
}
// TimeMilli defines a TimeMilli struct.
// 定义 TimeMilli 结构体
type TimeMilli struct {
Carbon
}
// NewTimeMilli returns a new TimeMilli instance.
// 初始化 TimeMilli 结构体
func NewTimeMilli(carbon Carbon) TimeMilli {
return TimeMilli{Carbon: carbon}
}
// TimeMicro defines a TimeMicro struct.
// 定义 TimeMicro 结构体
type TimeMicro struct {
Carbon
}
// NewTimeMicro returns a new TimeMicro instance.
// 初始化 TimeMicro 结构体
func NewTimeMicro(carbon Carbon) TimeMicro {
return TimeMicro{Carbon: carbon}
}
// TimeNano defines a TimeNano struct.
// 定义 TimeNano 结构体
type TimeNano struct {
Carbon
}
// NewTimeNano returns a new TimeNano instance.
// 初始化 TimeNano 结构体
func NewTimeNano(carbon Carbon) TimeNano {
return TimeNano{Carbon: carbon}
}
// Timestamp defines a Timestamp struct.
// 定义 Timestamp 结构体
type Timestamp struct {
Carbon
}
// NewTimestamp returns a new Timestamp instance.
// 初始化 Timestamp 结构体
func NewTimestamp(carbon Carbon) Timestamp {
return Timestamp{Carbon: carbon}
}
// TimestampMilli defines a TimestampMilli struct.
// 定义 TimestampMilli 结构体
type TimestampMilli struct {
Carbon
}
// NewTimestampMilli returns a new TimestampMilli instance.
// 初始化 TimestampMilli 结构体
func NewTimestampMilli(carbon Carbon) TimestampMilli {
return TimestampMilli{Carbon: carbon}
}
// TimestampMicro defines a TimestampMicro struct.
// 定义 TimestampMicro 结构体
type TimestampMicro struct {
Carbon
}
// NewTimestampMicro returns a new TimestampMicro instance.
// 初始化 TimestampMicro 结构体
func NewTimestampMicro(carbon Carbon) TimestampMicro {
return TimestampMicro{Carbon: carbon}
}
// TimestampNano defines a TimestampNano struct.
// 定义 TimestampNano 结构体
type TimestampNano struct {
Carbon
}
// NewTimestampNano returns a new TimestampNano instance.
// 初始化 TimestampNano 结构体
func NewTimestampNano(carbon Carbon) TimestampNano {
return TimestampNano{Carbon: carbon}
}