我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go的dateparse处理时间

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go的dateparse处理时间

这篇文章主要讲解了“Go的dateparse处理时间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go的dateparse处理时间”吧!

目录
  • 简介

  • 快速使用

  • 格式

  • 时区

  • cli

  • 总结

简介

不管什么时候,处理时间总是让人头疼的一件事情。因为时间格式太多样化了,再加上时区,夏令时,闰秒这些细枝末节处理起来更是困难。所以在程序中,涉及时间的处理我们一般借助于标准库或第三方提供的时间库。今天要介绍的dateparse专注于一个很小的时间处理领域——解析日期时间格式的字符串。

快速使用

本文代码使用 Go Modules。

创建目录并初始化:

$ mkdir dateparse && cd dateparse$ go mod init github.com/darjun/go-daily-lib/dateparse

安装dateparse库:

$ go get -u github.com/araddon/dateparse

使用:

package mainimport (  "fmt"  "log"  "github.com/araddon/dateparse")func main() {  t1, err := dateparse.ParseAny("3/1/2014")  if err != nil {    log.Fatal(err)  }  fmt.Println(t1.Format("2006-01-02 15:04:05"))  t2, err := dateparse.ParseAny("mm/dd/yyyy")  if err != nil {    log.Fatal(err)  }  fmt.Println(t2.Format("2006-01-02 15:04:05"))}

ParseAny()方法接受一个日期时间字符串,解析该字符串,返回time.Time类型的值。如果传入的字符串dateparse库无法识别,则返回一个错误。上面程序运行输出:

$ go run main.go
2014-03-01 00:00:00
2021/06/24 14:52:39 Could not find format for "mm/dd/yyyy"
exit status 1

需要注意,当我们写出"3/1/2014"这个时间的时候,可以解释为2014年3月1日,也可以解释为2014年1月3日。这就存在二义性,dateparse默认采用mm/dd/yyyy这种格式,也就是2014年3月1日。我们也可以使用ParseStrict()函数让这种具有二义性的字符串解析失败:

func main() {  t, err := dateparse.ParseStrict("3/1/2014")  if err != nil {    log.Fatal(err)  }  fmt.Println(t.Format("2006-01-02 15:04:05"))}

运行:

$ go run main.go
2021/06/24 14:57:18 This date has ambiguous mm/dd vs dd/mm type format
exit status 1

格式

dateparse支持丰富的日期时间格式,基本囊括了所有常用的格式。它支持标准库time中预定义的所有格式:

// class="lazy" data-src/time/format.goconst (  ANSIC       = "Mon Jan _2 15:04:05 2006"  UnixDate    = "Mon Jan _2 15:04:05 MST 2006"  RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"  RFC822      = "02 Jan 06 15:04 MST"  RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone  RFC850      = "Monday, 02-Jan-06 15:04:05 MST"  RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"  RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone  RFC3339     = "2006-01-02T15:04:05Z07:00"  RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"  Kitchen     = "3:04PM"  // Handy time stamps.  Stamp      = "Jan _2 15:04:05"  StampMilli = "Jan _2 15:04:05.000"  StampMicro = "Jan _2 15:04:05.000000"  StampNano  = "Jan _2 15:04:05.000000000")

支持的完整格式查看dateparse README。

时区

dateparse支持在特定时区解析日期时间字符串。我们可以通过调用标准库的time.LoadLocation()方法,传入时区标识字符串来获得时区对象。时区标识字符串是类似Asia/Shanghai,America/Chicago这样的格式,它表示一个具体的时区,前者上海,后者洛杉矶。调用dateparse.ParseIn()方法传入时区对象,在指定时区中解析。time包中还预定义了两个时区对象,time.Local表示本地时区,time.UTC表示 UTC 时区。时区的权威数据请看IANA。

func main() {  tz1, _ := time.LoadLocation("America/Chicago")  t1, _ := dateparse.ParseIn("2021-06-24 15:50:30", tz1)  fmt.Println(t1.Local().Format("2006-01-02 15:04:05"))  t2, _ := dateparse.ParseIn("2021-06-24 15:50:30", time.Local)  fmt.Println(t2.Local().Format("2006-01-02 15:04:05"))}

运行:

$ go run main.go
2021-06-25 04:50:30
2021-06-24 15:50:30

美国洛杉矶时区的"2021年6月24日 15时30分30秒"等于本地时区(北京时间)的"2021年6月25日 04时50分30秒"。

cli

dateparse还提供了一个命令行工具,用于极快地查看日期时间格式。安装:

$ go install github.com/araddon/dateparse/dateparse

默认会安装在$GOPATH路径下,我习惯上把$GOPATH/bin放到$PATH中。所以dateparse命令可以直接使用。
dateparse命令接收一个字符串,和一个可选的时区选项:

$ dateparse --timezone="Asia/Shanghai" "2021-06-24 06:46:08"Your Current time.Local zone is CSTLayout String: dateparse.ParseFormat() => 2006-01-02 15:04:05Your Using time.Local set to location=Asia/Shanghai CST+-------------+---------------------------+-------------------------------+-------------------------------------+| method      | Zone Source               | Parsed                        | Parsed: t.In(time.UTC)              |+-------------+---------------------------+-------------------------------+-------------------------------------+| ParseAny    | time.Local = nil          | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC day=4 || ParseAny    | time.Local = timezone arg | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC day=4 || ParseAny    | time.Local = time.UTC     | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC day=4 || ParseIn     | time.Local = nil          | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       || ParseIn     | time.Local = timezone arg | 2021-06-24 06:46:08 +0800 CST | 2021-06-23 22:46:08 +0000 UTC       || ParseIn     | time.Local = time.UTC     | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       || ParseLocal  | time.Local = nil          | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       || ParseLocal  | time.Local = timezone arg | 2021-06-24 06:46:08 +0800 CST | 2021-06-23 22:46:08 +0000 UTC       || ParseLocal  | time.Local = time.UTC     | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       || ParseStrict | time.Local = nil          | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       || ParseStrict | time.Local = timezone arg | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       || ParseStrict | time.Local = time.UTC     | 2021-06-24 06:46:08 +0000 UTC | 2021-06-24 06:46:08 +0000 UTC       |+-------------+---------------------------+-------------------------------+-------------------------------------+

输出当前本地时区,格式字符串(可用于生成同样格式的日期时间字符串)和一个表格。表格里面的数据是分别对ParseAny/ParseIn/ParseLocal/ParseStrict在不同的时区下调用的结果。

method列表示调用的方法,Zone Source列表示将本地时区设置的值,Parsed列是以日期时间字符串调用ParseAny()返回的time.Time对象的Format()方法调用结果,Parsed: t.In(time.UTC)列在返回的time.Time对象调用Format()方法前将其转为 UTC 时间。

由于ParseAny/ParseStrict不会考虑本地时区,都是在 UTC 下解析字符串,所以这 6 行的最后两列结果都一样。

ParseIn的第二行,将time.Local设置为我们通过命令行选项设置的时区,上面我设置为Asia/Shanghai,对应的 UTC 时间相差 8 小时。ParseLocal也是如此。

下面是dateparse命令行的部分源码,可以对照查看:

func main() {  parsers := map[string]parser{    "ParseAny":    parseAny,    "ParseIn":     parseIn,    "ParseLocal":  parseLocal,    "ParseStrict": parseStrict,  }  for name, parser := range parsers {    time.Local = nil    table.AddRow(name, "time.Local = nil", parser(datestr, nil, false), parser(datestr, nil, true))    if timezone != "" {      time.Local = loc      table.AddRow(name, "time.Local = timezone arg", parser(datestr, loc, false), parser(datestr, loc, true))    }    time.Local = time.UTC    table.AddRow(name, "time.Local = time.UTC", parser(datestr, time.UTC, false), parser(datestr, time.UTC, true))  }}func parseIn(datestr string, loc *time.Location, utc bool) string {  t, err := dateparse.ParseIn(datestr, loc)  if err != nil {    return err.Error()  }  if utc {    return t.In(time.UTC).String()  }  return t.String()}

注意输出的本地时区为 CST,它可以代表不同的时区:

Central Standard Time (USA) UT-6:00
Central Standard Time (Australia) UT+9:30
China Standard Time UT+8:00
Cuba Standard Time UT-4:00

CST 可以同时表示美国、澳大利亚、中国和古巴四个国家的标准时间。

总结

使用dateparse可以很方便地从日期时间字符串中解析出时间对象和格式(layout)。同时dateparse命令行可以快速的查看和转换相应时区的时间,是一个非常不错的小工具。

感谢各位的阅读,以上就是“Go的dateparse处理时间”的内容了,经过本文的学习后,相信大家对Go的dateparse处理时间这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go的dateparse处理时间

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go的dateparse处理时间

这篇文章主要讲解了“Go的dateparse处理时间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go的dateparse处理时间”吧!目录简介快速使用格式时区cli总结简介不管什么时候,处
2023-06-20

详解Go中处理时间数据的方法

在许多场合,你将不得不编写必须处理时间的代码。在Go中处理时间数据需要你从Go标准库中导入 time 包。这个包有很多方法和类型供你使用,但我选取了最常用的方法和类型,并在这篇文章中进行了描述,感兴趣的可以了解一下
2023-05-16

Python时间处理

Python时间处理# _*_ coding: utf-8 _*_import timeimport calendarimport datetime# time模块中的三种时间形式print("time stamp:", time.time
2023-01-31

Go语言时间处理必备技巧全解析

Golang的时间处理是Golang编程中的一个重要方面,它涉及到了时间类型、时间格式化、时间计算、时区处理以及定时器和超时机制等多个方面。在本文中,我们将从更深入的角度来探讨Golang的时间处理
2023-05-18

Python time库的时间时钟处理

前言 time库运行访问多种类型的时钟,这些时钟用于不同的场景。本篇,将详细讲解time库的应用知识。 获取各种时钟 既然time库提供了多种类型的时钟。下面我们直接来获取这些时钟,对比其具体的用途。具体代码如下:import timepr
2022-06-02

python处理时间加减

最近用python做pv和uv数据统计分析时,原始日志文件中用户访问的时间不对,需要往后延8小时,记录一下:>>> import datetime>>> pageTime = '2014-05-11 16:44:12'>>> pageTim
2023-01-31

Python 日期时间处理

开发过程中最常用的时间处理就是获取时间戳,获取当前日期,或者时间戳,日期互转,做个总结,免得总找不着。1、获取当前timestamp>>> from time import time>>> time()1423023221.5851322、
2023-01-31

python时间处理之date

#!/usr/bin/python# -*- coding:utf-8 -*-"""date的用法 (test_datetime.py)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~C
2023-01-31

Java8中的时区日期时间怎么处理

今天小编给大家分享一下Java8中的时区日期时间怎么处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。我同时也发现,这三个类
2023-07-05

Mysql——sql语句--处理时间

默认单位:秒 时间---字符串 select date_format(now(), "%Y-%m-%d %H:%i:%s");-- 结果:2018-05-02 20:24:10 时间---时间戳 select unix_timestamp(now());--
Mysql——sql语句--处理时间
2014-10-12

实时数据处理:利用Go WaitGroup处理数据流

在Go语言中,可以使用`sync.WaitGroup`来处理实时数据流。`sync.WaitGroup`是一个计数信号量,用来等待一组goroutine的结束。它的主要方法有三个:`Add()`、`Done()`和`Wait()`。首先,需
2023-10-08

Pandas中时间序列的处理大全

目录一、时间序列数据的生成二、Pandas设置索引三、 时间序列数据的截取四、Pandas重复值处理4.1 查询是否有重复值4.2 去除重复值五、Pandas缺失值处理5.1 缺失值查询六、pandas统计计算方法七、Pandas数据重采样
2022-06-02

如何搞懂Java8中的时间处理

今天就跟大家聊聊有关如何搞懂Java8中的时间处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言java8借鉴了第三方日期库joda很多的优点java.time包类名描述Inst
2023-06-26

Python中的日期时间处理详解

Python中关于时间、日期的处理库有三个:time、datetime和Calendar,其中datetime又有datetime.date、datetime.time、datetime.datetime三个类。而时间又可以分为时间戳、本地
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录