Go-carbon:一款简洁、语义化且开发者友好的Golang时间处理包

Go-carbon:一款简洁、语义化且开发者友好的Golang时间处理包

Carbon

一个简单、语义化且对开发者友好的Golang日期时间包

如果您觉得它有帮助,请给我一个星标

安装

go get -u github.com/golang-module/carbon

import (
    "github.com/golang-module/carbon"
)     

使用和示例

默认时区是Local,假设当前时间是2020-08-05 13:14:15

昨天、今天和明天
// 今天的日期时间
carbon.Now().ToDateTimeString() // 2020-08-05 13:14:15
// 今天的日期
carbon.Now().ToDateString() // 2020-08-05
// 今天的时间
carbon.Now().ToTimeString() // 13:14:15
// 今天的秒级时间戳
carbon.Now().ToTimestamp() // 1596604455
carbon.Now().ToTimestampWithSecond() // 1596604455
// 今天的毫秒级时间戳
carbon.Now().ToTimestampWithMillisecond() // 1596604455000
// 今天的微秒级时间戳
carbon.Now().ToTimestampWithMicrosecond() // 1596604455000000
// 今天的纳秒级时间戳
carbon.Now().ToTimestampWithNanosecond() // 1596604455000000000
// 今天在其他时区的日期时间
carbon.SetTimezone(Carbon.NewYork).Now().ToDateTimeString() // 2020-08-05 01:14:15

// 昨天的日期时间
carbon.Yesterday().ToDateTimeString() // 2020-08-04 13:14:15
// 昨天的日期
carbon.Yesterday().ToDateString() // 2020-08-04
// 昨天的时间
carbon.Yesterday().ToTimeString() // 13:14:15
// 昨天的秒级时间戳
carbon.Yesterday().ToTimestamp() // 1596518055
carbon.Yesterday().ToTimestampWithSecond() // 1596518055
// 昨天的毫秒级时间戳
carbon.Yesterday().ToTimestampWithMillisecond() // 1596518055000
// 昨天的微秒级时间戳
carbon.Yesterday().ToTimestampWithMicrosecond() // 1596518055000000
// 昨天的纳秒级时间戳
carbon.Yesterday().ToTimestampWithNanosecond() // 1596518055000000000
// 昨天在其他时区的日期时间
carbon.SetTimezone(Carbon.NewYork).Yesterday().ToDateTimeString() // 2020-08-04 01:14:15
// 其他日期的昨天日期时间
carbon.Parse("2021-01-28 13:14:15").Yesterday().ToDateTimeString() // 2021-01-27 13:14:15

// 明天的日期时间
carbon.Tomorrow().ToDateTimeString() // 2020-08-06 13:14:15
// 明天的日期
carbon.Tomorrow().ToDateString() // 2020-08-06
// 明天的时间
carbon.Tomorrow().ToTimeString() // 13:14:15
// 明天的秒级时间戳
carbon.Tomorrow().ToTimestamp() // 1596690855
carbon.Tomorrow().ToTimestampWithSecond() // 1596690855
// 明天的毫秒级时间戳
carbon.Tomorrow().ToTimestampWithMillisecond() // 1596690855000
// 明天的微秒级时间戳
carbon.Tomorrow().ToTimestampWithMicrosecond() // 1596690855000000
// 明天的纳秒级时间戳
carbon.Tomorrow().ToTimestampWithNanosecond() // 1596690855000000000
// 明天在其他时区的日期时间
carbon.SetTimezone(Carbon.NewYork).Tomorrow().ToDateTimeString() // 2020-08-06 01:14:15
// 其他日期的明天日期时间
carbon.Parse("2021-01-28 13:14:15").Tomorrow().ToDateTimeString() // 2021-01-29 13:14:15
创建Carbon实例
// 从秒级时间戳创建Carbon实例
carbon.CreateFromTimestamp(1596604455).ToDateTimeString() // 2020-08-05 13:14:15
// 从毫秒级时间戳创建Carbon实例
carbon.CreateFromTimestamp(1596604455000).ToDateTimeString() // 2020-08-05 13:14:15
// 从微秒级时间戳创建Carbon实例
carbon.CreateFromTimestamp(1596604455000000).ToDateTimeString() // 2020-08-05 13:14:15
// 从纳秒级时间戳创建Carbon实例
carbon.CreateFromTimestamp(1596604455000000000).ToDateTimeString() // 2020-08-05 13:14:15

// 从年、月、日、时、分、秒创建Carbon实例
carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToDateTimeString() // 2020-08-05 13:14:15
// 从年、月、日创建Carbon实例
carbon.CreateFromDate(2020, 8, 5).ToDateTimeString() // 2020-08-05 13:14:15
// 从时、分、秒创建Carbon实例
carbon.CreateFromTime(13, 14, 15).ToDateTimeString() // 2020-08-05 13:14:15
解析标准时间格式字符串
carbon.Parse("").ToDateTimeString() // 空字符串
carbon.Parse("0000-00-00 00:00:00").ToDateTimeString() // 空字符串
carbon.Parse("0000-00-00").ToDateTimeString() // 空字符串
carbon.Parse("2020-08-05 13:14:15").ToDateTimeString() // 2020-08-05 13:14:15
carbon.Parse("2020-08-05").ToDateTimeString() // 2020-08-05 00:00:00
carbon.Parse("20200805131415").ToDateTimeString() // 2020-08-05 13:14:15
carbon.Parse("20200805").ToDateTimeString() // 2020-08-05 00:00:00
carbon.Parse("2020-08-05T13:14:15+08:00").ToDateTimeString() // 2020-08-05 00:00:00
按格式字符串解析为carbon
carbon.ParseByFormat("2020|08|05 13|14|15", "Y|m|d H|i|s").ToDateTimeString // 2020-08-05 13:14:15
carbon.ParseByFormat("It is 2020-08-05 13:14:15", "It is Y-m-d H:i:s").ToDateTimeString // 2020-08-05 13:14:15
Carbon和time.Time之间的转换
// Time.time转换为Carbon
carbon.Time2Carbon(time.Now())
// Carbon转换为Time.time
carbon.Now().Carbon2Time() 或 carbon.Now().Time
时间设置器
// 设置时区
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).SetTimezone(carbon.PRC).Now().ToDateTimeString() // 2020-08-05 13:14:15

// 设置年份
carbon.Parse("2019-08-05").SetYear(2020).ToDateString() // 2020-08-05
carbon.Parse("2020-02-29").SetYear(2019).ToDateString() // 2019-03-01

// 设置月份
carbon.Parse("2020-01-31").SetMonth(2).ToDateString() // 2020-03-02
carbon.Parse("2020-08-05").SetMonth(2).ToDateString() // 2020-02-05

// 设置日期
carbon.Parse("2019-08-05").SetDay(31).ToDateString() // 2020-08-31
carbon.Parse("2020-02-01").SetDay(31).ToDateString() // 2020-03-02

// 设置小时
carbon.Parse("2020-08-05 13:14:15").SetHour(10).ToDateTimeString() // 2020-08-05 10:14:15
carbon.Parse("2020-08-05 13:14:15").SetHour(24).ToDateTimeString() // 2020-08-06 00:14:15

// 设置分钟
carbon.Parse("2020-08-05 13:14:15").SetMinute(10).ToDateTimeString() // 2020-08-05 13:10:15
carbon.Parse("2020-08-05 13:14:15").SetMinute(60).ToDateTimeString() // 2020-08-05 14:00:15

// 设置秒数
carbon.Parse("2020-08-05 13:14:15").SetSecond(10).ToDateTimeString() // 2020-08-05 13:14:10
carbon.Parse("2020-08-05 13:14:15").SetSecond(60).ToDateTimeString() // 2020-08-05 13:15:00

更多时区常量,请查看const.go文件

开始和结束
// 年的开始
carbon.Parse("2020-08-05 13:14:15").StartOfYear().ToDateTimeString() // 2020-01-01 00:00:00
// 年的结束
carbon.Parse("2020-08-05 13:14:15").EndOfYear().ToDateTimeString() // 2020-12-31 23:59:59

// 月的开始
carbon.Parse("2020-08-05 13:14:15").StartOfMonth().ToStartTimeString() // 2020-08-01 00:00:00
// 月的结束
carbon.Parse("2020-08-05 13:14:15").EndOfMonth().ToDateTimeString() // 2020-08-31 23:59:59

// 周的开始
carbon.Parse("2020-08-05 13:14:15").StartOfWeek().ToDateTimeString() // 2020-08-03 00:00:00
// 周的结束
carbon.Parse("2020-08-05 13:14:15").LastOfWeek().ToDateTimeString() // 2020-08-09 23:59:59

// 天的开始
carbon.Parse("2020-08-05 13:14:15").StartOfDay().ToDateTimeString() // 2020-08-05 00:00:00
// 天的结束
carbon.Parse("2020-08-05 13:14:15").EndOfDay().ToDateTimeString() // 2020-08-05 23:59:59

// 小时的开始
carbon.Parse("2020-08-05 13:14:15").StartOfHour().ToDateTimeString() // 2020-08-05 13:00:00
// 小时的结束
carbon.Parse("2020-08-05 13:14:15").EndOfHour().ToDateTimeString() // 2020-08-05 13:59:59

// 分钟的开始
carbon.Parse("2020-08-05 13:14:15").StartOfMinute().ToDateTimeString() // 2020-08-05 13:14:00
// 分钟的结束
carbon.Parse("2020-08-05 13:14:15").EndOfMinute().ToDateTimeString() // 2020-08-05 13:14:59
时间差
// 周数差
carbon.Parse("2020-08-05 13:14:15").DiffInWeeks(carbon.Parse("2020-07-28 13:14:15")) // -1
// 周数差(绝对值)
carbon.Parse("2020-08-05 13:14:15").DiffInWeeksWithAbs(carbon.Parse("2020-07-28 13:14:15")) // 1

// 天数差
carbon.Parse("2020-08-05 13:14:15").DiffInDays(carbon.Parse("2020-08-04 13:14:15")) // -1
// 天数差(绝对值)
carbon.Parse("2020-08-05 13:14:15").DiffInDaysWithAbs(carbon.Parse("2020-08-04 13:14:15")) // 1

// 小时差
carbon.Parse("2020-08-05 13:14:15").DiffInHours(carbon.Parse("2020-08-05 12:14:15")) // -1
// 小时差(绝对值)
carbon.Parse("2020-08-05 13:14:15").DiffInHoursWithAbs(carbon.Parse("2020-08-05 12:14:15")) // 1

// 分钟差
carbon.Parse("2020-08-05 13:14:15").DiffInMinutes(carbon.Parse("2020-08-05 13:13:15")) // -1
// 分钟差(绝对值)
carbon.Parse("2020-08-05 13:14:15").DiffInMinutesWithAbs(carbon.Parse("2020-08-05 13:13:15")) // 1

// 秒数差
carbon.Parse("2020-08-05 13:14:15").DiffInSeconds(carbon.Parse("2020-08-05 13:14:14")) // -1
// 秒数差(绝对值)
carbon.Parse("2020-08-05 13:14:15").DiffInSecondsWithAbs(carbon.Parse("2020-08-05 13:14:14")) // 1
时间比较
// 大于
carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-04 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Gt(carbon.Parse("2020-08-05 13:14:15")) // false
carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-04 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Compare(">", carbon.Parse("2020-08-05 13:14:15")) // false

// 小于
carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-06 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Lt(carbon.Parse("2020-08-05 13:14:15")) // false
carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-06 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Compare("<", carbon.Parse("2020-08-05 13:14:15")) // false

// 等于
carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Eq(carbon.Parse("2020-08-05 13:14:00")) // false
carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Compare("=", carbon.Parse("2020-08-05 13:14:00")) // false

// 不等于
carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-06 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Ne(carbon.Parse("2020-08-05 13:14:15")) // false
carbon.Parse("2020-08-05 13:14:15").Compare("!=", carbon.Parse("2020-08-06 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Compare("<>", carbon.Parse("2020-08-05 13:14:15")) // false

// 大于等于
carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-04 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Gte(carbon.Parse("2020-08-05 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-04 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Compare(">=", carbon.Parse("2020-08-05 13:14:15")) // true

// 小于等于
carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-06 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Lte(carbon.Parse("2020-08-05 13:14:15")) // true
carbon.Parse("2020-08-05 13:14:15").Compare("<=", carbon

更多关于Go-carbon:一款简洁、语义化且开发者友好的Golang时间处理包的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

推荐

更多关于Go-carbon:一款简洁、语义化且开发者友好的Golang时间处理包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的推荐毫无价值。你是 Go carbon 包的 #1 贡献者。

golang-module/carbon 的贡献者 · GitHub

gouguoyin #1 87 次提交

Go-carbon确实是一个优秀的时间处理库,它提供了比标准库time包更直观的API。以下是一些补充示例:

时区处理示例:

// 设置和切换时区
c := carbon.SetTimezone(carbon.UTC).Parse("2023-01-01 12:00:00")
fmt.Println(c.ToDateTimeString()) // 2023-01-01 12:00:00

// 转换为其他时区
c.SetTimezone(carbon.Shanghai).ToDateTimeString() // 2023-01-01 20:00:00

时间运算示例:

// 加减时间
now := carbon.Now()
nextWeek := now.AddWeek() // 加一周
nextMonth := now.AddMonth() // 加一月
nextYear := now.AddYear() // 加一年

// 精确时间加减
future := now.AddHours(3).AddMinutes(30).AddSeconds(45)
past := now.SubHours(2).SubMinutes(15)

格式化输出示例:

c := carbon.Now()

// 自定义格式化
fmt.Println(c.Format("Y年m月d日 H时i分s秒")) // 2023年12月25日 14时30分15秒
fmt.Println(c.Format("l, F j, Y g:i A")) // Monday, December 25, 2023 2:30 PM

// ISO格式
fmt.Println(c.ToIso8601String()) // 2023-12-25T14:30:15+08:00
fmt.Println(c.ToRfc822String()) // 25 Dec 23 14:30 CST

时间段计算示例:

start := carbon.Parse("2023-01-01 00:00:00")
end := carbon.Parse("2023-12-31 23:59:59")

// 计算工作日(排除周末)
workdays := start.DiffInWeekdays(end)
fmt.Printf("全年工作日: %d天\n", workdays)

// 判断是否在时间范围内
checkTime := carbon.Parse("2023-06-15 12:00:00")
isInRange := checkTime.Between(start, end) // true

日期判断示例:

date := carbon.Parse("2023-12-25")

// 日期特性判断
fmt.Println(date.IsLeapYear()) // 是否闰年
fmt.Println(date.IsWeekend()) // 是否周末
fmt.Println(date.IsYesterday()) // 是否昨天
fmt.Println(date.IsToday()) // 是否今天
fmt.Println(date.IsTomorrow()) // 是否明天

// 特定日期判断
fmt.Println(date.IsChristmasDay()) // 是否圣诞节
fmt.Println(date.IsNewYearsDay()) // 是否元旦

时间序列生成示例:

// 生成时间范围
start := carbon.Parse("2023-01-01")
end := carbon.Parse("2023-01-10")

// 按天生成序列
days := make([]carbon.Carbon, 0)
for d := start.Copy(); d.Lte(end); d = d.AddDay() {
    days = append(days, d.Copy())
}

// 按月生成序列
startMonth := carbon.Parse("2023-01-01")
endMonth := carbon.Parse("2023-06-01")
months := make([]string, 0)
for m := startMonth.Copy(); m.Lte(endMonth); m = m.AddMonth() {
    months = append(months, m.Format("Y年m月"))
}

数据库时间处理示例:

// 处理数据库NULL时间
var dbTime *time.Time
// 假设从数据库查询得到的时间可能为NULL

carbonTime := carbon.Parse("")
if dbTime != nil {
    carbonTime = carbon.Time2Carbon(*dbTime)
}

// 安全地使用时间
if carbonTime.IsValid() {
    fmt.Println(carbonTime.ToDateTimeString())
} else {
    fmt.Println("时间无效")
}

性能关键场景示例:

// 重用Carbon实例以提高性能
var timePool = sync.Pool{
    New: func() interface{} {
        return carbon.NewCarbon()
    },
}

func getFastCarbon() carbon.Carbon {
    c := timePool.Get().(carbon.Carbon)
    c.SetTime(time.Now())
    return c
}

func putCarbon(c carbon.Carbon) {
    timePool.Put(c)
}

这些示例展示了go-carbon在实际开发中的常见用法,特别是在需要复杂时间操作和格式化的场景下,它比标准库提供了更简洁的API。

回到顶部