使用golang time包丢失0表示一位数小时

时间:2014-05-02 12:19:13

标签: datetime formatting go

我试图将系列格式化为日期,例如:

  • 2013年3月12日,下午3点看起来像:2013-03-12-15.txt
  • 2013年3月12日,凌晨4点 如下:2013-03-12-4.txt

使用golang和Time

package main

import (
    "time"
    "fmt"
)

const layout = "2006-01-02-15.txt"

func main() {
    t := time.Date(2013, time.March, 12, 4, 0, 0, 0, time.UTC)
    fmt.Println(t.Format(layout))
}

不幸的是,在一位数小时前添加零:2013-03-12-04.txt

是否有一种惯用的方式来达到所需的输出,或者我必须使用String包调整自己的东西?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

如果您需要24小时格式并且不想要hour < 10的前导零,我只会看到自定义字符串格式:

date := fmt.Sprintf("%d-%d-%d-%d", t.Year(), t.Month(), t.Day(), t.Hour())

当然不是在Go中格式化日期的惯用方法。

更新(感谢评论):

t := time.Now() 
date := fmt.Sprintf("%s-%d.txt", t.Format("2006-01-02"), t.Hour())
fmt.Println(date)

答案 1 :(得分:5)

仅使用Time.Format格式化年/月并自行格式化时间。

package main

import (
    "fmt"
    "time"
)

const layout = "2006-01-02-%d.txt"

func main() {
    t := time.Date(2013, time.March, 12, 4, 0, 0, 0, time.UTC)
    f := fmt.Sprintf(t.Format(layout), 4)

    fmt.Printf(f)
}

Click to play

您可以看到号码转换表in the source code of format.go。相关部分:

const (
// ...
    stdHour                  = iota + stdNeedClock // "15"
    stdHour12                                      // "3"
    stdZeroHour12                                  // "03"
// ...
)

没有stdZeroHour这样的内容,因此stdHour没有替代行为。

答案 2 :(得分:0)

const (
       H12Format = "2006/1/2/3/4.txt"
       H24Format = "2006/1/2/15/4.txt"
   )    
   func path(date time.Time) string {
    if date.Hour() < 10 {
        return date.Format(H12Format)
    }
    return date.Format(H24Format)
   }

很遗憾,go playground不允许运行测试和基准测试。

以下代码包含以前的解决方案,并带有基准。

在我的计算机上,结果如下:

BenchmarkA-4     5000000               293 ns/op              32 B/op          1 allocs/op
BenchmarkB-4     5000000               380 ns/op              48 B/op          2 allocs/op
BenchmarkC-4     3000000               448 ns/op              56 B/op          4 allocs/op

要自己进行测试,请在本地复制代码并运行它:go test -benchmem -run=XXX -bench=Benchmark

package format

import (
    "fmt"
    "testing"
    "time"
)

const (
    layout    = "2006-01-02-3.txt"
    layoutd   = "2006-01-02-%d.txt"
    H12Format = "2006/1/2/3/4.txt"
    H24Format = "2006/1/2/15/4.txt"
)

func BenchmarkA(b *testing.B) {
    for n := 0; n < b.N; n++ {
        path(time.Now())
    }
}

func BenchmarkB(b *testing.B) {
    for n := 0; n < b.N; n++ {
        fmtpath(time.Now())
    }
}

func BenchmarkC(b *testing.B) {
    for n := 0; n < b.N; n++ {
        longpath(time.Now())
    }
}
func path(date time.Time) string {
    if date.Hour() < 10 {
        return date.Format(H12Format)
    }
    return date.Format(H24Format)
}

func fmtpath(date time.Time) string {
    return fmt.Sprintf(date.Format(layoutd), 4)
}

func longpath(date time.Time) string {
    return fmt.Sprintf("%s-%d.txt", date.Format("2006-01-02"), date.Hour())
}