LoginSignup
0
1

【Golang】time.Duration のフォーマット出力【経過秒を H:m:s.ms 形式で出力】

Last updated at Posted at 2023-07-04

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 (今北産業)

  1. 経過秒の文字列から time.Duration オブジェクトを作成する。
  2. UNIX 時間がゼロ秒の time.Time オブジェクトを作成し、上記の経過ぶんを加算する。
  3. 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)
}

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"
)

参考文献

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1