【原】深度解密Go语言之Time

【原】深度解密Go语言之Time

最近在使用Gorm的时候遇到一个关于时间戳的问题,我以此为切入点仔细的阅读了一下Time的源码。

问题描述

Gorm在序列化与反序列化时的时间格式是挺令人头疼的

  • 平常我们使用的格式
Unix 时间戳: 1462357253
通用格式:2016-05-04 18:20:53
ANSIC       = "Mon Jan _2 15:04:05 2006"
UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
RFC822      = "02 Jan 06 15:04 MST"
RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339     = "2006-01-02T15:04:05Z07:00"   //  默认序列化语反序列化的格式
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen     = "3:04PM"
// Handy time stamps.
Stamp      = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano  = "Jan _2 15:04:05.000000000"

开始解析

基本的时间格式

大家在使用的时候会

fmt.Println(time.Now())
output:
2019-06-26 15:02:29.4333017 +0800 CST m=+0.003985601
  • 时间的存储

time时间最终会用一个int64表示当前的时间,每一位数字表示一纳秒

const (
    Nanosecond  Duration = 1                    //纳秒
    Microsecond          = 1000 * Nanosecond    //微妙
    Millisecond          = 1000 * Microsecond    //毫秒
    Second               = 1000 * Millisecond    //秒
    Minute               = 60 * Second            //分钟
    Hour                 = 60 * Minute            //小时
)
fmt.Println(time.Unix(int64(0), int64(time.Duration(time.Hour))).Format("2006-01-02 15:04:05"))
//otput: 1970-01-01 09:00:00

fmt.Println(time.Unix(int64(math.MaxInt64), 0).Format("2006-01-02 15:04:05"))
//output: 292277026596-12-05 00:30:07
//此处计算方式是以秒为单位,是不对的

fmt.Println(time.Unix(int64(math.MaxInt64/time.Duration(time.Second)), 0).Format("2006-01-02 15:04:05"))
//output: 2262-04-12 08:47:16
// 正确的最大时间

基本使用

func After(d Duration) <-chan Time
func Sleep(d Duration)
func Tick(d Duration) <-chan Time
type Duration int64

参考文章

官方文档 https://golang.org/pkg/time/


  Reprint please specify: KYLE LIU 【原】深度解密Go语言之Time

  TOC