golang语义化时间处理与开发者友好插件库carbon的使用
Golang语义化时间处理与开发者友好插件库Carbon的使用
介绍
Carbon是一个简单、语义化且开发者友好的Golang时间处理包,具有100%单元测试覆盖率,不依赖任何第三方包,已被awesome-go和hello-github收录。
安装
要求Go版本 >= 1.21
// 通过github安装
go get -u github.com/dromara/carbon/v2
import "github.com/dromara/carbon/v2"
// 通过gitee安装
go get -u gitee.com/dromara/carbon/v2
import "gitee.com/dromara/carbon/v2"
// 通过gitcode安装
go get -u gitcode.com/dromara/carbon/v2
import "gitee.com/dromara/gitcode/v2"
示例用法
默认时区是UTC,语言环境是英语,一周的开始是星期一,周末是星期六和星期日。
package main
import (
"fmt"
"github.com/dromara/carbon/v2"
)
func main() {
// 设置测试时间
carbon.SetTestNow(carbon.Parse("2020-08-05 13:14:15.999999999"))
fmt.Println(carbon.IsTestNow()) // true
// 获取当前时间
fmt.Println(carbon.Now().ToString()) // 2020-08-05 13:14:15.999999999 +0000 UTC
// 获取昨天和明天
fmt.Println(carbon.Yesterday().ToString()) // 2020-08-04 13:14:15.999999999 +0000 UTC
fmt.Println(carbon.Tomorrow().ToString()) // 2020-08-06 13:14:15.999999999 +0000 UTC
// 解析时间字符串
fmt.Println(carbon.Parse("2020-08-05 13:14:15").ToString()) // 2020-08-05 13:14:15 +0000 UTC
fmt.Println(carbon.Parse("2022-03-08T03:01:14-07:00").ToString()) // 2022-03-08 10:01:14 +0000 UTC
// 使用布局和格式解析时间
fmt.Println(carbon.ParseByLayout("It is 2020-08-05 13:14:15", "It is 2006-01-02 15:04:05").ToString()) // 2020-08-05 13:14:15 +0000 UTC
fmt.Println(carbon.ParseByFormat("It is 2020-08-05 13:14:15", "\\I\\t \\i\\s Y-m-d H:i:s").ToString()) // 2020-08-05 13:14:15 +0000 UTC
// 从日期/时间创建
fmt.Println(carbon.CreateFromDate(2020, 8, 5).ToString()) // 2020-08-05 00:00:00 +0000 UTC
fmt.Println(carbon.CreateFromTime(13, 14, 15).ToString()) // 2020-08-05 13:14:15 +0000 UTC
fmt.Println(carbon.CreateFromDateTime(2020, 8, 5, 13, 14, 15).ToString()) // 2020-08-05 13:14:15 +0000 UTC
fmt.Println(carbon.CreateFromTimestamp(1596633255).ToString()) // 2020-08-05 13:14:15 +0000 UTC
// 人性化时间差
fmt.Println(carbon.Parse("2020-07-05 13:14:15").DiffForHumans()) // 1 month before
fmt.Println(carbon.Parse("2020-07-05 13:14:15").SetLocale("zh-CN").DiffForHumans()) // 1 月前
// 清除测试时间
carbon.ClearTestNow()
fmt.Println(carbon.IsTestNow()) // false
}
更多功能
Carbon还提供了许多其他功能,包括但不限于:
- 时区处理
- 时间段计算
- 时间比较
- 时间格式化
- 多语言支持
- 工作日/周末判断
- 时间加减操作
许可证
Carbon使用MIT许可证,详情请查看LICENSE文件。
更多关于golang语义化时间处理与开发者友好插件库carbon的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang语义化时间处理与开发者友好插件库carbon的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang语义化时间处理与Carbon库使用指南
在Go语言中处理时间时,标准库time
提供了基础功能,但对于更人性化的时间处理需求,carbon
库是一个优秀的选择。下面我将详细介绍如何使用carbon库进行语义化时间处理。
1. Carbon简介
Carbon是一个受PHP Carbon库启发的Golang时间处理库,提供了更人性化的API来处理日期和时间。
安装方法:
go get github.com/golang-module/carbon/v2
2. 基础使用
初始化时间对象
package main
import (
"fmt"
"github.com/golang-module/carbon/v2"
)
func main() {
// 当前时间
now := carbon.Now()
fmt.Println(now) // 输出当前时间,如: 2023-11-15 14:30:00
// 指定时间
t := carbon.Create(2023, 11, 15, 14, 30, 0)
fmt.Println(t) // 2023-11-15 14:30:00
// 从字符串解析
t2 := carbon.Parse("2023-11-15 14:30:00")
fmt.Println(t2) // 2023-11-15 14:30:00
}
3. 语义化时间处理
时间加减
// 加减时间
now := carbon.Now()
nextWeek := now.AddWeek() // 加1周
nextMonth := now.AddMonth() // 加1月
nextYear := now.AddYear() // 加1年
yesterday := now.SubDay() // 减1天
lastHour := now.SubHour() // 减1小时
fmt.Println("明天:", now.AddDay().ToDateString())
fmt.Println("上周:", now.SubWeek().ToDateString())
时间比较
t1 := carbon.Parse("2023-11-15 14:30:00")
t2 := carbon.Parse("2023-11-16 10:00:00")
fmt.Println(t1.Eq(t2)) // false
fmt.Println(t1.Lt(t2)) // true (t1早于t2)
fmt.Println(t1.Gt(t2)) // false
fmt.Println(t1.Between(t1.SubDay(), t2)) // true (t1在t1.SubDay()和t2之间)
人性化输出
now := carbon.Now()
past := now.SubMinutes(5)
future := now.AddHours(2)
fmt.Println(past.DiffForHumans()) // "5 minutes ago"
fmt.Println(future.DiffForHumans()) // "2 hours from now"
// 设置语言
carbon.SetLocale("zh-CN")
fmt.Println(past.DiffForHumans()) // "5分钟前"
fmt.Println(future.DiffForHumans()) // "2小时后"
4. 高级功能
时间区间计算
start := carbon.Parse("2023-11-01 00:00:00")
end := carbon.Parse("2023-11-30 23:59:59")
// 计算区间内的天数
days := start.DiffInDays(end)
fmt.Println("总天数:", days)
// 判断是否在区间内
checkDate := carbon.Parse("2023-11-15")
fmt.Println("是否在区间内:", checkDate.Between(start, end)) // true
工作日处理
date := carbon.Parse("2023-11-15") // 假设是周三
// 下一个工作日
fmt.Println(date.NextWeekday()) // 2023-11-16 (周四)
// 上一个周末
fmt.Println(date.PreviousWeekend()) // 2023-11-12 (周日)
// 是否是工作日
fmt.Println(date.IsWeekday()) // true
时区处理
// 设置默认时区
carbon.SetTimezone("Asia/Shanghai")
// 时区转换
nyTime := carbon.Now().SetTimezone("America/New_York")
fmt.Println("纽约时间:", nyTime)
// 所有可用时区
zones := carbon.Timezones()
fmt.Println("支持时区数量:", len(zones))
5. 格式化输出
t := carbon.Now()
// 常用格式
fmt.Println(t.ToDateTimeString()) // 2023-11-15 14:30:00
fmt.Println(t.ToDateString()) // 2023-11-15
fmt.Println(t.ToTimeString()) // 14:30:00
fmt.Println(t.ToFormattedDateString()) // Nov 15, 2023
fmt.Println(t.ToDayDateTimeString()) // Wed, Nov 15, 2023 2:30 PM
// 自定义格式
fmt.Println(t.Format("Y年m月d日 H时i分")) // 2023年11月15日 14时30分
6. 最佳实践
- 初始化配置:在应用启动时设置默认时区和语言
func init() {
carbon.SetTimezone("Asia/Shanghai")
carbon.SetLocale("zh-CN")
}
- 处理用户输入时间:
func parseUserInput(input string) (carbon.Carbon, error) {
t := carbon.Parse(input)
if t.Error != nil {
return carbon.Now(), fmt.Errorf("无效的时间格式")
}
return t, nil
}
- 生成时间范围:
func generateDateRange(start, end string) ([]string, error) {
startDate := carbon.Parse(start)
endDate := carbon.Parse(end)
if startDate.Error != nil || endDate.Error != nil {
return nil, fmt.Errorf("无效的日期格式")
}
var dates []string
for startDate.Lte(endDate) {
dates = append(dates, startDate.ToDateString())
startDate = startDate.AddDay()
}
return dates, nil
}
Carbon库极大简化了Go中的时间处理,特别是需要人性化显示和复杂时间计算的场景。相比标准库,它提供了更直观的API和更丰富的功能,是时间处理需求的优秀解决方案。