解决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语言带缓冲的通道实现
Apr 26 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
Golang二维数组的使用方式
May 28 Golang
golang内置函数len的小技巧
Jul 25 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
golang语言指针操作
Apr 14 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang 实现WebSockets
Apr 24 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 Golang
Go gorilla/sessions库安装使用
Aug 14 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-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
php截取字符串函数分享
2015/02/02 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
javascript代码加载优化方法
2011/01/30 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
Javascript中的 “&” 和 “|” 详解
2017/02/02 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
2019/08/04 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
2020/12/19 Vue.js
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
python实现二分查找算法
2020/09/18 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
市场开发与营销专业求职信
2013/12/31 职场文书
中学生校园广播稿
2014/01/16 职场文书
市场专员岗位职责
2014/02/14 职场文书
财务部绩效考核方案
2014/05/04 职场文书
外贸英文求职信范文
2015/03/19 职场文书
个人更名证明
2015/06/23 职场文书