解决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如何去除多余空白字符(含制表符)
Apr 25 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
Golang 对es的操作实例
Apr 20 Golang
Go语言怎么使用变长参数函数
Jul 15 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
深入PHP nl2br()格式化输出的详解
2013/06/05 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
解析javascript 浏览器关闭事件
2013/07/08 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
用python读写excel的方法
2014/11/18 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
Python中optparser库用法实例详解
2018/01/26 Python
使用Python读取大文件的方法
2018/02/11 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
Python函数返回不定数量的值方法
2019/01/22 Python
pycharm新建一个python工程步骤
2019/07/16 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
Python中os模块功能与用法详解
2020/02/26 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
创联软件面试题笔试题
2012/10/07 面试题
个人贷款承诺书
2014/03/28 职场文书
公安学专业求职信
2014/07/27 职场文书
2014年安全员工作总结
2014/11/13 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS