GolangのtimeパッケージのAddDateを使うと月末の1ヶ月前は月初になるんだな
こんにちはこんにちは
KOFのキャラではハイデルンが好きな僕です。
会社のポプ子みたいなノリの人から日々煽られながら生きています。
まぁそんなことはどうでもよくて、ちらっとブログ書こうと思ったので書きます。
GolangのtimeのAddDateを使うと3月末の1ヶ月前は3月の月初になる。
3月31日の1ヶ月後は5月1日である。
何を言っているのか一瞬わからないと思うが、Golang書いてたら、timeの.AddDateが予想外の動きしてたのがわかったのでメモ・・・
1 2 3 4 |
time.Date(2018, 3, 29, 0, 0, 0, 0, time.UTC) time.Date(2018, 3, 29, 0, 0, 0, 0, time.UTC).AddDate(0, -2, 0)) time.Date(2018, 3, 29, 0, 0, 0, 0, time.UTC).AddDate(0, -1, -1)) time.Date(2018, 3, 29, 0, 0, 0, 0, time.UTC).AddDate(0, -1, 0)) |
・ 結果
1 2 3 4 |
2018-03-29 20:07:44.699898528 +0900 JST m=+0.184282344 2018-01-29 20:07:44.69991119 +0900 JST <- 3/29から2ヶ月引くわけだからわかる 2018-02-28 20:07:44.699942741 +0900 JST <- 3/29から1ヶ月と1日引くわけだからわかる 2018-03-01 20:07:44.69995706 +0900 JST <- 3/29から1ヶ月引くと3/1 ???? |
・ 結論
こういう動きをしている
3/29
の1ヶ月前は 2/29
なので存在しないため、 3/1
になってしまっている
たとえば、
– 3/30
の1ヶ月前は 2/30
なので存在しないため、 3/2
になる
– 1/31
の1ヶ月後は 2/31
なので存在しないため、 3/3
になる
sourceを見てみると、
1 2 3 4 5 |
https://golang.org/src/time/time.go // The month, day, hour, min, sec, and nsec values may be outside // their usual ranges and will be normalized during the conversion. // For example, October 32 converts to November 1. |
なんで、、、なんで、、、 convertしてしまうんだ、、、、
このconvertがきいてしまっている結果このような状況になるっぽい。。。
まぁ仕様っぽいからしょうがないけど知らないと危なそうだなと思った。