掌握Go语言中的时间与日期操作

2024-09-07 20:52

本文主要是介绍掌握Go语言中的时间与日期操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Go语言中的时间与日期操作

在编写程序时,处理时间和日期看似是一项无关紧要的任务,但在需要同步多个任务或从文本文件中读取时间时,它的重要性便凸显出来。Go语言中的time包为我们提供了丰富的时间与日期操作功能。本文将详细介绍如何在Go语言中解析时间与日期字符串、在不同的格式之间进行转换,以及如何按照所需的格式输出时间和日期。

初识time包

在学习如何解析字符串并将其转换为时间或日期之前,我们先通过一个简单的程序usingTime.go来认识time包。程序的第一部分代码如下:

package main
import ("fmt""time"
)

接着是程序的第二部分:

func main() {fmt.Println("时间戳:", time.Now().Unix()) // 输出当前的Unix时间戳t := time.Now()fmt.Println(t, t.Format(time.RFC3339)) // 使用RFC3339格式化时间fmt.Println(t.Weekday(), t.Day(), t.Month(), t.Year()) // 输出当前的星期、日期、月份和年份time.Sleep(time.Second) // 暂停1秒t1 := time.Now()fmt.Println("时间差:", t1.Sub(t)) // 输出时间差
}

在这段代码中,time.Now().Unix()返回的是Unix时间戳,即从1970年1月1日00:00:00 UTC起到现在的秒数。Format()函数可以将时间变量转换为指定的格式。在这里,我们使用了RFC3339格式。time.Sleep()函数用于让程序暂停执行,这在模拟函数的延迟时很有用。最后,time.Sub()函数用于计算两个时间点之间的差值。

程序的最后一部分如下:

formatT := t.Format("01 January 2006") // 自定义格式化日期
fmt.Println(formatT)
loc, _ := time.LoadLocation("Europe/Paris") // 加载时区
parisTime := t.In(loc) // 转换为巴黎时间
fmt.Println("巴黎时间:", parisTime)

这段代码展示了如何自定义日期格式,并将时间转换为不同的时区。执行这个程序的输出如下:

$ go run usingTime.go
时间戳: 1548753515
2019-01-29 11:18:35.01478 +0200 EET m=+0.000339641
2019-01-29T11:18:35+02:00
星期二 29 一月 2019
时间差: 1.000374985秒
01 一月 2019
巴黎时间: 2019-01-29 10:18:35.01478 +0100 CET

时间解析与转换

当我们有一个字符串并希望将其解析为时间时,就可以使用time.Parse()函数。它接受两个参数,第一个参数是字符串的预期格式,第二个参数是实际需要解析的字符串。举个例子,下面是一个解析时间的程序parseTime.go

package main
import ("fmt""os""path/filepath""time"
)func main() {var myTime stringif len(os.Args) != 2 {fmt.Printf("用法: %s string\n", filepath.Base(os.Args[0]))os.Exit(1)}myTime = os.Args[1]d, err := time.Parse("15:04", myTime) // 解析时间字符串if err == nil {fmt.Println("完整时间:", d)fmt.Println("时间:", d.Hour(), d.Minute()) // 输出小时和分钟} else {fmt.Println(err)}
}

执行这个程序的输出如下:

$ go run parseTime.go 12:10
完整时间: 0000-01-01 12:10:00 +0000 UTC
时间: 12 10

如果使用错误的格式进行解析,Go将返回相应的错误信息。

日期解析

接下来,我们看一下如何解析日期字符串。我们将使用与时间解析类似的方法,不过格式不同。下面是解析日期的程序parseDate.go

package main
import ("fmt""os""path/filepath""time"
)func main() {var myDate stringif len(os.Args) != 2 {fmt.Printf("用法: %s string\n", filepath.Base(os.Args[0]))return}myDate = os.Args[1]d, err := time.Parse("02 January 2006", myDate) // 解析日期字符串if err == nil {fmt.Println("完整日期:", d)fmt.Println("日期:", d.Day(), d.Month(), d.Year()) // 输出天、月、年} else {fmt.Println(err)}
}

执行这个程序的输出如下:

$ go run parseDate.go "20 July 2000"
完整日期: 2000-07-20 00:00:00 +0000 UTC
日期: 20 七月 2000

时间与日期格式的转换

在某些情况下,我们可能需要将时间和日期字符串的格式进行转换。例如,下面的程序timeDate.go展示了如何处理日志文件中的时间和日期格式:

package main
import ("fmt""regexp""time"
)func main() {logs := []string{"127.0.0.1 - - [16/Nov/2017:10:49:46 +0200] 325504","[12/Nov/2017:16:27:21 +0300]","[12/Nov/2017:20:88:21 +0200]","[12/Nov/2017:20:21 +0200]",}for _, logEntry := range logs {r := regexp.MustCompile(`.*\[(\d\d\/\w+/\d\d\d\d:\d\d:\d\d:\d\d.*)\].*`)if r.MatchString(logEntry) {match := r.FindStringSubmatch(logEntry)dt, err := time.Parse("02/Jan/2006:15:04:05 -0700", match[1])if err == nil {newFormat := dt.Format(time.RFC850) // 转换为RFC850格式fmt.Println(newFormat)} else {fmt.Println("无效的日期时间格式!")}} else {fmt.Println("不匹配!")}}
}

程序输出如下:

$ go run timeDate.go
星期四, 16-十一月-17 10:49:46 EET
星期四, 16-十一月-17 10:16:41 EET
无效的日期时间格式!
不匹配!

测量执行时间

最后,我们来看一下如何测量Go程序中某些操作的执行时间。程序execTime.go展示了这一过程:

package main
import ("fmt""time"
)func main() {start := time.Now()time.Sleep(time.Second) // 暂停1秒duration := time.Since(start) // 计算执行时间fmt.Println("time.Sleep(1) 执行时间:", duration)start = time.Now()time.Sleep(2 * time.Second) // 暂停2秒duration = time.Since(start)fmt.Println("time.Sleep(2) 执行时间:", duration)start = time.Now()for i := 0; i < 200000000; i++ {} // 空循环duration = time.Since(start)fmt.Println("空循环执行时间:", duration)
}

输出结果如下:

$ go run execTime.go
time.Sleep(1) 执行时间: 1.000768881s
time.Sleep(2) 执行时间: 2.00062487s
空循环执行时间: 50.497931ms

总结

本文详细介绍了如何在Go语言中处理时间和日期,包括解析、格式转换以及测量执行时间等操作。通过灵活运用time包中的各种功能,开发者能够轻松处理各种时间与日期相关的任务,为应用程序提供更精确的时间管理。

这篇关于掌握Go语言中的时间与日期操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146133

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非