Go 标准库 time 包之 Weekday 类型
周 ( week ) 并不是时间 ( Time ) 中的一个组成部分,只是因为工业革命以来,由于要区分上班日子和非上班日子,也为了每隔一段时间给工人们休息几天,而定下的一种规矩。
目前这种通用的循环是以 7 天为单位,也就是 7 天是一个循环,周六和周日一般是法定休息日,而周一到周五是法定上班日。
当然了,一般情况下,便于记忆,会使用一些英文单词来助记,也就是 sunday monday tuesday ... saturday
西方国家,每周的开始是我们所谓的周天 sunday
,而我们中国,一周的开始是周一 monday
Go 为了方便,把这几个英文定义为常量了
const ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturday )
而且,还为此专门定义了一个类型 Weekday
。
需要注意的是,在 time
包中,每周的开始是 0
,也就是 time.Sunday
的值为 0
Weekday
类型
我们再来看看 Weekday
类型的定义
type Weekday int
Weekday
用于指定某一天是星期几。
和 Month 类型 一样,Weekday
也是 int
的一个别名
days
变量
另外,在源码中,其实还可以看到 time 包定义了一个内部使用的变量 days
变量 days 定义了一周中的每一天的的字符串表现形式,下标从 0 开始
var days = [...]string{ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", }
Weekday
类型的方法
Weekday
类型只有一个方法,就是 String() ,该方法原型如下
func (d Weekday) String() string
该方法把一个 Weekday 类型的周几转换为英文单词的周几,比如 time.Sunday 就返回 "sunday"
其实,看源码,很简单的,就寥寥几行
// String returns the English name of the day ("Sunday", "Monday", ...). func (d Weekday) String() string { if Sunday <= d && d <= Saturday { return days[d] } buf := make([]byte, 20) n := fmtInt(buf, uint64(d)) return "%!Weekday(" + string(buf[n:]) + ")" }
当 Weekday 对象在 time.Sunday 和 January.Saturday 之间 ( 包括两者 ) 时,返回它们的字符串表现形式
如果不在这个区间,则返回 "%!Weekday(" + string(buf[n:]) + ")" 这种格式,比如 `%!Weekday(8)"
范例
Weekday 类我们一般不会自己去实例化一个对象,一般都是从 Time 对象的 WeekDay() 方法中获得,例如下面的代码
package main import ( "fmt" "time" ) func main() { t := time.Now() weekday := t.Weekday() fmt.Printf("%s\n", t) println("今天是周", weekday) if weekday == time.Friday { fmt.Println("Happy Go Friday!") } }
运行结果为
2018-08-29 06:26:45.647666 +0800 CST m=+0.000566326 今天是周 3