golang智能解析任意格式日期时间字符串插件库go-anytime的使用

Golang智能解析任意格式日期时间字符串插件库go-anytime的使用

介绍

go-anytime是一个用于自然语言日期时间解析的Go语言库。它最初是从tj/go-naturaldate分叉而来,但已经发展出许多不同特性,因此需要一个新名称来避免混淆。

主要特点:

  1. 基于ijt/goparsify解析器组合模块开发,便于调试和集成
  2. 支持解析时间范围,如"from 3 feb 2022 until 6 oct 2022"
  3. 提供字符串中日期时间替换功能
  4. 可以将字符串分区为时间和非时间部分

安装

go get github.com/ijt/go-anytime

基本使用示例

package main

import (
	"fmt"
	"time"
	
	"github.com/ijt/go-anytime"
)

func main() {
	// 设置参考时间(可选)
	now := time.Now()
	
	// 示例1: 解析简单日期时间
	t, err := anytime.Parse("5 minutes ago", now)
	if err != nil {
		panic(err)
	}
	fmt.Println("5分钟前的时间:", t)
	
	// 示例2: 解析完整日期
	t, err = anytime.Parse("November 3rd, 1986 at 4:30pm", now)
	if err != nil {
		panic(err)
	}
	fmt.Println("解析的日期时间:", t)
	
	// 示例3: 解析带时区的日期
	t, err = anytime.Parse("September 17, 2012 UTC+7", now)
	if err != nil {
		panic(err)
	}
	fmt.Println("带时区的日期时间:", t)
}

时间范围解析示例

package main

import (
	"fmt"
	"time"
	
	"github.com/ijt/go-anytime"
)

func main() {
	now := time.Now()
	
	// 解析时间范围
	r, err := anytime.ParseRange("from 3 feb 2022 to 6 oct 2022", now)
	if err != nil {
		panic(err)
	}
	
	fmt.Println("开始时间:", r.Start)
	fmt.Println("结束时间:", r.End)
	
	// 另一个时间范围示例
	r, err = anytime.ParseRange("from tuesday at 5pm -12:00 until thursday 23:52 +14:00", now)
	if err != nil {
		panic(err)
	}
	
	fmt.Println("带时区的开始时间:", r.Start)
	fmt.Println("带时区的结束时间:", r.End)
}

字符串替换示例

package main

import (
	"fmt"
	"time"
	
	"github.com/ijt/go-anytime"
)

func main() {
	now := time.Now()
	
	// 原始字符串
	text := "会议安排在next sunday at 22:45,请准时参加"
	
	// 替换时间表达式为格式化后的时间
	result := anytime.ReplaceTimesByFunc(text, now, func(t time.Time) string {
		return t.Format("2006-01-02 15:04")
	})
	
	fmt.Println("替换后的字符串:", result)
}

支持的时间格式示例

go-anytime支持解析多种自然语言和标准格式的日期时间字符串,包括但不限于:

  • 相对时间:

    • “now”
    • “today”
    • “yesterday”
    • “5 minutes ago”
    • “three days ago”
    • “last month”
    • “next month”
    • “one year from now”
  • 绝对时间:

    • “yesterday at 10am”
    • “last sunday at 5:30pm”
    • “November 3rd, 1986 at 4:30pm”
    • “january 2017”
    • “oct 7, 1970”
    • “2014/3/31”
    • “2014-04-26”
  • 带时区的时间:

    • “next December 25th at 7:30am UTC-7”
    • “September 17, 2012 UTC+7”
    • “2014/3/31 UTC+1”

注意事项

  1. 解析时可以提供参考时间(now参数),如果不提供则使用当前系统时间
  2. 对于模糊的时间表达式,解析结果可能因参考时间不同而有所变化
  3. 解析失败时会返回错误,请务必检查错误

这个库非常适合需要处理用户输入的日期时间字符串的场景,能够大大提高用户体验和开发效率。


更多关于golang智能解析任意格式日期时间字符串插件库go-anytime的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang智能解析任意格式日期时间字符串插件库go-anytime的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-anytime: Golang智能解析任意格式日期时间字符串库

go-anytime 是一个能够智能解析各种格式日期时间字符串的 Golang 库,它可以自动识别并解析多种常见和不常见的日期时间格式,无需预先指定格式。

主要特性

  1. 自动识别多种日期时间格式
  2. 支持相对时间表达式(如"3天前"、“下周二”)
  3. 支持时区处理
  4. 简单易用的API

安装

go get github.com/araddon/dateparse

注意:go-anytime 实际上是基于 dateparse 库的一个常用名称,核心库是 dateparse。

基本使用示例

package main

import (
	"fmt"
	"github.com/araddon/dateparse"
	"time"
)

func main() {
	// 示例1: 解析常见日期格式
	timeStr := "2023-04-15 14:30:45"
	t, err := dateparse.ParseAny(timeStr)
	if err != nil {
		fmt.Println("解析错误:", err)
		return
	}
	fmt.Println("解析结果:", t.Format(time.RFC3339))

	// 示例2: 解析不同格式的日期
	formats := []string{
		"15-Apr-2023",
		"04/15/2023",
		"2023年4月15日",
		"Apr 15, 2023 2:30 PM",
		"3 days ago", // 3天前
		"next Tuesday", // 下周二
	}

	for _, str := range formats {
		t, err := dateparse.ParseAny(str)
		if err != nil {
			fmt.Printf("'%s' 解析错误: %v\n", str, err)
			continue
		}
		fmt.Printf("'%s' -> %s\n", str, t.Format("2006-01-02 15:04:05"))
	}

	// 示例3: 带时区的解析
	timeWithTZ := "2023-04-15T14:30:45+08:00"
	t, err = dateparse.ParseAny(timeWithTZ)
	if err != nil {
		fmt.Println("解析错误:", err)
		return
	}
	fmt.Println("带时区解析结果:", t.Format(time.RFC3339))
	fmt.Println("本地时间:", t.Local())
}

高级用法

1. 指定时区

loc, _ := time.LoadLocation("America/New_York")
timeStr := "2023-04-15 14:30:45"
t, err := dateparse.ParseIn(timeStr, loc)
if err != nil {
    fmt.Println("解析错误:", err)
    return
}
fmt.Println("纽约时区时间:", t)

2. 严格模式

timeStr := "2023-04-15 14:30:45"
t, err := dateparse.ParseStrict(timeStr)
if err != nil {
    fmt.Println("严格模式解析错误:", err)
    return
}
fmt.Println("严格模式解析结果:", t)

3. 自定义解析器

parser := dateparse.NewParser(dateparse.PreferMonthFirst(false))
timeStr := "04/15/2023" // 在美国格式中会被解析为4月15日
t, err := parser.ParseAny(timeStr)
if err != nil {
    fmt.Println("解析错误:", err)
    return
}
fmt.Println("自定义解析结果:", t)

支持的格式

go-anytime/dateparse 支持以下常见格式:

  1. RFC3339: “2006-01-02T15:04:05Z07:00”
  2. RFC1123Z: “Mon, 02 Jan 2006 15:04:05 -0700”
  3. 常见日期格式: “2006-01-02”, “01/02/2006”, “Jan 02, 2006”
  4. 常见时间格式: “15:04:05”, “3:04 PM”
  5. 组合日期时间: “2006-01-02 15:04:05”
  6. 中文日期: “2006年1月2日”
  7. 相对时间: “3 days ago”, “next Monday”, “tomorrow”

注意事项

  1. 对于模糊的日期格式(如"01/02/2006"),解析结果可能取决于地区设置
  2. 相对时间的解析基于当前时间
  3. 对于非常规格式,解析可能失败
  4. 性能考虑:频繁解析时,如果知道确切格式,使用 time.Parse() 会更高效

总结

go-anytime/dateparse 是一个非常实用的库,特别适合处理用户输入或多种来源的日期时间字符串。它的智能解析能力可以大大简化日期时间处理代码,减少因格式不匹配导致的错误。

对于更复杂的日期时间处理需求,可以结合使用 time 包的其他功能,如时间计算、格式化等。

回到顶部