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 | 时区名称,比如 CET 、UTC 、CEST 、GMT 等 |
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
-
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 可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间
-
-
CDT
是 Central Daylight Time (CDT) 的缩写,是使用 CST 的同时又使用夏时令,所以一般会比 CST 早一个小时,这个早,是相对的,如果是西部需要注意的是,我们中国,没有夏时令,所以
CDT
和CST
是一样的。但是,为什么,CDT 变成了东九区 ?
结束语
算了,以后再来补吧。我实在不理解了