解决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 24 Golang
golang正则之命名分组方式
Apr 25 Golang
golang中的空slice案例
Apr 27 Golang
golang slice元素去重操作
Apr 30 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
golang为什么要统一错误处理
Apr 03 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang日志包的使用
Apr 20 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
在ubuntu下安装go开发环境的全过程
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
php数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
javascript document.compatMode兼容性
2010/02/23 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
EasyUI Combobox设置默认值 获取text的方法
2016/11/28 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
vue cli升级webapck4总结
2018/04/04 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
Vue Element校验validate的实例
2020/09/21 Javascript
python基础教程之对象和类的实际运用
2014/08/29 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
学生干部的自我评价分享
2014/01/18 职场文书
物理专业大学生职业生涯规划书
2014/02/07 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
材料员岗位职责
2015/02/10 职场文书
学生会个人总结范文
2015/02/15 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript
Python实现聚类K-means算法详解
2022/07/15 Python