LoginSignup
5
5

More than 5 years have passed since last update.

Goのtime.Timeをきちんと検証したことなかったので気になってたことを試してみた。

Posted at

今回の検証はこちらで再現できます。
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億年前って恐竜が出現しはじめたあたり

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5