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

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

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