解决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 02 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
golang json数组拼接的实例
Apr 28 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
go xorm框架的使用
May 22 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
详解Go语言中Get/Post请求测试
Jun 01 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
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
php简单实现MVC
2015/02/05 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
jquery的index方法实现tab效果
2011/02/16 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
学习vue.js计算属性
2016/12/03 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
js仿360开机效果
2019/12/26 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
详解Python中的from..import绝对导入语句
2016/06/21 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
Python定时任务sched模块用法示例
2018/07/16 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
高中自我鉴定范文
2013/11/03 职场文书
现金出纳岗位职责
2014/03/15 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
小学语文课后反思精选
2014/04/25 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
Vue如何清空对象
2022/03/03 Vue.js
MySQL中order by的执行过程
2022/06/05 MySQL
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers