hako
durafmt
Go

:clock8: Better time duration formatting in Go!

Last updated May 21, 2026
513
Stars
51
Forks
12
Issues
0
Stars/day
Attention Score
23
Language breakdown
Go 100.0%
Files click to expand
README

durafmt

Build Status Go Report Card codecov GoDoc Open Source Helpers

durafmt is a tiny Go library that formats time.Duration strings (and types) into a human readable format.

go get github.com/hako/durafmt

Why

If you've worked with time.Duration in Go, you most likely have come across this:

53m28.587093086s // :)

The above seems very easy to read, unless your duration looks like this:

354h22m3.24s // :S

Usage

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()

Version of durafmt.ParseString() that only returns the first part of the duration string.

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()

Like durafmt.ParseStringShort() but for limiting the first N parts of the duration string.

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 }

Custom Units

Like durafmt.Units{} and durafmt.Durafmt.Format(units) to stringify duration with custom units.

package main

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

func main() { timeduration := (354 time.Hour) + (22 time.Minute) + (1 time.Second) + (100time.Microsecond) duration := durafmt.Parse(timeduration) // units in portuguese 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

// custom plural (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 }

Contributing

Contributions are welcome! Fork this repo, add your changes and submit a PR.

If you would like to fix a bug, add a feature or provide feedback you can do so in the issues section.

durafmt is tested against golangci-lint and you can run tests with go test.

When contributing, running go test; go vet; golint or golangci-lint is recommended.

License

MIT

🔗 More in this category

© 2026 GitRepoTrend · hako/durafmt · Updated daily from GitHub