golang支持解析和格式化天/周/年时间段的Duration扩展插件approx的使用

golang支持解析和格式化天/周/年时间段的Duration扩展插件approx的使用

approx是一个Golang扩展包,它为标准库的time.Duration增加了对天(d)、周(w)和年(y)时间单位的支持。这个包的代码基于Go标准库,只做了少量调整来支持这些额外的时间单位。

功能特点

  • 支持解析包含天(d)、周(w)和年(y)单位的持续时间字符串
  • 支持将这些持续时间格式化为字符串
  • 完全兼容标准库的time.Duration类型

使用示例

下面是一个完整的使用示例,展示如何解析和格式化包含周和天单位的持续时间:

package main

import (
	"fmt"
	"time"
	
	"github.com/goschtalt/approx"
)

func main() {
	// 示例1: 解析包含周和天的持续时间
	d, err := approx.ParseDuration("1w4d") // 1周4天
	if err != nil {
		panic(err)
	}
	
	// 使用approx的String方法格式化输出
	fmt.Println("Formatted duration:", approx.String(d)) // 输出: 1w4d
	
	// 直接打印time.Duration值
	fmt.Println("Exact duration:", d) // 输出: 278h0m0s
	
	// 示例2: 解析包含年、周和天的持续时间
	d2, err := approx.ParseDuration("1y2w3d") // 1年2周3天
	if err != nil {
		panic(err)
	}
	
	fmt.Println("\nFormatted duration:", approx.String(d2)) // 输出: 1y2w3d
	fmt.Println("Exact duration:", d2) // 输出: 8970h0m0s
	
	// 示例3: 与标准time包结合使用
	now := time.Now()
	future := now.Add(d2)
	fmt.Printf("\nNow: %v\nFuture: %v\n", now, future)
}

支持的格式

approx支持以下时间单位:

  • y - 年 (365天)
  • w - 周 (7天)
  • d - 天 (24小时)

可以组合使用这些单位,例如:

  • "1y2w3d" - 1年2周3天
  • "2w" - 2周
  • "5d" - 5天

注意事项

  1. 这个包处理的是近似时间,因为年和周的确切持续时间可能会有所不同(闰年、闰秒等)
  2. 解析后的值仍然是标准的time.Duration类型,可以与其他时间函数一起使用
  3. 当需要精确计算时,建议使用标准的时间处理方法

这个包非常适合需要处理人类可读的近似时间段的场景,如配置文件中指定时间间隔等。


更多关于golang支持解析和格式化天/周/年时间段的Duration扩展插件approx的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang支持解析和格式化天/周/年时间段的Duration扩展插件approx的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 中的 approx 时间解析与格式化

在 Go 语言的标准库中,time.Duration 类型主要用于表示纳秒级的时间间隔,但它不支持天、周、年等更大的时间单位。approx 是一个第三方库,扩展了 Go 的时间持续时间解析和格式化功能。

安装 approx

首先需要安装 approx 库:

go get github.com/benbjohnson/approx

基本用法

解析持续时间字符串

package main

import (
	"fmt"
	"github.com/benbjohnson/approx"
	"time"
)

func main() {
	// 解析带天数的持续时间
	d, err := approx.ParseDuration("3d4h30m")
	if err != nil {
		panic(err)
	}
	fmt.Printf("Parsed duration: %v\n", d) // 输出: 76h30m0s

	// 转换为标准库的 Duration
	stdDuration := time.Duration(d)
	fmt.Printf("Standard duration: %v\n", stdDuration)
}

格式化持续时间

func formatExample() {
	d := approx.Duration(48 * time.Hour)
	
	// 格式化为字符串
	fmt.Println(d.String()) // 输出: 2d0h0m0s
	
	// 自定义格式化
	fmt.Println(d.Format("2d 3h 4m 5s")) // 输出: 2d 0h 0m 0s
}

支持的时间单位

approx 支持以下时间单位:

  • 纳秒 (ns)
  • 微秒 (us/µs)
  • 毫秒 (ms)
  • 秒 (s)
  • 分钟 (m)
  • 小时 (h)
  • 天 (d)
  • 周 (w)
  • 月 (mo) - 近似为30天
  • 年 (y) - 近似为365天

高级用法

解析复杂持续时间

func complexParse() {
	d, err := approx.ParseDuration("1y6mo2w3d12h30m15s")
	if err != nil {
		panic(err)
	}
	fmt.Printf("Complex duration: %v\n", d)
	
	// 转换为天数
	days := d.Hours() / 24
	fmt.Printf("Approximate days: %.2f\n", days)
}

自定义格式化

func customFormat() {
	d := approx.Duration(2*24*time.Hour + 3*time.Hour + 30*time.Minute)
	
	// 只显示天和小时
	fmt.Println(d.Format("d天h小时")) // 输出: 2天3小时
	
	// 显示周和天
	fmt.Println(d.Format("w周d天")) // 输出: 0周2天
}

与标准库 time.Duration 互操作

func interoperability() {
	// 从标准 Duration 创建 approx Duration
	stdDur := 72 * time.Hour
	approxDur := approx.Duration(stdDur)
	fmt.Println(approxDur.String()) // 输出: 3d0h0m0s
	
	// 转换回标准 Duration
	backToStd := time.Duration(approxDur)
	fmt.Println(backToStd.String()) // 输出: 72h0m0s
}

注意事项

  1. 月和年是近似值(30天和365天),不适合精确计算
  2. 当格式化时,approx 会尽可能使用更大的单位
  3. 对于需要精确日历计算的场景,应该使用 time.Time 的加减方法

approx 库为 Go 提供了更人性化的持续时间表示方式,特别适合需要处理天、周、月、年等较大时间单位的应用场景。

回到顶部