You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

77 lines
1.6 KiB

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
}
// TimeMilliFormat 时间戳差转换成可视化时间单位 2100 -> 1h-2s-100ms
func TimeMilliFormat(milli int64, sep string) (r string) {
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
}