如何格式化持续时间

亚历山大:

我有以下代码,由于使用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: %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
}

我要做的是基于filextals过滤器和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
peterSO:

例如,要提供持续时间的自定义格式,

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 sort包。我会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)
    }
}

游乐场:https : //play.golang.org/p/j2TUmJdAi4

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何格式化持续时间

如何格式化std :: chrono持续时间?

如何在Java中格式化持续时间?(例如,格式H:MM:SS)

如何格式化Momentjs持续时间以使其易于阅读?

如何在Python(timedelta)中格式化持续时间?

如何使用Moment.js完全格式化持续时间?

如何在Lua中将ISO 8601持续时间转换为格式化的字符串?

如何使用GNU工具而不是结果日期来计算和格式化日期持续时间?

在Excel中格式化时间(持续时间)

使用date-fns格式化持续时间(以秒为单位)

像HH:mm:ss一样格式化持续时间

来自 JodaTime 持续时间的格式化字符串

在Java 8 / jsr310中格式化持续时间

限制格式化持续时间中的有效数字

通过 Google Sheet 中的脚本格式化“持续时间”

格式化MomentJS持续时间超过24小时

格式化DATEDIFF输出后的持续时间错误(附加日)

格式化润滑持续时间列以进行轴标记

如何使动画的持续时间动态化?

如何在MomentJS中格式化时间/持续时间,以小时,分钟和秒为单位

AngularJS:如何用格式打印持续时间?

如何在TypeScript中使用矩持续时间格式?

如何从JAVA中的持续时间获取日期格式?

时间跨度或持续时间格式

无法将字符串格式化为持续时间

使用NSDateIntervalFormatter将持续时间格式化为ISO8601周期

为什么我不能将音频文件的持续时间格式化为 textView?

如何使用 Moment.js 持续时间格式从持续时间中删除标点符号

Moment js格式持续时间