Go 标准库 time 包之 Location 类型 ( 下 )

继续上一章节未完成的话题,我们来看看 Location 类型提供了哪些方法,等等,其实 Location 只有一个方法

方法 说明
String() string 返回一个 Location 对象的字符串表现形式

而且,使用 Location 对象作为参数的,也只有三个,一个都在 Time 类型中,另外两个是 time 包的方法

方法 说明
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time 根据年月日时分秒时区等参数构建一个 Time 对象
func ParseInLocation(layout, value string, loc *Location) (Time, error) 在指定位置 loc 下将字符串转换成一个 Time 对象
func (t Time) In(loc *Location) Time 返回一个时间 t 在另一个位置 loc 下的时刻

而创建一个 Location 对象的方法,也只有区区四个,三个在 time 包中,一个是 Time 类型的方法

方法 说明
func FixedZone(name string, offset int) *Location 返回固定时区偏移量的位置对象
func LoadLocation(name string) (*Location, error) 以一个位置名构建一个位置对象
func LoadLocationFromTZData(name string, data []byte) (*Location, error) 以一个时区名和一些时区信息构建一个位置对象
func (t Time) Location() *Location 返回一个时刻 t 的位置信息 ( 对象 )

等等,上一篇文章翻译错了,不应该把 Location 翻译成时区,而是应该翻译成对象,时区太极限了,没有包含一些夏令时的信息

我去,全部翻译错了,上一章节中的 Location 就应该翻译成位置。

zone 类型

在上一章节中我们知道,Location 包含了一个内部属性 zone ,类型为 zone ,这是 time 包的内部类型。

type zone struct {
    name   string // abbreviated name, "CET"
    offset int    // seconds east of UTC
    isDST  bool   // is this zone Daylight Savings Time?
}

其实,这个 zone 类型才是真正的时区,包含了时区的所有要素,所有的属性说明如下

属性 说明
name 时区名称,比如 CETUTCCESTGMT
offset 相对于 UTC 0 的时间偏移,比如我们北京位于东八区,那么就是 8 * 36400 = 291200
isDST 是否为夏时令

夏时令

夏时令 ( Daylight Saving Time:DST ),又称 「 日光节约时制 」 和 「 夏令时间 」,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为 「 夏令时间 」。

一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电

我们中国,没有夏令时这一说法,所以创建 Location 对象时一般都是使用

secondsEastOfUTC := int((8 * time.Hour).Seconds())
beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)

zoneTrans 类型

Location 类型还有另一个属性 tx ,它的类型为 []zoneTrans

如果翻看源码,可以看到它的定义如下

type zoneTrans struct {
    when         int64 // transition time, in seconds since 1970 GMT
    index        uint8 // the index of the zone that goes into effect at that time
    isstd, isutc bool  // ignored - no idea what these mean
}
属性 说明
when 过渡时间,1970 年 1 月 1 日 0 时 0 分 0 秒 0 纳秒以来的秒数
index 会影响当前时间的时区的索引
isstd 忽略,我也不知道做啥
isutc 忽略,我也不知道做啥

zoneTrans 又是什么呢 ?

zoneTrans 表示的是单个时区的转换。

又是一个头疼的问题,什么叫做时区转换呢 ?

我们还是回来看看上一章节输出的 time.Local 变量的信息中的 zoneTrans 部分

tx:[]time.zoneTrans{
    time.zoneTrans{when:-933494400, index:0x0, isstd:false, isutc:false},
    time.zoneTrans{when:-923130000, index:0x1, isstd:false, isutc:false},
    time.zoneTrans{when:-908784000, index:0x0, isstd:false, isutc:false},
    time.zoneTrans{when:-891594000, index:0x1, isstd:false, isutc:false},
    time.zoneTrans{when:515520000, index:0x0, isstd:false, isutc:false},
    time.zoneTrans{when:527007600, index:0x1, isstd:false, isutc:false},
    time.zoneTrans{when:545155200, index:0x0, isstd:false, isutc:false},
    time.zoneTrans{when:558457200, index:0x1, isstd:false, isutc:false},
    time.zoneTrans{when:576604800, index:0x0, isstd:false, isutc:false},
    time.zoneTrans{when:589906800, index:0x1, isstd:false, isutc:false},
    time.zoneTrans{when:608659200, index:0x0, isstd:false, isutc:false},
    time.zoneTrans{when:621961200, index:0x1, isstd:false, isutc:false},
    time.zoneTrans{when:640108800, index:0x0, isstd:false, isutc:false},
    time.zoneTrans{when:653410800, index:0x1, isstd:false, isutc:false},
    time.zoneTrans{when:671558400, index:0x0, isstd:false, isutc:false},
    time.zoneTrans{when:684860400, index:0x1, isstd:false, isutc:false}
}

非常整齐划一,总共有 16 组,当然了,看这个我们还是一头雾水,索性,把 zone 这个属性也看看

zone:[]time.zone{
    time.zone{name:"CDT", offset:32400, isDST:true},
    time.zone{name:"CST", offset:28800, isDST:false}
}

可以看到 zone 属性有两个时区,一个是 CST ,一个是 CDT

  1. CST 是 Central Standard Time 的缩写,同时可以代表如下 4 个不同的时区:

    • Central Standard Time (USA) UTC-6:00

    • Central Standard Time (Australia) UTC+9:30

    • China Standard Time UTC+8:00

    • Cuba Standard Time UTC-5:00

    CST 可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间

  2. CDT 是 Central Daylight Time (CDT) 的缩写,是使用 CST 的同时又使用夏时令,所以一般会比 CST 早一个小时,这个早,是相对的,如果是西部

    需要注意的是,我们中国,没有夏时令,所以 CDTCST 是一样的。但是,为什么,CDT 变成了东九区 ?

结束语

算了,以后再来补吧。我实在不理解了

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.