Closed2

時刻の下限値

最近話題になっている COCOA v1.4.0 の不具合について,以下の tweet で言及があった

https://twitter.com/Rabbit_Program/status/1463891077891452934

私は COCOA を含む市民監視ツールに興味がないのでそっちへの言及はスルーするとして,注目したのは

  1. new DateTime()は「0001/01/01 0:00:00」なので、9を引くと下限値を下回り例外発生

の部分。近年 C# に触ってないが,将来触ることがあるかもしれないので気にかけておこう。

ところで「例外」のない Go では,時刻のゼロ値に対する演算はどうなってるんだろうと思い試してみた。

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println((time.Time{}).Add(-9 * time.Hour))
}

これの実行結果

0000-12-31 15:00:00 +0000 UTC

と普通に9時間引かれていた。まぁゼロ値つっても NaN みたいに特別な意味のある値じゃないからな。

なお,ローカル時刻を UTC に変換するのは Go なら簡単にできる。

sample.go
package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Now()
    fmt.Println(t)
    fmt.Println(t.UTC())
}

これの実行結果は

$ go run sample.go
2021-11-26 09:00:00.0000000 +0900 JST
2021-11-26 00:00:00.0000000 +0000 UTC

と,ちゃんと JST から9時間引いた値になる。 UTC 以外でも使えるように,ロケーションを明示したいなら

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Now()
    fmt.Println(t)
-   fmt.Println(t.UTC())
+   fmt.Println(t.In(time.UTC))
}

とすればよい。

ちなみに time.Time 型のメソッドは基本的に値レシーバで受けるので value object として振る舞い,内部状態は変更されない。ご注意を。

このスクラップは2ヶ月前にクローズされました
ログインするとコメントできます