Go 言語(以下 golang)で、経過秒の文字列 "
1472.46s
" を、"00:24:32.460
" の書式に変換したい。
time.Duration 型は Stringer インターフェースを実装しているため、fmt.Print
系で、ある程度のフォーマットをしてくれます。
timeDur, _ := time.ParseDuration("1472.46s")
fmt.Println(timeDur)
// Output: 24m32.46s
しかし、Duration.String()
では、出力の書式が欲しいものと違うのです。"24m32.46s
" ではなく "00:24:32.460
" の書式で欲しいのです。
「golang "time.Duration" 経過秒からフォーマット出力」でググっても、任意のフォーマットで出力する方法がタイトルから判別できる記事がなかったのと、あっても time.Hour
などでゴリゴリ計算する方法ばかりだったので、自分のググラビリティとして。
TL; DR (今北産業)
- 経過秒の文字列から
time.Duration
オブジェクトを作成する - UNIX 時間がゼロ秒の
time.Time
オブジェクトを作成し、上記の経過ぶんを加算する -
time.Format
で任意の書式(time フォーマット) を指定する
TS; DR
package main
import (
"fmt"
"log"
"time"
)
func Example() {
const format = "15:04:05.000"
input := "1472.46s"
output := SecToTime(input, format)
fmt.Println(output)
// Output:
// 00:24:32.460
}
func SecToTime(sec string, format string) string {
tDur, err := time.ParseDuration(sec)
if err != nil {
log.Fatal(err)
}
tZero := time.Unix(0, 0).UTC()
return tZero.Add(time.Duration(tDur)).Format(format)
}
- オンラインで動作をみる @ GoPlayground
Time フォーマットの種類
func (t Time) Format(layout string) string
leyout の定義済み定数と、表記例
const (
Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
DateTime = "2006-01-02 15:04:05"
DateOnly = "2006-01-02"
TimeOnly = "15:04:05"
)
参考文献
- time.Duration.String() | go @ opensource.google
- constants | time package @ pkg.go.dev
- How to format a duration @ StackOverflow