Go言語:日付の操作
Go言語の日付操作について書き留めておきます。
パッケージ
Go言語で日付操作を行う場合はtimeという標準パッケージを使います。
import ( "fmt" "time" //日付操作を行うためのパッケージ )
まずは基本形
現在の日時+時刻を得るのはNow関数を使います。そのままこれをコンソール出力すると決まったフォーマットで出力されますが、年月日などを個別に抜き出して表示する方法もあります。コードが少し冗長になりますが。
あと、曜日を示すWeekdayを出力すると英語表記の曜日文字列が現れるのも面白いですね。
t := time.Now() fmt.Println(t) fmt.Printf("%d/%d/%d %d:%d:%d\n",t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()); fmt.Println(t.Weekday())
実行例はこんな感じです。
2017-08-02 06:59:19.4799254 +0900 JST
2017/8/2 6:59:19
Wednesday
[ad#top-1]
日付の足算
日付の加算にはAddDate関数を使います。使用例は以下の通り。一度に年月日の加算をそれぞれできるのがうれしいです。
t := time.Now() t1 := t.AddDate(0, 0, 1) // 1日後 t2 := t.AddDate(0, 1, 0) // 1ヶ月後 t3 := t.AddDate(1, 0, 0) // 1年後 fmt.Println(t1) fmt.Println(t2) fmt.Println(t3)
実行例です。
2017-08-04 05:36:54.6620139 +0900 JST
2017-09-03 05:36:54.6620139 +0900 JST
2018-08-03 05:36:54.6620139 +0900 JST
月末の日付を得る
月末を求めるにも加算時と同じくAddDate関数を使います。ちょっとテクニックを使います。これは覚えておくと便利です。
t := time.Now() t1 := t.AddDate(0, 0, -1 * t.Day()) //先月末 t2 := t.AddDate(0, 1, -1 * t.Day()) //今月末 t3 := t.AddDate(0, 0, -1 * t.Day() + 1) //今月頭 fmt.Println(t1) fmt.Println(t2) fmt.Println(t3)
実行例。ちゃんと月初月末が現れました。
2017-07-31 05:43:35.2520771 +0900 JST
2017-08-31 05:43:35.2520771 +0900 JST
2017-08-01 05:43:35.2520771 +0900 JST
文字列から日付型に変換する
日付の文字列から日付型に変換する方法です。VBAとC#では「20170728」という文字列は変換できませんでしたが、なんとGo言語では可能です。
面白いのは第一引数が「2006年1月2日 15時4分5秒」でないといけない点です。1日でも異なるとちゃんと変換してくれません。(エラーにもならないのでバグになり得て怖いんだけど…)
t1, _ := time.Parse("2006-01-02", "2017-08-03") t2, _ := time.Parse("2006-1-2", "2017-8-3") t3, _ := time.Parse("2006/1/2", "2017/8/3") t4, _ := time.Parse("20060102", "20170803") t5, _ := time.Parse("2006-01-02 15:04:05", "2006-08-02 05:57:12") fmt.Println(t1) fmt.Println(t2) fmt.Println(t3) fmt.Println(t4) fmt.Println(t5)
実行例。
2017-08-03 00:00:00 +0000 UTC
2017-08-03 00:00:00 +0000 UTC
2017-08-03 00:00:00 +0000 UTC
2017-08-03 00:00:00 +0000 UTC
2006-08-02 05:57:12 +0000 UTC
日付同士の計算
日付同士の計算はちょっとクセがあります。Sub関数を使って2つの日付間の差を出します。現在時刻との差にSince関数を使っていますが、time.Now().Parse(t2)でもOKです。
t1, _ := time.Parse("2006-01-02", "2017-08-03") t2, _ := time.Parse("2006-01-02", "2017-07-03") fmt.Println(t1.Sub(t2)) //t1とt2との差 fmt.Println(time.Since(t2)) //現在時刻とt2との差
実行例。
744h0m0s
764h4m30.9494714s
[ad#ad-1]
スポンサーリンク