其它编程语言的开发者,在第一次使用Go的时间格式化方法时一定会一脸懵逼,为什么不是我熟悉的yyyy、MM、dd,而是一个特殊的年、月、日数字呢?

首先看一下正确的使用方法

// 代码
s := time.Now().Format("2006-01-02 15:04:05.999999")
fmt.Printf("%s\n", s)

// 结果(正确)
2022-06-14 23:21:48.655781

如果后面的时间随便输入呢?(其实我是复制上面的输出结果)

// 代码
s := time.Now().Format("2022-06-14 23:21:48.655781")
fmt.Printf("%s\n", s)

// 结果(出乎意料)
141414-22-627 1411:146:278.61818786

既然必须得按人家的规范来,那我们如何方便快速得记住这段神奇的数字呢?
官方的文档和源码中有这么一记录:

// These are predefined layouts for use in Time.Format and time.Parse.
// The reference time used in these layouts is the specific time stamp:
//    01/02 03:04:05PM '06 -0700

其实就是1月2日3点(下午)4分5秒6年-7时区(崔健:一二三四五六七呀……
我们日常习惯都是年月日,给记忆带来了一丢丢麻烦,不管时区的话就是:612345。
记住了吗?写几个试试呗?

// 代码
s := time.Now().Format("2006年01月02日 15时04分05秒999毫秒")
fmt.Printf("%s\n", s)

// 输出(发现了吗?除了毫秒都正确!)
2022年06月14日 23时46分45秒999毫秒

// 经过测试,发现毫秒前面必须有:,或者.,使用9或者0都可以
time.Now().Format("2006年01月02日 15时04分05秒.000毫秒")


// 代码(整个奇怪的形状,月日时秒不补0)
s := time.Now().Format("2006/1/2 3:04:5")
fmt.Printf("%s\n", s)

// 输出
2022/6/14 11:53:2

各种细节还是得看文档:

//    Year: "2006" "06"
//    Month: "Jan" "January"
//    Textual day of the week: "Mon" "Monday"
//    Numeric day of the month: "2" "_2" "02"
//    Numeric day of the year: "__2" "002"
//    Hour: "15" "3" "03" (PM or AM)
//    Minute: "4" "04"
//    Second: "5" "05"
//    AM/PM mark: "PM"

看了这么多,你学废了吗?如果还不会用,那就自己封装一个yyyyMMdd自己习惯的方式吧,Go纯粹就是把2006、01、02这些数字当成了yyyMMdd这种方式用了……


zhjx922
1.3k 声望120 粉丝

骑驴十三载,不知火烧是何味