golang语义化时间处理与开发者友好插件库carbon的使用

Golang语义化时间处理与开发者友好插件库Carbon的使用

介绍

Carbon是一个简单、语义化且开发者友好的Golang时间处理包,具有100%单元测试覆盖率,不依赖任何第三方包,已被awesome-go和hello-github收录。

carbon

安装

要求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. 最佳实践

  1. 初始化配置:在应用启动时设置默认时区和语言
func init() {
    carbon.SetTimezone("Asia/Shanghai")
    carbon.SetLocale("zh-CN")
}
  1. 处理用户输入时间
func parseUserInput(input string) (carbon.Carbon, error) {
    t := carbon.Parse(input)
    if t.Error != nil {
        return carbon.Now(), fmt.Errorf("无效的时间格式")
    }
    return t, nil
}
  1. 生成时间范围
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和更丰富的功能,是时间处理需求的优秀解决方案。

回到顶部