golang日期处理与操作插件库gostradamus的使用
Golang日期处理与操作插件库gostradamus的使用
介绍
Gostradamus是一个Go库,提供了一种轻量级且人性化的方式来创建、转换、格式化和解析日期时间。它基于Go的time
库,主要类型DateTime
可以轻松地与time.Time
相互转换。
Gostradamus以法国药剂师Nostradamus命名,他因预言而闻名,因此与时间工作密切相关,就像Gostradamus一样。
特性
✅ 轻松在time.Time
和gostradamus.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
更多关于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更直观和功能丰富的日期时间处理能力,主要优点包括:
- 链式API设计,代码更简洁
- 丰富的格式化选项
- 强大的日期运算功能
- 时区支持完善
- 工作日计算等实用功能
对于复杂的日期时间处理需求,gostradamus是一个值得考虑的选择。相比其他日期库,它的API设计更加现代化,功能也更全面。