非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

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

 

実行例はこんな感じです。

$ go run ./time.go
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)
 

 

実行例です。

$ go run ./time.go
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)
 

 

実行例。ちゃんと月初月末が現れました。

$ go run ./time.go
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)
 

 

実行例。

$ go run ./time.go
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との差
 

 

実行例。

$ go run ./time.go
744h0m0s
764h4m30.9494714s

 

[ad#ad-1]

スポンサーリンク

 - Go言語