sosodev/duration
GitHub: sosodev/duration
一个 Go 语言编写的 ISO 8601 duration 解析库,可将标准持续时间字符串解析为结构化字段并转换为 Go 原生的 time.Duration 类型。
Stars: 39 | Forks: 15
# duration
[](https://pkg.go.dev/github.com/sosodev/duration)
这是一个用于解析 [ISO 8601 durations](https://en.wikipedia.org/wiki/ISO_8601#Durations) 并将其转换为通常更实用的 `time.Duration` 的 Go module。
## 为什么?
ISO 8601 是一个非常常见的标准,有时这些 duration 会在实际应用中出现。
## 安装
`go get github.com/sosodev/duration`
## [用法](https://go.dev/play/p/Nz5akjy1c6W)
```
package main
import (
"fmt"
"time"
"github.com/sosodev/duration"
)
func main() {
d, err := duration.Parse("P3Y6M4DT12H30M5.5S")
if err != nil {
panic(err)
}
fmt.Println(d.Years) // 3
fmt.Println(d.Months) // 6
fmt.Println(d.Days) // 4
fmt.Println(d.Hours) // 12
fmt.Println(d.Minutes) // 30
fmt.Println(d.Seconds) // 5.5
d, err = duration.Parse("PT33.3S")
if err != nil {
panic(err)
}
fmt.Println(d.ToTimeDuration() == time.Second*33+time.Millisecond*300) // true
}
```
## 正确性
本 module 旨在正确实现 ISO 8601 duration 规范。它正确支持小数单位,并带有单元测试,以断言其解析和转换为 `time.Duration` 的正确性。
话虽如此,指定了月份或年份的 duration 在转换为 `time.Duration` 时会有一点模糊。因为我找不到一个标准值,而且它们显然是可变的,所以我对于月份使用了 `2.628e+15` 纳秒,对于年份使用了 `3.154e+16` 纳秒。
标签:EVTX分析, Go, ISO 8601, Ruby工具, 开发库, 数据解析, 日志审计, 时间处理