Go语言的时间格式风格详解

jopen 11年前

time package

go 的time package 提供了time.Format函数,用来对时间进行格式化输出。

类似的还有time.Parse用来解析字符串类型的时间到time.Time。这是两个互逆的函数。

问题是,go 采用的格式化 layout 和我们以往所用的任何经验都不同。以至于初次接触总是一头雾 水。

其实 go 提供的这个 layout 对算法的实现非常科学高效,而且很规律。下面我们详细分解下。

直接上个对应表

前面是含义,后面是 go 的表示值,多种表示,逗号","分割

  • 月份 1,01,Jan,January
  • 日  2,02,_2
  • 时  3,03,15,PM,pm,AM,am
  • 分  4,04
  • 秒  5,05
  • 年  06,2006
  • 时区 -07,-0700,Z0700,Z07:00,-07:00,MST
  • 周几 Mon,Monday

您看出规律了么!哦是的,你发现了,这里面没有一个是重复的,所有的值表示都唯一对应一个时间部分。并且涵盖了很多格式组合。

比如小时的表示(原定义是下午3时,也就是15时)

  • 3 用12小时制表示,去掉前导0
  • 03 用12小时制表示,保留前导0
  • 15 用24小时制表示,保留前导0
  • 03pm 用24小时制am/pm表示上下午表示,保留前导0
  • 3pm 用24小时制am/pm表示上下午表示,去掉前导0

又比如月份

  • 1 数字表示月份,去掉前导0
  • 01 数字表示月份,保留前导0
  • Jan 缩写单词表示月份
  • January 全单词表示月份

实例对应

真实时间:我的UTC时间是 2013年12月5日,我的本地时区是Asia

字符表示:  2013 12 5 Asia

Go Layout: 2006 01 2 MST

真实时间:我的UTC时间是 2013年12月22点,我的本地时区是Asia

字符表示:  2013 12 22 Asia

Go Layout: 2006 01 15 MST

是滴,上面这个时间是合法的,虽然没有说是那一天,但是说了小时

而所有这些数字的顺序正好是1,2,4,5,6,7和一个时区MST

其实还有一个秒的 repeated digits for fractional seconds 表示法

用的是 0和9 ,很少用,源代码里面是这样写的

stdFracSecond0                          // ".0", ".00", ... , trailing zeros included  stdFracSecond9                          // ".9", ".99", ..., trailing zeros omitted

</div> </div>

那些分界符

除了那些值之外的都是分界符号,自然匹配了,直接举例子吧

字符表示:  2013-12 21 Asia

Go Layout: 2006-01 15 MST

字符表示:  2013年12月21时 时区Asia

Go Layout: 2006年01月15时 时区MST

好了,您是否感觉这个表示方法兼容度更好,适应性更强呢,更容易记忆呢。