我试图将系列格式化为日期,例如:
2013-03-12-15.txt
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包调整自己的东西?
提前感谢您的帮助!
答案 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)
}
您可以看到号码转换表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())
}