github.com/jimmyx0x/go-ethereum@v1.10.28/common/format.go (about) 1 // Copyright 2016 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package common 18 19 import ( 20 "fmt" 21 "regexp" 22 "strings" 23 "time" 24 ) 25 26 // PrettyDuration is a pretty printed version of a time.Duration value that cuts 27 // the unnecessary precision off from the formatted textual representation. 28 type PrettyDuration time.Duration 29 30 var prettyDurationRe = regexp.MustCompile(`\.[0-9]{4,}`) 31 32 // String implements the Stringer interface, allowing pretty printing of duration 33 // values rounded to three decimals. 34 func (d PrettyDuration) String() string { 35 label := time.Duration(d).String() 36 if match := prettyDurationRe.FindString(label); len(match) > 4 { 37 label = strings.Replace(label, match, match[:4], 1) 38 } 39 return label 40 } 41 42 // PrettyAge is a pretty printed version of a time.Duration value that rounds 43 // the values up to a single most significant unit, days/weeks/years included. 44 type PrettyAge time.Time 45 46 // ageUnits is a list of units the age pretty printing uses. 47 var ageUnits = []struct { 48 Size time.Duration 49 Symbol string 50 }{ 51 {12 * 30 * 24 * time.Hour, "y"}, 52 {30 * 24 * time.Hour, "mo"}, 53 {7 * 24 * time.Hour, "w"}, 54 {24 * time.Hour, "d"}, 55 {time.Hour, "h"}, 56 {time.Minute, "m"}, 57 {time.Second, "s"}, 58 } 59 60 // String implements the Stringer interface, allowing pretty printing of duration 61 // values rounded to the most significant time unit. 62 func (t PrettyAge) String() string { 63 // Calculate the time difference and handle the 0 cornercase 64 diff := time.Since(time.Time(t)) 65 if diff < time.Second { 66 return "0" 67 } 68 // Accumulate a precision of 3 components before returning 69 result, prec := "", 0 70 71 for _, unit := range ageUnits { 72 if diff > unit.Size { 73 result = fmt.Sprintf("%s%d%s", result, diff/unit.Size, unit.Symbol) 74 diff %= unit.Size 75 76 if prec += 1; prec >= 3 { 77 break 78 } 79 } 80 } 81 return result 82 }