Go 如何设置持续时间的格式
我有以下代码,我不能在游戏中运行,因为我使用了gin框架和filewalkGo 如何设置持续时间的格式,go,Go,我有以下代码,我不能在游戏中运行,因为我使用了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.
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: %s\n", durStr , m[k])
c.String(200,"Minutes: %s File: %s\n", durStr, 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, ModTime: %s, Age: %s <br>\n", walker.Path(), walker.Stat().ModTime(), 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,"Path: %s, Age: %0.2f <br>\n", path, age.Minutes())
}
//fmt.Printf("%s with %d bytes at motime %s\n", path,f.Size(), f.ModTime())
}
return nil
}
例如,要为持续时间提供自定义格式
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)
}
游乐场:
输出:
1h1m45s
01:02
如果要按持续时间排序,请使用Go包。我会在
ModTime
上排序,以推迟持续时间的计算,Since(ModTime)
,以便在打印时准确。比如说,
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", h, 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):", age, "File:", info.path)
}
}
游乐场:仅供参考,如果您只想快速显示持续时间,内置格式可以很好地工作:
fmt.Sprintf("duration: %s", d)
将显示如下内容:
duration: 7h3m45s
默认的持续时间格式对你不适用吗?不,这是非常丑陋的,它使用6个小数位数,我只需要2。输出应该是HH:ssc,然后你能准确地显示你想要的吗
time.Duration
具有Hours
、Minutes
和Seconds
方法,可为您提供所需格式的数值;年龄:=time.Now().Sub(f.ModTime());age.Minutes()并且必须格式化此int值。我会将代码粘贴到问题中如果问题的小数部分太大,只需使用Duration.Round()
根据需要对其进行取整,例如age.Round(time.Second)
谢谢。它可以持续工作。我没有找到sort.Duration(k)函数,因此无法将其用于var-keys[]int
,它是m[int(age.Minutes())]=path\u new
的键索引。我用它来排序sort.int(键)
。有sort.Duration()函数吗?@Aleksandar:看我修改过的答案。你是我的英雄。非常感谢您提供的解决方案效果良好,但仅适用于积极的持续时间。这应该是公认的答案
duration: 7h3m45s