解决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语言-在mac下brew升级golang
Apr 25 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
golang 实现时间戳和时间的转化
May 07 Golang
golang 实现并发求和
May 08 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang 入门 之url 包
May 04 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中删除变量时unset()和null的区别分析
2011/01/27 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
浅谈numpy生成数组的零值问题
2018/11/12 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
python使用hdfs3模块对hdfs进行操作详解
2020/06/06 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
服务中心夜班服务员岗位职责
2013/11/27 职场文书
路政管理专业个人自荐信范文
2013/11/30 职场文书
工厂保洁员岗位职责
2013/12/04 职场文书
园林资料员岗位职责
2013/12/30 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
python开发飞机大战游戏
2021/07/15 Python
Redis命令处理过程源码解析
2022/02/12 Redis