数据库的日期和时间
日期和时间是任何语言都必须处理好的事情。我们知道,在MySQL中,日期部分有date类型,时间部分有time类型,日期和时间都包含的类型有datetime类型(时间戳有timestamp类型)。比如,“2020-05-18 08:53:34.083”的日期部分就是“2020-05-18”,时间部分就是“08:53:34.083”。
语言对时间的诉求
在任何语言的使用过程中,我们无非是以下几点诉求:
- 时间能按照我们想要的格式化输出
- 时间能从字符串被解析成语言的内置时间类型
- 时间能加减、互相比较
- 能轻松计算一段代码的运行时间
- 能与数据库时间轻松地相互转换
- 支持时区设置,能轻松转换成某一地区的时间
Go语言中的时间能满足这上面的所有需求。
Go语言内置时间库
Go语言中的时间类型在内置的time库中,为Time类型。看一下Time的定义,wall是秒数,ext是纳秒,loc表示时区。这几个属性是私有属性,我们不必太关注。
type Time struct {
wall uint64
ext int64
loc *Location
}
新建Time实例可以使用time.Parse和time.ParseInLocation方法,或者使用time.Now()获取当前机器的时间。
还有Duration类型,表示两个时间之间的间隔,精确到纳秒,最大能表示大约290年的时间间隔。
type Duration int64
新建Duration实例可以使用time.ParseDuration方法或者直接获取Duration常量比如time.Second或者time.Minute等。
还有Timer类型,表示计时器。Timer中含有通道C,如果计时器不是使用AfterFunc方法创建的,则,当计时器到时间了,当前时间就会被传到通道C中;如果计时器是AfterFunc创建的,则计时器到时间了,会调用AfterFunc传入的f那个函数。
// The Timer type represents a single event.
// When the Timer expires, the current time will be sent on C,
// unless the Timer was created by AfterFunc.
// A Timer must be created with NewTimer or AfterFunc.
type Timer struct {
C <-chan Time
r runtimeTimer
}<