解决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中semaphore(信号量)源码
Apr 03 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang bufio详细讲解
Apr 21 Golang
基于Python实现西西成语接龙小助手
Aug 05 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
一个简单计数器的源代码
2006/10/09 PHP
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
Easyui在treegrid添加控件的实现方法
2017/06/23 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
python函数局部变量用法实例分析
2015/08/04 Python
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
python绘制简单彩虹图
2018/11/19 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
python+flask实现API的方法
2018/11/21 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
python识别验证码的思路及解决方案
2020/09/13 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
HTML5中使用postMessage实现两个网页间传递数据
2016/06/22 HTML / CSS
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
美国玩具公司:U.S.Toy
2018/05/19 全球购物
团组织关系介绍信
2014/01/12 职场文书
优质服务活动实施方案
2014/05/02 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
工作表扬信
2015/01/17 职场文书
应急管理工作总结2015
2015/05/04 职场文书
公开致歉信
2019/06/24 职场文书
导游词之无锡梅园
2019/11/28 职场文书
详解php中流行的rpc框架
2021/05/29 PHP