解决Golang time.Parse和time.Format的时区问题


Posted in Golang onApril 29, 2021

一、问题描述

在windows下,time.Parse()的时区和time.Format()的时区是一致的。

但是在linux环境下,time.Parse()的默认时区是UTC,time.Format()的时区默认是本地,两者如果不处理好就会导致错误。

package main
import "time"
import "fmt"
func main(){
    t, err := time.Parse("2006-01-02 15:04:05", "2017-12-03 22:01:02")
    if err != nil{
        fmt.Println(err)
        return
    }
    fmt.Println(t)
    fmt.Println(time.Now())
    fmt.Println(time.Now().Sub(t).Seconds())
}

输出:

2017-12-03 22:01:02 +0000 UTC

2017-12-03 22:15:26.592204446 +0800 CST m=+0.003020091

-27935.407549533

很明显能看到两者的时区不同并且如果把两者时间相减结果也不符合预期。

二、解决方法

使用time.ParseInLocation()而不是time.Parse():

package main
import "time"
import "fmt"
func main(){
    localTime, err := time.ParseInLocation("2006-01-02 15:04:05", "2017-12-03 22:01:02", time.Local)
    if err != nil{
        fmt.Println(err)
        return
    }
    fmt.Println(localTime)
    fmt.Println(time.Now())
    fmt.Println(time.Now().Sub(localTime).Seconds())
}

结果:

2017-12-03 22:01:02 +0800 CST

2017-12-03 22:18:26.288174547 +0800 CST m=+0.001532618

1044.288357362

补充:最自恋的golang的time.Format的坑

我想格式化输出日期

fmt.
  Println
  (time.
  Now
  ().
  Format
  (
  "2010-10-10 15:04:05"
  ))

结果输出了

9060-60-60 11:11:36

这什么鬼

百度了一个

fmt.
  Println
  (time.
  Now
  ().
  Format
  (
  "2006-01-02 15:04:05"
  ))

这就输出正确了

2017-06-09 11:12:39

为什么呢,没有问题什么,因为go语言最自恋最贱,据说那个日期是GO语言的诞生时间,一定要用这个日期格式化

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
go语言中json数据的读取和写出操作
Apr 28 Golang
golang 实现时间戳和时间的转化
May 07 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 #Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 #Golang
Go使用协程交替打印字符
Apr 29 #Golang
golang goroutine顺序输出方式
Apr 29 #Golang
golang 在windows中设置环境变量的操作
解决golang在import自己的包报错的问题
golang import自定义包方式
You might like
PHP树的代码,可以嵌套任意层
2006/10/09 PHP
PHP伪静态写法附代码
2008/06/20 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
ie focus bug 解决方法
2009/09/03 Javascript
JS 控制非法字符的输入代码
2009/12/04 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
Vite和Vue CLI的优劣
2021/01/30 Vue.js
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
详解Python字符串切片
2019/05/20 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
Python多进程编程常用方法解析
2020/03/26 Python
Python使用requests模块爬取百度翻译
2020/08/25 Python
python xlsxwriter模块的使用
2020/12/24 Python
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
材料物理专业个人求职信
2013/12/15 职场文书
无偿献血倡议书
2014/04/14 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
父亲节感言
2015/08/03 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python