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 = 1February = 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.JanuaryJanuary.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
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

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

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