golang时间间隔格式化插件库durafmt的使用

Golang时间间隔格式化插件库durafmt的使用

durafmt是一个小型Go库,用于将time.Duration字符串(和类型)格式化为人类可读的格式。

安装

go get github.com/hako/durafmt

为什么需要durafmt

如果你在Go中使用过time.Duration,可能会遇到这样的输出:

53m28.587093086s // :)

上面的输出看起来很容易阅读,但如果你的持续时间是这样的:

354h22m3.24s // :S

这种情况下,durafmt就能派上用场了。

使用示例

durafmt.ParseString()

package main

import (
	"fmt"
	"github.com/hako/durafmt"
)

func main() {
	duration, err := durafmt.ParseString("354h22m3.24s")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(duration) // 2 weeks 18 hours 22 minutes 3 seconds
	// duration.String() // String representation. "2 weeks 18 hours 22 minutes 3 seconds"
}

durafmt.ParseStringShort()

durafmt.ParseStringShort()durafmt.ParseString()的简化版本,只返回持续时间字符串的第一部分。

package main

import (
	"fmt"
	"github.com/hako/durafmt"
)

func main() {
	duration, err := durafmt.ParseStringShort("354h22m3.24s")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(duration) // 2 weeks
	// duration.String() // String short representation. "2 weeks"
}

durafmt.Parse()

package main

import (
	"fmt"
	"time"
	"github.com/hako/durafmt"
)

func main() {
	timeduration := (354 * time.Hour) + (22 * time.Minute) + (3 * time.Second)
	duration := durafmt.Parse(timeduration).String()
	fmt.Println(duration) // 2 weeks 18 hours 22 minutes 3 seconds
}

LimitFirstN()

类似于durafmt.ParseStringShort(),但可以限制返回持续时间字符串的前N部分。

package main

import (
	"fmt"
	"time"
	"github.com/hako/durafmt"
)

func main() {
	timeduration := (354 * time.Hour) + (22 * time.Minute) + (3 * time.Second)
	duration := durafmt.Parse(timeduration).LimitFirstN(2) // limit first two parts.
	fmt.Println(duration) // 2 weeks 18 hours
}

自定义单位

使用durafmt.Units{}durafmt.Durafmt.Format(units)可以用自定义单位字符串化持续时间。

package main

import (
	"fmt"
	"time"
	"github.com/hako/durafmt"
)

func main() {
	timeduration := (354 * time.Hour) + (22 * time.Minute) + (1 * time.Second) + (100*time.Microsecond)
	duration := durafmt.Parse(timeduration)
	// 使用葡萄牙语单位
	units, err := durafmt.DefaultUnitsCoder.Decode("ano,semana,dia,hora,minuto,segundo,milissegundo,microssegundo")
	if err != nil {
		panic(err)
	}
	fmt.Println(duration.Format(units)) // 2 semanas 18 horas 22 minutos 1 segundo 100 microssegundos

    // 自定义复数形式(singular:plural)
	units, err = durafmt.DefaultUnitsCoder.Decode("ano,semana:SEMANAS,dia,hora,minuto,segundo,milissegundo,microssegundo")
	if err != nil {
		panic(err)
	}
	fmt.Println(duration.Format(units)) // 2 SEMANAS 18 horas 22 minutos 1 segundo 100 microssegundos
}

贡献

欢迎贡献!Fork这个仓库,添加你的更改并提交PR。

如果你想修复bug、添加功能或提供反馈,可以在issues部分进行。

durafmt使用golangci-lint进行测试,你可以使用go test运行测试。

在贡献时,建议运行go test; go vet; golintgolangci-lint

许可证

MIT


更多关于golang时间间隔格式化插件库durafmt的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang时间间隔格式化插件库durafmt的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


durafmt - Golang时间间隔格式化库

durafmt 是一个用于格式化时间间隔(time.Duration)为人类可读格式的Golang库。它可以将标准库中的time.Duration转换为更友好的字符串表示,例如"3小时5分钟"而不是"3h5m"。

安装

使用go get安装durafmt:

go get github.com/hako/durafmt

基本用法

简单示例

package main

import (
	"fmt"
	"time"
	"github.com/hako/durafmt"
)

func main() {
	duration := time.Hour*24*3 + time.Hour*5 + time.Minute*30 + time.Second*45
	
	// 基本格式化
	str := durafmt.Parse(duration).String()
	fmt.Println(str) // 输出: 3天5小时30分钟45秒
	
	// 限制显示单位数量
	limited := durafmt.Parse(duration).LimitFirstN(2)
	fmt.Println(limited) // 输出: 3天5小时
}

更多用法示例

package main

import (
	"fmt"
	"time"
	"github.com/hako/durafmt"
)

func main() {
	// 示例1: 简单格式化
	duration1 := 2*time.Hour + 30*time.Minute
	fmt.Println(durafmt.Parse(duration1).String()) // 2小时30分钟

	// 示例2: 复数形式处理
	duration2 := 1*time.Hour + 1*time.Minute + 1*time.Second
	fmt.Println(durafmt.Parse(duration2).String()) // 1小时1分钟1秒

	// 示例3: 毫秒和微秒
	duration3 := 1500 * time.Millisecond
	fmt.Println(durafmt.Parse(duration3).String()) // 1秒500毫秒

	// 示例4: 限制显示单位数量
	duration4 := 5*time.Hour + 30*time.Minute + 45*time.Second + 500*time.Millisecond
	fmt.Println(durafmt.Parse(duration4).LimitFirstN(2).String()) // 5小时30分钟

	// 示例5: 国际化(英文)
	durafmt.English()
	duration5 := 2*time.Hour + 45*time.Minute
	fmt.Println(durafmt.Parse(duration5).String()) // 2 hours 45 minutes
}

高级功能

自定义单位名称

package main

import (
	"fmt"
	"time"
	"github.com/hako/durafmt"
)

func main() {
	duration := 3*time.Hour + 15*time.Minute
	
	// 自定义单位名称
	customUnits := durafmt.Units{
		Year:   "年",
		Month:  "月",
		Week:   "周",
		Day:    "天",
		Hour:   "小时",
		Minute: "分钟",
		Second: "秒",
	}
	
	str := durafmt.Parse(duration).Format(customUnits)
	fmt.Println(str) // 3小时15分钟
}

忽略某些单位

package main

import (
	"fmt"
	"time"
	"github.com/hako/durafmt"
)

func main() {
	duration := 3*time.Hour + 15*time.Minute + 30*time.Second
	
	// 忽略秒
	str := durafmt.Parse(duration).IgnoreSeconds().String()
	fmt.Println(str) // 3小时15分钟
	
	// 忽略分钟和秒
	str = durafmt.Parse(duration).IgnoreMinutes().IgnoreSeconds().String()
	fmt.Println(str) // 3小时
}

性能考虑

durafmt 在设计时考虑了性能,它比简单的字符串拼接或正则表达式替换更高效。对于大多数应用场景,它的性能开销可以忽略不计。

使用场景

durafmt 特别适合以下场景:

  • 显示任务执行时间
  • 显示缓存过期时间
  • 显示用户等待时间
  • 任何需要向用户展示时间间隔的地方

总结

durafmt 是一个简单但强大的库,可以轻松地将Go的time.Duration转换为人类可读的格式。它支持自定义单位名称、限制显示单位数量、忽略特定单位等功能,非常适合需要友好时间显示的应用。

更多详细信息和高级用法,可以参考项目的GitHub页面:https://github.com/hako/durafmt

回到顶部