golang日期处理与操作插件库gostradamus的使用

Golang日期处理与操作插件库gostradamus的使用

Gostradamus logo

介绍

Gostradamus是一个Go库,提供了一种轻量级且人性化的方式来创建、转换、格式化和解析日期时间。它基于Go的time库,主要类型DateTime可以轻松地与time.Time相互转换。

Gostradamus以法国药剂师Nostradamus命名,他因预言而闻名,因此与时间工作密切相关,就像Gostradamus一样。

特性

✅ 轻松在time.Timegostradamus.DateTime之间转换
✅ 使用常见格式标记如YYYY-MM-DD HH:mm:ss进行格式化
✅ 生成从秒到年的时间跨度、下限和上限(包括周)
✅ 周操作和辅助函数
✅ 时区感知和转换
✅ 经过全面测试,可用于生产环境

基础用法

package main

import "github.com/bykof/gostradamus"

func main() {
    // 简单解析
    dateTime, err := gostradamus.Parse("14.07.2017 02:40:00", "DD.MM.YYYY HH:mm:ss")
    if err != nil {
        panic(err)
    }

    // 简单操作
    dateTime = dateTime.ShiftMonths(-5).ShiftDays(2)

    // 简单格式化
    println(dateTime.Format("DD.MM.YYYY HH:mm:ss"))
    // 16.02.2017 02:40:00

    // 简单辅助函数
    start, end := dateTime.SpanWeek()

    println(start.String(), end.String())
    // 2017-02-13T00:00:00.000000Z 2017-02-19T23:59:59.999999Z
}

完整示例

创建DateTime

// 使用定义好的时区创建
dateTime := gostradamus.NewDateTime(2020, 1, 1, 12, 0, 0, 0, gostradamus.EuropeBerlin)

// 使用预定义UTC时区创建
dateTime := gostradamus.NewUTCDateTime(2020, 1, 1, 12, 0, 0, 0)

// 使用本地时区创建
dateTime := gostradamus.NewLocalDateTime(2020, 1, 1, 12, 0, 0, 0)

// 从ISO-8601格式创建
dateTime := gostradamus.Parse("2017-07-14T02:40:00.000000+0200", gostradamus.Iso8601)

// 从自定义格式创建
dateTime := gostradamus.Parse("10.02.2010 14:59:53", "DD.MM.YYYY HH:mm:ss")

// 从UNIX时间戳创建
dateTime := gostradamus.FromUnixTimestamp(1500000000)

// 当前时间
dateTime := gostradamus.Now() // 本地时区
dateTime = gostradamus.UTCNow() // UTC时区
dateTime = gostradamus.NowInTimezone(gostradamus.EuropeParis) // 指定时区

时区操作

// 使用时区常量
gostradamus.EuropeParis  // Europe/Paris
gostradamus.EuropeBerlin // Europe/Berlin
gostradamus.AmericaNewYork // America/New_York

// 时区转换
dateTime := gostradamus.NewUTC(2020, 1, 1, 12, 12, 12, 0).InTimezone(gostradamus.EuropeBerlin)
println(dateTime.String())
// 2020-02-15T13:12:12.000000+0100

dateTime = dateTime.InTimeZone(America_New_York)
println(dateTime.String())
// 2020-02-15T07:12:12.000000-0500

时间偏移

dateTime := gostradamus.NewUTCDateTime(2020, 1, 1, 1, 1, 1, 1)
dateTime = dateTime.ShiftYears(10)
println(dateTime.String())
// 2030-01-01T01:01:01.000000+0000

dateTime = gostradamus.NewUTCDateTime(2020, 1, 1, 1, 1, 1, 1)
dateTime = dateTime.ShiftDays(-10)
println(dateTime.String())
// 2019-12-22T01:01:01.000000+0000

dateTime = gostradamus.NewUTCDateTime(2020, 1, 1, 1, 1, 1, 1)
dateTime = dateTime.ShiftWeeks(2)
println(dateTime.String())
// 2020-01-15T01:01:01.000000+0000

dateTime = gostradamus.NewUTCDateTime(2020, 1, 1, 1, 1, 1, 1)
dateTime = dateTime.Shift(0, 1, 10, 0, 0, 0, 0)
println(dateTime.String())
// 2020-02-11T01:01:01.000000+0000

时间替换

dateTime := gostradamus.NewUTCDateTime(2020, 1, 1, 1, 1, 1, 1)
dateTime = dateTime.ReplaceYear(2010)
println(dateTime.String())
// 2010-01-01T01:01:01.000000+0000

dateTime = gostradamus.NewUTCDateTime(2020, 1, 1, 1, 1, 1, 1)
dateTime = dateTime.ReplaceYear(2010).ReplaceMonth(2)
println(dateTime.String())
// 2010-02-01T01:01:01.000000+0000

格式化与解析

// 格式化
dateTimeString := gostradamus.NewDateTime(2017, 7, 14, 2, 40, 0, 0, UTC).Format("DD.MM.YYYY Time: HH:mm:ss")
println(dateTimeString)
// 14.07.2017 Time: 02:40:00

// 解析
dateTime, err := gostradamus.Parse("10.02.2010 14:59:53", "DD.MM.YYYY HH:mm:ss")
println(dateTime.String())
// 2010-02-10T14:59:53.000000Z

// 带时区解析
dateTime, err := gostradamus.ParseInTimezone("10.02.2010 14:59:53", "DD.MM.YYYY HH:mm:ss", gostradamus.EuropeBerlin)
println(dateTime.String())
// 2010-02-10T14:59:53.000000+0100

时间范围与辅助函数

// 下限
dateTimeString := gostradamus.NewDateTime(2017, 7, 14, 2, 40, 0, 0, UTC).FloorDay()
println(dateTimeString.String())
// 2017-07-14T00:00:00.000000Z

// 上限
dateTimeString := gostradamus.NewDateTime(2017, 7, 14, 2, 40, 0, 0, UTC).CeilMonth()
println(dateTimeString.String())
// 2017-07-31T23:59:59.999999Z

// 时间跨度
start, end := NewDateTime(2017, 7, 14, 2, 40, 0, 0, UTC).SpanMonth()
println(start.String())
// 2017-07-01T00:00:00.000000Z
println(end.String())
// 2017-07-31T23:59:59.999999Z

// 判断时间是否在范围内
isBetween := gostradamus.NewUTCDateTime(2020, 1, 1, 12, 0, 0, 0).IsBetween(
    gostradamus.NewUTCDateTime(2020, 1, 1, 11, 0, 0, 0),
    gostradamus.NewUTCDateTime(2020, 1, 1, 13, 0, 0, 0),
)
println(isBetween)
// true

// 获取ISO日历
year, month, day := gostradamus.NewUTCDateTime(2020, 1, 1, 12, 0, 0, 0).IsoCalendar()
println(year, month, day)
// 2020 1 1

格式标记表

类别 标记 输出示例
YYYY 2000, 2001, 2002 … 2012, 2013
YY 00, 01, 02 … 12, 13
MMMM January, February, March …
MMM Jan, Feb, Mar …
MM 01, 02, 03 … 11, 12
M 1, 2, 3 … 11, 12
年中的日 DDDD 001, 002, 003 … 364, 365
月中的日 DD 01, 02, 03 … 30, 31
D 1, 2, 3 … 30, 31
Do 1st, 2nd, 3rd …
星期 dddd Monday, Tuesday, Wednesday …
ddd Mon, Tue, Wed …
小时 HH 00, 01, 02 … 23, 24
hh 01, 02, 03 … 11, 12
h 1, 2, 3 … 11, 12
AM/PM A AM, PM
a am, pm
分钟 mm 00, 01, 02 … 58, 59
m 0, 1, 2 … 58, 59
ss 00, 01, 02 … 58, 59
s 0, 1, 2 … 58, 59
微秒 S 000000 … 999999
时区 ZZZ Asia/Baku, Europe/Warsaw, GMT
zz -07:00, -06:00 … +06:00, +07:00, +08, Z
Z -0700, -0600 … +0600, +0700, +08, Z

贡献

如果您有改进Gostradamus的想法,可以创建issue。如果您已经编写了代码,可以创建pull request。如果发现bug,也可以创建issue。

许可证

MIT许可证。详见LICENSE文件。


更多关于golang日期处理与操作插件库gostradamus的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang日期处理与操作插件库gostradamus的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


gostradamus - Go语言日期处理库

gostradamus是一个功能强大的Go语言日期时间处理库,它提供了简单直观的API来处理日期、时间和时间间隔。下面我将详细介绍gostradamus的主要功能和使用方法。

安装

go get github.com/bykof/gostradamus

基本使用

创建日期时间对象

package main

import (
	"fmt"
	"github.com/bykof/gostradamus"
)

func main() {
	// 当前时间
	now := gostradamus.Now()
	fmt.Println(now) // 输出当前时间,如: 2023-08-20T15:04:05+08:00

	// 从字符串解析
	date, err := gostradamus.FromString("2023-08-20 15:04:05", "YYYY-MM-DD HH:mm:ss")
	if err != nil {
		panic(err)
	}
	fmt.Println(date) // 2023-08-20T15:04:05+08:00

	// 从时间戳创建
	timestamp := gostradamus.FromUnix(1692515045)
	fmt.Println(timestamp) // 2023-08-20T15:04:05+08:00
}

格式化日期

func formatExamples() {
	now := gostradamus.Now()
	
	// 默认格式
	fmt.Println(now.String()) // 2023-08-20T15:04:05+08:00
	
	// 自定义格式
	fmt.Println(now.Format("YYYY年MM月DD日 HH时mm分ss秒")) // 2023年08月20日 15时04分05秒
	
	// 常用格式
	fmt.Println(now.ToDateString())      // 2023-08-20
	fmt.Println(now.ToTimeString())      // 15:04:05
	fmt.Println(now.ToDateTimeString())  // 2023-08-20 15:04:05
	fmt.Println(now.ToISOString())       // 2023-08-20T15:04:05+08:00
}

日期运算

func dateCalculations() {
	now := gostradamus.Now()
	
	// 加减时间
	tomorrow := now.AddDays(1)
	yesterday := now.AddDays(-1)
	
	nextHour := now.AddHours(1)
	prevHour := now.AddHours(-1)
	
	// 计算时间差
	diff := tomorrow.Difference(now)
	fmt.Println(diff.Hours()) // 24
	
	// 比较日期
	fmt.Println(now.IsAfter(yesterday))  // true
	fmt.Println(now.IsBefore(tomorrow)) // true
	fmt.Println(now.IsEqual(now))       // true
}

时区处理

func timezoneExamples() {
	// 本地时间
	localTime := gostradamus.Now()
	
	// 转换为UTC
	utcTime := localTime.InUTC()
	
	// 转换为特定时区
	nyTime, err := localTime.InTimezone("America/New_York")
	if err != nil {
		panic(err)
	}
	
	fmt.Printf("Local: %s\nUTC: %s\nNew York: %s\n", 
		localTime, utcTime, nyTime)
}

获取日期部分

func dateParts() {
	now := gostradamus.Now()
	
	fmt.Println("Year:", now.Year())      // 2023
	fmt.Println("Month:", now.Month())    // 8
	fmt.Println("Day:", now.Day())        // 20
	fmt.Println("Hour:", now.Hour())      // 15
	fmt.Println("Minute:", now.Minute())  // 4
	fmt.Println("Second:", now.Second())  // 5
	fmt.Println("Weekday:", now.Weekday()) // Sunday
}

日期范围操作

func rangeExamples() {
	start := gostradamus.Now().StartOfDay()
	end := gostradamus.Now().EndOfDay()
	
	fmt.Println("Start of day:", start)
	fmt.Println("End of day:", end)
	
	// 获取月份的第一天和最后一天
	firstDayOfMonth := gostradamus.Now().StartOfMonth()
	lastDayOfMonth := gostradamus.Now().EndOfMonth()
	
	fmt.Println("First day of month:", firstDayOfMonth)
	fmt.Println("Last day of month:", lastDayOfMonth)
}

高级功能

解析相对时间字符串

func relativeTime() {
	now := gostradamus.Now()
	
	// 解析相对时间
	nextWeek, err := now.Add("1 week")
	if err != nil {
		panic(err)
	}
	
	fmt.Println("Next week:", nextWeek)
	
	// 支持多种相对时间表达式
	twoDaysLater, err := now.Add("2 days 3 hours 5 minutes")
	if err != nil {
		panic(err)
	}
	
	fmt.Println("Two days later:", twoDaysLater)
}

工作日计算

func workdayExamples() {
	date := gostradamus.FromString("2023-08-20") // 周日
	
	// 下一个工作日
	nextWorkday := date.NextWorkday()
	fmt.Println("Next workday:", nextWorkday) // 2023-08-21 (周一)
	
	// 上一个工作日
	prevWorkday := date.PreviousWorkday()
	fmt.Println("Previous workday:", prevWorkday) // 2023-08-18 (周五)
	
	// 检查是否是工作日
	fmt.Println("Is workday:", date.IsWorkday()) // false
}

日期迭代

func iterationExample() {
	start := gostradamus.FromString("2023-08-20")
	end := start.AddDays(7)
	
	// 迭代每一天
	for date := start; date.IsBefore(end); date = date.AddDays(1) {
		fmt.Println(date.ToDateString())
	}
}

总结

gostradamus提供了比标准库time更直观和功能丰富的日期时间处理能力,主要优点包括:

  1. 链式API设计,代码更简洁
  2. 丰富的格式化选项
  3. 强大的日期运算功能
  4. 时区支持完善
  5. 工作日计算等实用功能

对于复杂的日期时间处理需求,gostradamus是一个值得考虑的选择。相比其他日期库,它的API设计更加现代化,功能也更全面。

回到顶部