解决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 相关文章推荐
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
golang slice元素去重操作
Apr 30 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
go设置多个GOPATH的方式
May 05 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
golang中的并发和并行
May 08 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Golang 链表的学习和使用
Apr 19 Golang
Go语言入门exec的基本使用
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 mysql数据库操作分页类
2008/06/04 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
php实现单链表的实例代码
2013/03/22 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
浅谈React高阶组件
2018/03/28 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
2020/11/12 Javascript
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
python复制与引用用法分析
2015/04/08 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
python得到windows自启动列表的方法
2018/10/14 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
美国滑板店:Tactics
2020/11/08 全球购物
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
创业女性典型材料
2014/05/02 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书