github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/common/format.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:34</date> 10 //</624450073501110272> 11 12 13 package common 14 15 import ( 16 "fmt" 17 "regexp" 18 "strings" 19 "time" 20 ) 21 22 //prettyDuration是时间的一个漂亮打印版本。Duration值会减少 23 //格式文本表示中不必要的精度。 24 type PrettyDuration time.Duration 25 26 var prettyDurationRe = regexp.MustCompile(`\.[0-9]+`) 27 28 //string实现了stringer接口,允许漂亮地打印持续时间 29 //数值四舍五入为三位小数。 30 func (d PrettyDuration) String() string { 31 label := fmt.Sprintf("%v", time.Duration(d)) 32 if match := prettyDurationRe.FindString(label); len(match) > 4 { 33 label = strings.Replace(label, match, match[:4], 1) 34 } 35 return label 36 } 37 38 //prettyage是时间的一个漂亮打印版本。持续时间值 39 //最大值为一个最重要的单位,包括天/周/年。 40 type PrettyAge time.Time 41 42 //AgeUnits是一个非常适合打印使用的单位列表。 43 var ageUnits = []struct { 44 Size time.Duration 45 Symbol string 46 }{ 47 {12 * 30 * 24 * time.Hour, "y"}, 48 {30 * 24 * time.Hour, "mo"}, 49 {7 * 24 * time.Hour, "w"}, 50 {24 * time.Hour, "d"}, 51 {time.Hour, "h"}, 52 {time.Minute, "m"}, 53 {time.Second, "s"}, 54 } 55 56 //string实现了stringer接口,允许漂亮地打印持续时间 57 //四舍五入到最重要的时间单位。 58 func (t PrettyAge) String() string { 59 //计算时差并处理0角箱 60 diff := time.Since(time.Time(t)) 61 if diff < time.Second { 62 return "0" 63 } 64 //返回前累计3个分量的精度 65 result, prec := "", 0 66 67 for _, unit := range ageUnits { 68 if diff > unit.Size { 69 result = fmt.Sprintf("%s%d%s", result, diff/unit.Size, unit.Symbol) 70 diff %= unit.Size 71 72 if prec += 1; prec >= 3 { 73 break 74 } 75 } 76 } 77 return result 78 } 79