Go 标准库 time 包之 Month 类型
我们都是知道,对于时间 ( Time ) 中的月份,有三种表示方法,最常见的就是 1 2 3 ... 12 等 12 个阿拉伯数字,还有另外一种英文的表示方法就是使用 January 、February、March ... December 等十二个英文单词,而第三种则是由第二种中的每个英文单词取前三个英文字母组成的 Jan 、 Feb 、Mar ... Dec
中文的 一 二 三 十二 就不算了,哈哈,仅能算是一种本地化 ( Locale ) 的方法
因为第三种是第二种的简写,所以,其实也算不上是一种了。那么剩下的两种,是有一一对应关系的
1 2 3 4 5 6 7 8 9 10 11 12 January February March April May June July August September October November December
Go 也为这种一一关系定义了常量,源码如下
const ( January Month = 1 + iota February March April May June July August September October November December )
从上面的代码中可以看到,这十二个英文单词的常量的首字母是大写的,也就是可以在 time
包外使用,而且,它们都有一个类型 Month
这十二个常量是递增的,January = 1
、February = 2
... 以此类推
Month
类型
Month
类型是 int
类型的别名
type Month int
该类型用于指定一年中的一个月,比如 January = 1
months
变量
另外,在源码中,其实还可以看到 time
包定义了一个内部使用的变量 months
变量 months
定义了每个月份的字符串表现形式,下标从 0
开始
var months = [...]string{ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", }
Month
方法
Month
类型只有一个方法,就是 String()
,该方法原型如下
func (m Month) String() string
该方法把一个 Month
类型的月份转换为英文单词的月份,比如 time.January
就返回 January
其实,看源码,很简单的,就寥寥几行
func (m Month) String() string { if January <= m && m <= December { return months[m-1] } buf := make([]byte, 20) n := fmtInt(buf, uint64(m)) return "%!Month(" + string(buf[n:]) + ")" }
当 Month
对象在 time.January
和 January.December
之间 ( 包括两者 ) 时,返回它们的字符串表现形式
如果不在这个区间,则返回 "%!Month(" + string(buf[n:]) + ")"
这种格式,比如 `%!Month(13)"
范例
Month
类我们一般不会自己去实例化一个对象,一般都是从 Time
对象的 Date()
方法中获得,例如下面的代码
package main import ( "fmt" "time" ) func main() { _, month, day := time.Now().Date() println("当前的月份是:", month) if month == time.November && day == 10 { fmt.Println("Happy Go day!") } }
因为今天是 2018 年 8 月 31 日,所以运行结果为
当前的月份是: 8