package conver import ( "fmt" "strings" "time" "github.com/dsnet/golib/unitconv" ) // ParseDataUnit parse 1Ki -> 1024, 1K -> 1000 func ParseDataUnit(unit string) (val float64, err error) { val, err = unitconv.ParsePrefix(unit, unitconv.AutoParse) return } func ParseDataUnitInt(unit string) (val int, err error) { v, err := ParseDataUnit(unit) val = int(v) return } func MustParseDataUnit(unit string) (val float64) { val, err := unitconv.ParsePrefix(unit, unitconv.AutoParse) if err != nil { panic(fmt.Errorf("error parse data unit %s, %s", unit, err.Error())) } return } func MustParseDataUnitInt(unit string) (val int) { return int(MustParseDataUnit(unit)) } func ParseDuration(s string) (time.Duration, error) { return time.ParseDuration(s) } func MustParseDuration(s string) time.Duration { d, err := ParseDuration(s) if err != nil { panic(err) } return d } // TimeDurationFormat 时间差转换成可视化时间单位 2100 -> 1h.2s.100ms func TimeDurationFormat(du time.Duration, sep string) (r string) { milli := du.Milliseconds() day := milli / (1000 * 60 * 60 * 24) milli -= day * (1000 * 60 * 60 * 24) hour := milli / (1000 * 60 * 60) milli -= hour * (1000 * 60 * 60) minite := milli / (1000 * 60) milli -= minite * (1000 * 60) second := milli / (1000) milli -= second * (1000) vs := []int64{day, hour, minite, second, milli} units := []string{"d", "h", "m", "s", "ms"} index := -1 for i, v := range vs { if v > 0 { index = i break } } if index == -1 { r = "0ms" return } var rs []string for ; index < len(vs); index++ { rs = append(rs, fmt.Sprintf("%d%s", vs[index], units[index])) } r = strings.Join(rs, sep) return }