ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Golang 时间格式化

2022-01-01 16:00:59  阅读:199  来源: 互联网

标签:01 格式化 Golang Unix tm 时间 2022 time 格式


Unix 时间戳

===========

首先, unix 时间戳的单位是秒, 表示从美东时间(UTC) 的 1970 年 1 月 1号的 0点 到现在,经过的秒数。因为 Unix 时间的定义中,已经明确了使用美东时间,所以我们在使用的时候,不用指定 unix 时间戳所在的地区。

UTC 和 CST 时间格式

对于中国的程序员来说,在初始 utc 和 cst 时间上,可能需要做一些额外操作。

首先, cst 时间比 utc 时间快 8 小时,一般来说 CST = UTC + 8

Unix 转 时间格式

默认时区/ 本地时区

在 golang 语言体系中,如果不指定时区,则默认使用系统指定的时区

 ⚡ root@dnvim  ~/.config/nvim   master  date
Sat Jan  1 05:36:28 UTC 2022

通过date 命令,可以查看 linux 系统的时区是什么,可以看到我测试的机器上用的 UTC 时区

在写一个简单的单元测试,看下 time.Time 数据结构输出格式

// 从 unix 时间 转换成固定时间格式
func TestTime1(t *testing.T) {
    ts := time.Now().Unix()
    tm := time.Unix(ts, 0)
    log.Printf("tm=%+v", tm)
}

=== RUN TestTime1
2022/01/01 05:18:12 tm=2022-01-01 05:18:12 +0000 UTC
— PASS: TestTime1 (0.00s)
PASS

[Process exited 0]


我在执行测试文件的时候,是北京时间(CST) 的 13:18 , 但是程序显示为 05:18 (UTC)

如果我们直接将这个时间输出出来,对于国内用户来说,会比较难以理解(毕竟输出的时间和北京时间无法对齐)

### 指定时区

在 golang 中,可以指定的时区有这些,这些文件可以在`$GOROOT/lib/time/zoneinfo.zip` 中找到,解压`zoneinfo.zip`可以得到一堆目录和文件,我们只需要目录和文件的名字,时区名格式是`目录名/文件名`

从上述文件中,我们可以找到, 北京时间的格式为`Asia/Shanghai` 和`Asia/Chongqing`,代码中指定CST如下

func TestTime2(t *testing.T) {
ts := time.Now().Unix()
loc, _ := time.LoadLocation(“Asia/Shanghai”)
tm := time.Unix(ts, 0).In(loc)
log.Printf(“tm=%+v”, tm)
}

=== RUN   TestTime2
2022/01/01 05:54:29 tm=2022-01-01 13:54:29 +0800 CST
--- PASS: TestTime2 (0.00s)
PASS

[Process exited 0]
```

可以看到指定输出为 CST 格式

### 指定格式

当然,我们可能不满足于只能输出固定格式的时间字符串,比如想输出`2022年01月01日,05时54分` 这样的格式,可以怎么做呢。golang 提供了一个模板,可以让我们自定义输出格式。

| 数据 | 占位符 |
| --- | --- |
| 月份 | 1, 01, Jan, January |
| 日 | 2, 02, \_2 |
| 时 | 3,03,15,PM,pm,AM,am |
| 分 | 4,04 |
| 秒 | 5,05 |
| 年 | 06,2006 |
| 时区 | \-07,-0700,Z0700,Z07:00,-07:00,MST |
| 周几 | Mon,Monday |

```
func TestTime3(t *testing.T) {
    ts := time.Now().Unix()
    loc, _ := time.LoadLocation("Asia/Shanghai")
    tm := time.Unix(ts, 0).In(loc).Format("2006 年 01 月 02 日, 15时 04 分")
    log.Printf("tm=%+v", tm)
}

=== RUN TestTime3
2022/01/01 06:04:36 tm=2022 年 01 月 01 日, 14时 04 分
— PASS: TestTime3 (0.00s)
PASS

[Process exited 0]


可以看到, golang 已经按照输出我们预期的格式了

这里需要注意的是,`2016.01.0215:04:05` 应该严格按照golang 指定的占位符来使用,不能自己用其他时间表示 年、月、日、时、分、秒、周几

比如下面的代码,会得到非预期的结果

func TestTime4(t *testing.T) {
ts := time.Now().Unix()
loc, _ := time.LoadLocation(“Asia/Shanghai”)
tm := time.Unix(ts, 0).In(loc).Format(“2006 年 01 月 02 日, 10时 04 分”)
log.Printf(“tm=%+v”, tm)
}

=== RUN   TestTime4
2022/01/01 06:07:27 tm=2022 年 01 月 01 日, 10时 07 分
--- PASS: TestTime4 (0.00s)
PASS

[Process exited 0]
```

标签:01,格式化,Golang,Unix,tm,时间,2022,time,格式
来源: https://blog.csdn.net/Yang_Fei_Long/article/details/122268174

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有