加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 钦州站长网 (https://www.0777zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Unix 转 时间格式

发布时间:2022-09-16 15:35:54 所属栏目:Unix 来源:
导读:  Unix 时间戳

  首先unix时间戳, unix 时间戳的单位是秒, 表示从美东时间(UTC) 的 1970 年 1 月 1号的 0点 到现在,经过的秒数。 因为 Unix 时间的定义中,已经明确了使用美东时间,所以我们在使用的时候
  Unix 时间戳
 
  首先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]
 

(编辑:PHP编程网 - 钦州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读