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.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
}

我想要做的是基于 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

最佳答案

仅供引用,如果您只想快速显示持续时间,内置格式效果很好:

fmt.Sprintf("duration: %s", d)

将显示如下内容:

duration: 7h3m45s

关于go - 如何格式化持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47341278/

相关文章:

go - 追加时 Go slice 容量如何变化?

go - 静态链接Go程序到/usr/lib/libSystem.B.dylib

go - 如何使用 Go 保存和检索 Gorm 的 many2many 关系

for-loop - Golang 赋值

运行 golang http.Client 的 Docker 容器出现错误 `certificate signed by unknown authority`

go - 我如何确保我的消费者按顺序处理 kafka 主题中的消息,并且只处理一次?

google-app-engine - 在 beegae 中使用 CSS

go - Go kafka的未定义kafka组件

go - 如何创建具有所需类型的变量而不是类型断言

go - 给定一个 ASCII 字符代码,我如何将它编码为 UTF-8?