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天
注意事项
- 这个包处理的是近似时间,因为年和周的确切持续时间可能会有所不同(闰年、闰秒等)
- 解析后的值仍然是标准的
time.Duration
类型,可以与其他时间函数一起使用 - 当需要精确计算时,建议使用标准的时间处理方法
这个包非常适合需要处理人类可读的近似时间段的场景,如配置文件中指定时间间隔等。
更多关于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
}
注意事项
- 月和年是近似值(30天和365天),不适合精确计算
- 当格式化时,approx 会尽可能使用更大的单位
- 对于需要精确日历计算的场景,应该使用 time.Time 的加减方法
approx 库为 Go 提供了更人性化的持续时间表示方式,特别适合需要处理天、周、月、年等较大时间单位的应用场景。