今回の検証はこちらで再現できます。
https://play.golang.org/p/rFNAYZj-Xn
time.Unix()について振り返り
Godocを見るとこうなっている
func Unix(sec int64, nsec int64) Time
sec
にUnix秒を、nsec
にナノ秒を渡してあげるとtime.Time型が返ってきます。
secにマイナス値って渡せるの?
Unixタイムスタンプで管理されてるはずなので、secとnsecが0の場合は
1970-01-01 00:00:00 +0000 UTC
が返ってくるはず!!
その場合、それ以前の日付って設定出来るの?
0の場合を確認する
package main
import (
"fmt"
"time"
)
func main() {
base := time.Unix(0, 0)
fmt.Printf("Base: %s\n", base.UTC())
// Base: 1970-01-01 00:00:00 +0000 UTC
}
1970-01-01 00:00:00 +0000 UTC
が返ってきた(想定通り)
マイナスの場合を確認する
package main
import (
"fmt"
"time"
)
func main() {
minus := time.Unix(-10000, 0)
fmt.Printf("Minus: %s\n", minus.UTC())
// Minus: 1969-12-31 21:13:20 +0000 UTC
}
1970-01-01 00:00:00
以前の日時が返ってきた!! Σ(゚∀゚ノ)ノキャー
これは他の言語の日付処理から考えると結構すごい。
int64の最大値設定したらどうなるの?
package main
import (
"fmt"
"time"
)
func main() {
max := time.Unix(9223372036854775807, 0)
fmt.Printf("Max: %s\n", max.UTC())
// Max: 219250468-12-04 15:30:07 +0000 UTC
}
きちんと値が返ってきた!!
これで219250467年までは安泰だわ
( ゚∀゚)アハハハ八八八ノ ヽノ ヽノ ヽ
ってそんな生きれないし...
int64の最小値設定したらどうなるの?
最小値設定する
package main
import (
"fmt"
"time"
)
func main() {
min := time.Unix(-9223372036854775807, 0)
fmt.Printf("Min: %s\n", min.UTC())
// Min: 219250468-12-04 15:30:09 +0000 UTC
}
未来の日付が返ってきた。
予想してたけど、ちょっと残念
どこらへんまでまともに動くのか?
package main
import (
"fmt"
"time"
)
func main() {
min2 := time.Unix(-9223372006854775807, 0)
fmt.Printf("Min2: %s\n", min2.UTC())
// Min2: -219245579-09-25 13:49:53 +0000 UTC
}
どこまでいけるかはわからないけど、それなりの値を設定しても問題なく動く。
こんな値設定する機会は滅多にないから大丈夫かな
ちなみに2億年前って恐竜が出現しはじめたあたり