如何格式化golang中的持续时间
发布时间:2020-12-16 09:25:35 所属栏目:大数据 来源:网络整理
导读:我有以下代码,我无法在游戏中运行因为我使用gin框架和filewalk. package mainimport ( "fmt" "os" "path/filepath" "time" "regexp" "github.com/gin-gonic/gin" "sort" "strings" "github.com/davidscholberg/go-durationfmt")var filext = regexp.MustComp
我有以下代码,我无法在游戏中运行因为我使用gin框架和filewalk.
package main import ( "fmt" "os" "path/filepath" "time" "regexp" "github.com/gin-gonic/gin" "sort" "strings" "github.com/davidscholberg/go-durationfmt" ) var filext = regexp.MustCompile(`.[mM][pP]4|.[mM]4[vV]|.jpg|.[hH]264|.go`) var m map[int]string var keys []int func main() { if gin.IsDebugging() { fmt.Print("This progamm shows only the path and the age of a file in 'STARTDIR'n") fmt.Print("only the following files will be handled '.[mM][pP]4|.[mM]4[vV$|.[hH]264|.go'n") fmt.Print("The git repository: https://gitlab.com/aleks001/show-files-age n") } if len(os.Getenv("LISTEN_IP_PORT")) == 0 { fmt.Print("I need a ip and port on which I should listen.n") os.Exit(1) } router := gin.Default() gin.DisableConsoleColor() router.GET("/videoinfo",getInfo) router.Run(os.Getenv("LISTEN_IP_PORT")) } func getInfo(c *gin.Context) { loc,_ := time.LoadLocation("Europe/Vienna") var startdir = "" if os.Getenv("STARTDIR") != "" { startdir = os.Getenv("STARTDIR") } else if c.GetHeader("STARTDIR") != "" { startdir = c.GetHeader("STARTDIR") } else { c.String(404,"Startdir not found <br>n") return } m = make(map[int]string) keys = nil filepath.Walk(startdir,walkpath) for k := range m { keys = append(keys,k) } sort.Ints(keys) for _,k := range keys { t := time.Date(time.Now().Year(),time.Now().Month(),time.Now().Day(),time.Now().Hour(),k,time.Now().Second(),time.Now().Nanosecond(),loc) durStr,err := durationfmt.Format(time.Since(t),"%h:%m") if err != nil { fmt.Println(err) } else { //fmt.Println(durStr) fmt.Printf("Key: %s Value: %sn",durStr,m[k]) c.String(200,"Minutes: %s File: %sn",m[k]) } } } func walkpath(path string,f os.FileInfo,err error) error { if err != nil { fmt.Println(err) } else { if filext.MatchString(path) { age := time.Now().Sub(f.ModTime()) path_new := strings.Replace(path,"/videos/","",1) // path_new := strings.Replace(path,"..",1) /* fmt.Printf("Path: %s,ModTime: %s,Age: %s <br>n",walker.Path(),walker.Stat().ModTime(),age) c.String(200,"Path: %s,age) */ fmt.Printf("Path: %s,Age: %d age minutes %0.2f <br>n",path_new,age,age.Minutes()) m[int(age.Minutes())]=path_new //c.String(200,Age: %0.2f <br>n",path,age.Minutes()) } //fmt.Printf("%s with %d bytes at motime %sn",f.Size(),f.ModTime()) } return nil } 我想要做的是基于filext als过滤器的文件的排序输出和作为排序标准的modtime. 我能够完成大部分请求,但输出看起来很难看,如下所示. 我用https://github.com/davidscholberg/go-durationfmt来格式化持续时间,或者我想念库. Minutes: 0:6 File: upload/dir003/file1.m4v Minutes: 0:5 File: transfer/dir5/file2.jpg Minutes: -5:-48 File: transfer/dir001/file.mp4 Minutes: -6:-21 File: transfer/03.jpg Minutes: -6:-22 File: transfer/02.mp4 因为我很新,所以我确信有更好的方法可以解决这个问题. 解决方法
例如,要提供持续时间的自定义格式,
package main import ( "fmt" "time" ) func fmtDuration(d time.Duration) string { d = d.Round(time.Minute) h := d / time.Hour d -= h * time.Hour m := d / time.Minute return fmt.Sprintf("%02d:%02d",h,m) } func main() { modTime := time.Now().Round(0).Add(-(3600 + 60 + 45) * time.Second) since := time.Since(modTime) fmt.Println(since) durStr := fmtDuration(since) fmt.Println(durStr) } 游乐场:https://play.golang.org/p/HT4bFfoA5r 输出: 1h1m45s 01:02 如果要对持续时间进行排序,请使用Go package main import ( "fmt" "os" "path/filepath" "sort" "strings" "time" ) func isVideo(path string) bool { videos := []string{".mp4",".m4v",".h264"} ext := strings.ToLower(filepath.Ext(path)) for _,video := range videos { if ext == video { return true } } return false } type modTimeInfo struct { path string modTime time.Time } func walkModTime(root string) ([]modTimeInfo,error) { var infos []modTimeInfo err := filepath.Walk( root,func(path string,info os.FileInfo,err error) error { if err != nil { return err } if info.Mode().IsRegular() { path = filepath.Clean(path) if !isVideo(path) { return nil } sep := string(filepath.Separator) dir := sep + `Videos` + sep path = strings.Replace(path,dir,sep,1) infos = append(infos,modTimeInfo{ path: path,modTime: info.ModTime()},) } return nil },) if err != nil { return nil,err } return infos,nil } func sortModTime(infos []modTimeInfo) { sort.SliceStable( infos,func(i,j int) bool { return infos[i].modTime.Before(infos[j].modTime) },) } func fmtAge(d time.Duration) string { d = d.Round(time.Minute) h := d / time.Hour d -= h * time.Hour m := d / time.Minute return fmt.Sprintf("%02d:%02d",m) } func main() { root := `/home/peter/Videos` // Testing ... infos,err := walkModTime(root) if err != nil { fmt.Println(err) return } sortModTime(infos) now := time.Now() for _,info := range infos { age := fmtAge(now.Sub(info.modTime)) fmt.Println("Age (H:M):","File:",info.path) } } 游乐场:https://play.golang.org/p/j2TUmJdAi4 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |