golang时间、时区、格式的使用方法时间、时区、格式的使用方法
前几天,因为需要实现海外服务端定时停机,涉及到时区的概念。网上搜索了一下,大部分都是谈time.Format中的Layout,
非常不成体系,这里就简单总结一下其中的时间初始化、时区转化及格式转换。
开发中,我们对时间的使用是比较多的,其应用场景,按照使用概率,从大到小,通常是:
获取当前或数据库中存储的时间
比较两个时间点的先后
显示打印时间
时区转换
对应到go,也就是几个基本定义:
时间点与时间段:Time,Duration。好比MVC中的M。
时 区:Location,在时间转换上,好比是MVC中的C。
格式化:Format的layout定义,好比MVC中的V。
单独就Duration没什么好谈的,使用非常简单。Time实例中的Add、Sub与其相关,非常容易上手,就不再多说。
时区时区
时区是时间运算非常重要的概念,特别强调与layout是两个完全不同的概念。go语言通过Location来作为时区的运行实例,同
一时刻转换成为不同的时区,就需要通过不同的Location来进行。默认情况下,采用UTC(unix标准时间),而不是过去式的
GMT(格林尼治标准时间)。
以下代码展示了UTC标准、北京、美国洛杉矶在同一时刻的转换:
now := time.Now()
local1, err1 := time.LoadLocation("") //等同于"UTC"
if err1 != nil {
fmt.Println(err1)
}
local2, err2 := time.LoadLocation("Local")//服务器设置的时区
if err2 != nil {
fmt.Println(err2)
}
local3, err3 := time.LoadLocation("America/Los_Angeles")
if err3 != nil {
fmt.Println(err3)
}
fmt.Println(now.In(local1))
fmt.Println(now.In(local2))
fmt.Println(now.In(local3))
//output:
//2016-12-04 07:39:06.270473069 +0000 UTC
//2016-12-04 15:39:06.270473069 +0800 CST
//2016-12-03 23:39:06.270473069 -0800 PST
代码中,LoadLocation的输入参数的取值,除了该函数的源代码中可看到的”UTC”、”Local”,其余的值其实是遵照“IANA Time
Zone”的规则,可以解压$GOROOT/lib/time/zoneinfo.zip 这个文件打开查看。在Asia这个目录,我看到了
Chongqing,Hong_Kong,但没Beijing。在国外获取中国北京时间,要用”PRC”,当然”Asia/Chongqing”也是个方法:
loc, _:= time.LoadLocation("Asia/Chongqing") //参数就是解压文件的“目录”+“/”+“文件名”。
fmt.Println(time.Now().In(loc))
值得强调的是,Location仅用于时区转化,而不对time内部的数据产生影响(内部其实是unix标准时),因此,当几个time实
例进行Add、Sub的时候,不用关注Location是否相同。
时间格式化时间格式化
前面例子中,打印结果非常丑陋,通常没人关心秒之后的ns;明确时区后,很少需要与UTC的时差。这时候,就需要定义我
们的layout了。
网上好多都说,“2006-01-02 15:04:05是go的诞生时间,所以这么设计Format的Layout”,应该不是真的。请看下表:
01/Jan 02 03/15 04 05 06 -07[00][:00] PM Mon
月 日 时 分 秒 年 时差
上下午
星期几