package main
import (
"fmt"
"time"
)
func main() {
// 地域名から Location を取得
loc, _ := time.LoadLocation("America/New_York")
// Location を指定して日時を表示
fmt.Println(time.Now().In(loc)) //=> 2009-11-10 18:00:00 -0500 EST
// サマータイムと標準時の切り替わりの挙動を確認する
// サマータイムを採用している地域の Location では日時によってタイムゾーンが切り替わる
fmt.Println("サマータイム開始")
fmt.Println(time.Date(2018, 3, 11, 6, 59, 59, 0, time.UTC).In(loc)) //=> 2018-03-11 01:59:59 -0500 EST
fmt.Println(time.Date(2018, 3, 11, 7, 0, 0, 0, time.UTC).In(loc)) //=> 2018-03-11 03:00:00 -0400 EDT
fmt.Println("サマータイム終了")
fmt.Println(time.Date(2018, 11, 4, 5, 59, 59, 0, time.UTC).In(loc)) //=> 2018-11-04 01:59:59 -0400 EDT
fmt.Println(time.Date(2018, 11, 4, 6, 0, 0, 0, time.UTC).In(loc)) //=> 2018-11-04 01:00:00 -0500 EST
// サマータイムを採用している地域の時刻をパースする
// タイムゾーン名やオフセットがない場合は該当地域の指定時刻のタイムゾーンが適用される
t, _ := time.ParseInLocation("2006-01-02 15:04:05", "2018-03-11 01:00:00", loc)
fmt.Println(t) //=> 2018-03-11 01:00:00 -0500 EST
t, _ = time.ParseInLocation("2006-01-02 15:04:05", "2018-03-11 03:00:00", loc)
fmt.Println(t) //=> 2018-03-11 03:00:00 -0400 EDT
// タイムゾーン名を指定すればそのタイムゾーンになる
// 例はサマータイムから標準時に切り替わる際にタイムゾーン違いで二度あらわれる 1 時をパースする
t, _ = time.ParseInLocation("2006-01-02 15:04:05 -0700", "2018-11-04 01:00:00 -0400", loc)
fmt.Println(t) //=> 2018-11-04 01:00:00 -0400 EDT
t, _ = time.ParseInLocation("2006-01-02 15:04:05 -0700", "2018-11-04 01:00:00 -0500", loc)
fmt.Println(t) //=> 2018-11-04 01:00:00 -0500 EST
}