解决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 Gin实现文件上传下载的示例代码
Apr 02 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
go语言中fallthrough的用法说明
May 06 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 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 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
基于python log取对数详解
2018/06/08 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
python二进制文件的转译详解
2019/07/03 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
python能开发游戏吗
2020/06/11 Python
运动会表扬稿大全
2014/01/16 职场文书
厨房管理计划书
2014/04/27 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript