[言語別TIME処理] Go言語で時間処理

2017年5月14日

Go テクノロジー プログラミング 特集

時間操作の要件

  1. 1900年からの秒数(UnixTime)
  2. sleep処理
  3. 1番からYmdHisの取得(曜日含む)
  4. YmdHisから1番の取得
  5. ミリ秒の取得
  6. 本プログラムの経過秒数

ソース

package main import "fmt" import "time" import "strconv" func getUnixTime() int{ return int(time.Now().Unix()) } func getUnixNanoTime() int64{ ntime := time.Now().UnixNano() return ntime % 1e6 / 1e3 } func setSleep(sleepTime int){ fmt.Println("Sleep start ...") time.Sleep(time.Duration(sleepTime) * time.Second) fmt.Println("Sleep finish ...") } func setUnix2Fomat(unixTime int64) string{ dt := time.Unix(unixTime , 0); y := dt.Year() m := int(dt.Month()) d := dt.Day() h := dt.Hour() i := dt.Minute() s := dt.Second() return strconv.Itoa(y) +"/"+ strconv.Itoa(m) +"/"+ strconv.Itoa(d) +" "+ strconv.Itoa(h) +":"+ strconv.Itoa(i) +":"+ strconv.Itoa(s) } func getYmdhis2Unixtime(y int , m int , d int , h int , i int , s int) int64{ t := time.Date( y , time.Month(m) , d , h , i , s , 0 , time.Local) return t.Unix() } func main(){ // 1 tmStart := getUnixTime() fmt.Println(tmStart) // 2 setSleep(3) // 3 dateString := setUnix2Fomat(int64(tmStart)) fmt.Println(dateString) // 4 tmFormat := getYmdhis2Unixtime(1970 , 1 , 1 , 9 , 0 , 1) fmt.Println(tmFormat) // 5 fmt.Println(getUnixNanoTime()) // 6 tmEnd := getUnixTime() fmt.Println(tmEnd - tmStart , "s") }

実行

$ time go run timeFunction.go 1494635031 Sleep start ... Sleep finish ... 2017/5/13 9:23:51 1 336 3 s real 0m3.239s user 0m0.136s sys 0m0.080s

解説

1. sleep-time

int値ではエラーになるので、time.Duration(**)としなければいけない ここの箇所 time.Duration(sleepTime)

2. time.Sleep()はナノ秒処理

time.Secondを掛け合わせると良い time.Sleep(time.Duration(sleepTime) * time.Second)

3. Month()が何故か文字列で返る

本来なら下記のように書くと、その月の数値が返ってほしいのに・・・ time.Now().Month() > May なんじゃこりゃ・・・・ この値に誰が喜んでいるのか非常に微妙!! という事でint変換すると数値に返る・・・ int(time.Now().Month()) > 5 これはこれで意味が分かりにくいが、とりあえず、Go言語の日付取得の際のセオリーのようだ。

4. 年月日などの数値からtime型にする方法

下記が構文 年 , 月 , 日 , 時 , 分 , 秒 , ナノ秒 , TimeZone t := time.Date( y , time.Month(m) , d , h , i , s , 0 , time.Local) いくつか違和感がありますが、ナノ秒は0を入れる以外にあまりイメージできないので、正直指定する必要あるのか?と思うがこれは仕様と割り切り、 timezoneは、よく考えられている仕様と感心し、 またもや月の箇所は、新喜劇のオチのような書き方。 これも仕様と割り切りましょう。 ※忘れないように!!!

5. ミリ秒の求め方

time.Now().UnixNano() % 1e6 / 1e3 これで下6桁を切り捨てて、下3桁を取得することで、ミリ秒が取得できます。 正直9桁もいらんので、これで十分

参考サイト

  1. time関連
  2. sleep処理
  3. 問題解決
  4. ブラウザで実行
  5. monthの文字列を数値で返す
  6. Goで詰まった所、ググった所メモ
  7. Golangで型情報を調べる
  8. Go / golang time.Now().UnixNano() convert to milliseconds?

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。