Golangで日時を使う時にはTimeパッケージを使う

golang日付処理

Golangで頻繁に使う日付処理をまとめてみました。
年・月・日をそれぞれ単独で表示したい、
「2020-12-31」または「2020/12/31」と年月日だけ表示したい、「23:59」と時刻だけ表示したい
などの場合には、Year、Month、Day、Formatメソッドで単独で値を取得出来ます。
その他、日時に関する処理の備忘録です。

今回は、go playgroundで実行結果も記載してみました。
※テスト用の日付で「2020年12月31日23時59分59秒」を使用しています。

Golangで現在時刻でフォーマットされた日時を取得

現在の日時を取得するには、Now関数を使用する。
※go playgroundでのtime.Now()実行結果は固定値が返される設定になっています。

package main

import (
	"fmt"
	"time"
)

// タイムゾーンの指定
var timeZoneJST = time.FixedZone("Asia/Tokyo", 9*60*60)

func main() {
	// タイムゾーン指定
	time.Local = timeZoneJST
	time.LoadLocation("Asia/Tokyo")
	t := time.Now()
	
	// 現在時刻を取得する
	fmt.Println(t)
	
	// 年の取得
	fmt.Println(t.Year())
	// 月の取得
	fmt.Println(int(t.Month()))
	// 日の取得
	fmt.Println(t.Day())
	
	//「2020-12-31」または「2020/12/31」と年月日だけ表示したい
	const format1 = "2006-01-02"
	fmt.Println(t.Format(format1))

	const format2 = "2006年01月02日 15時04分05秒"
	fmt.Println(t.Format(format2))

	//「23:59」と時刻だけ表示
	const format3 = "15:04"
	fmt.Println(t.Format(format3))
}

The Go Playgroundとは
Golangの大本golang.orgのサーバで動いている実行環境だで、受け取ったコードをコンパイル→実行→結果出力までをWeb上でやってくれる便利なサービスです。
もちろん実行できるプログラムには制限があるが、
コードを共有する際や、簡単な処理などはGoPlaygroundで気軽に試せるので重宝したい。

指定した日付でフォーマットされた日時を取得

Date関数に「年、月、日、時、分、秒、ミリ秒、タイムゾーン」の順で指定する
ことで特定の日時をデータオブジェクトを取得することが出来ます。

また、指定する日時が「2020/12/31」などの文字列の場合は、ParseInLocation関数にて、日付型にパースすることで日付を扱うことが出来ます。

package main
import (
	"fmt"
	"time"
)
// タイムゾーンの指定
var timeZoneJST = time.FixedZone("Asia/Tokyo", 9*60*60)

func main() {
	t := time.Date(2020, 12, 31, 23, 59, 59, 0, timeZoneJST)
		
	// 年の取得
	fmt.Println(t.Year()) // 2020
	// 月の取得
	fmt.Println(int(t.Month())) // 12
	// 日の取得
	fmt.Println(t.Day()) // 31
	
	//「2020-12-31」または「2020/12/31」と年月日だけ表示したい
	const format1 = "2006-01-02"
	fmt.Println(t.Format(format1)) // 2020-12-31

	const format2 = "2006年01月02日 15時04分05秒"
	fmt.Println(t.Format(format2)) // 2020年12月31日23時59分59秒

	//「23:59」と時刻だけ表示
	const format3 = "15:04"
	fmt.Println(t.Format(format3)) // 23時59分
}

Golangの初見殺し!なぜ「2006-01-02 15:04:05」なのか?
多言語を見渡す限りフォーマットに指定する文字列は「%Y」や「yyyy-mm-dd」、「Y-m-d」などが一般的なんだが、
Golangに関しては、
「%Y」→ 「2006」
「yyyy-mm-dd」→「2006-01-02」
といった形で、実在する日時がフォーマット指定文字列となっている。
理由は、アメリカ式の日時の順番が、”1月2日午後3時4分5秒2006年”で有ることが関係している。
自然な並びで(1, 2, 3, 4, 5, 6)としたかったらしい・・・なんともアメリカらしい。

時刻中の曜日を日本語に変換する

取得した英語表記の曜日を“日”, “月”, “火”, “水”, “木”, “金”, “土”に変換し表示したい場合は、Weekday関数で曜日の値を取得し日本語の曜日とマッピングしてあげましょう。

UNIXタイムをTimeオブジェクトに変換する

取得したUNIXの時間を”2010-03-06 18:20:37 +0900 JST”形式のTimeオブジェクトに変換する際は、time.Unix関数で日時を取得出来ます。

日時に関する演算

日時を比較する

日付を比較する際はEqual関数Before関数After関数で2つの日付を比較します。

日時に任意の時間を加えたり、引いたりする

add関数を用いて、ある日時に対して、時間・分・秒をそれぞれ足したり引いたりします

2つの時刻の差を求める

sub関数を使って、2つの日時の差を求める処理です

今注目のGo言語の案件相場・報酬まとめ【フリーランス必見】


プロに聞いてみる
株式会社adanはエンジニアのキャリアに真剣に向き合っています。
企業の情報エンジニアとしてのキャリアアップの方法、現在の待遇(給料・報酬)未経験からのステップアップ方法などのご相談を受け付けています。
お気軽にお問合せください。