Go语言time库,时间和日期相关的操作方法

简介: Go语言time库,时间和日期相关的操作方法

time库

用于处理时间、日期和时区的核心库。在实际开发中,常常需要与时间打交道,例如记录日志、处理时间差、计算时间间隔等等。因此,掌握time库的使用方法对于Go开发者来说非常重要。

在Go语言中,时间表示为time.Time类型,日期表示为time.Time类型或者time.Date类型,时区表示为time.Location类型。下面将详细介绍这些类型的概念及使用方法。

时间

在Go语言中,时间表示为time.Time类型。time.Time类型是一个结构体,包含两个字段:一个具有 century 和 second 等字段的大整数和一个小整数,分别表示时间的年份和时间的小数部分。

可以使用time包中的函数来获取当前时间、指定时间或者进行时间的加减操作。下面是一些常用的时间操作函数:

time.Now():返回当前本地时间

time.Parse(layout, str):将字符串str解析为指定格式layout的时间

time.Add(d time.Duration):返回当前时间加上给定时间间隔d的结果

time.Sub(t, u time.Time):返回时间t减去时间u的时间间隔

日期

日期表示为time.Time类型或者time.Date类型。其中,time.Time类型表示完整的的时间,包括时分秒等信息;而time.Date类型则只表示日期部分,不包含时间部分。

可以使用time包中的函数来获取指定日期的月份和日数,或者进行日期的加减操作。下面是一些常用的日期操作函数:

time.Month(month int):返回指定的月份的字符串表示

time.Day():返回当前日期中的天数

time.AddDate(year int, month int, day int):返回指定年月日加上给定时间间隔的结果

time.Sub(t, u time.Time):返回时间t减去时间u的时间间隔

时区

时区表示为time.Location类型。time.Location类型是一个结构体,包含一个字符串表示时区的标识符和一些字段,例如seconds 和 bias 等。

可以使用time包中的函数来获取指定时区的偏移量或者进行时区的转换。下面是一些常用的时区操作函数:

time.Local:表示本地时区

time.UTC:表示UTC时区

time.LoadLocation(name string):返回指定时区名称的time.Location类型对象

time.In(loc time.Location, t time.Time):返回指定时区的时间t转换为目标时区loc的结果

函数

time.Now(): 返回当前本地时间。

time.Parse(layout, str): 将字符串 str 解析为指定格式 layout 的时间。

time.Add(d time.Duration): 返回当前时间加上给定时间间隔 d 的结果。

time.Sub(t, u time.Time): 返回时间 t 减去时间 u 的时间间隔。

time.Sub(t, u time.Time) time.Duration: 返回时间 t 减去时间 u 的时间间隔。

time.AddDate(years int, months int, days int) time.Time: 根据年、月、日的增量添加时间。

time.Since(t time.Time) time.Duration: 返回从 t 到现在的时间间隔。

time.Until(u time.Time) time.Duration: 返回从现在到 u 的时间间隔。

t.After(u):如果 t 在 u 之后,返回 true,否则返回 false。

t.Before(u):如果 t 在 u 之前,返回 true,否则返回 false。

time.Unix(sec int64, nanosec int64) time.Time: 将Unix时间戳转换为时间对象。

time.ParseUnix(str string, layout string) (sec int64, nanosec int64,err error): 将时间字符串按照指定格式解析为Unix时间戳。

time.Set(sec int64, n int) time.Time: 将当前时间设置为给定的秒数和纳秒数。

time.Sleep(d Duration): 以让程序在执行过程中暂停一段时间。

time.Hour() int: 返回当前小时的整数值。

time.Minute() int: 返回当前分钟的整数值。

time.Second() int: 返回当前秒的整数值。

time.Nanosecond() int: 返回当前纳秒的整数值。

time.Weekday() time.Weekday: 返回当前星期几的枚举值。

time.Day(): 返回当前日期的日数。

time.Month() time.Month: 返回当前月份的枚举值。

time.Year() int: 返回当前年份的整数值。

time.Date(year int, month time.Month, day, hour, min, sec, nanosec int, loc *time.Location) time.Time: 返回指定时间的本地时间对象。

time.isleap(year int) bool: 判断给定的年份是否为闰年。

time.UnixNano() int64: 返回当前时间的纳秒值。

time.Duration() time.Duration: 返回从0时0分0秒到现在的纳秒数。

time.ParseDuration(str string) (time.Duration, error): 将时间间隔字符串解析为时间间隔。

time.ParseInLocation(layout string, value string, loc *time.Location) (time.Time, error): 根据格式和时间值,解析时间,并指定时区。

time.Sunday: 返回星期几的枚举值,0为星期日,6为星期六,以此类推。

time.ParseDuration(str string) (time.Duration, error): 将时间间隔字符串解析为时间间隔。

time.Hour() time.Duration: 返回当前小时的时间间隔。

time.Minute() time.Duration: 返回当前分钟的时间间隔。

time.Second() time.Duration: 返回当前秒的时间间隔。

time.Nano() time.Duration: 返回当前纳秒的时间间隔。

time.ANSIC() string: 返回对应于 ANSI C 的字符串表示的日期时间。

time.FixedZone(name string, offset int) *time.Location: 返回一个固定时区对象。

time.LoadLocation(name string) (*time.Location, error): 加载一个时区对象。

time.In(t time.Time, loc *time.Location) time.Time: 将时间 t 转换为指定时区的时间。

类型

Time:表示时间点,包括日期和时间。

Date:表示日期,包括年、月、日。

LocalTime:表示本地时间。

Location:表示时区。

ZeroTime:表示时间的零点,即 1970 年 1 月 1 日 00:00:00 UTC。

Duration:它表示时间段,可以用纳秒、微秒、毫秒、秒等为单位。

示例

代码1

package main
import (
  "fmt"
  "time"
)
func main() {
  // 获取当前时间
  currentTime := time.Now()
  fmt.Println("Current Time:", currentTime)
  // 暂停程序执行 5 秒钟
  fmt.Print("Waiting for 5 seconds: ")
  for i := 0; i < 5; i += 1 {
    time.Sleep(time.Second)
    fmt.Print(".")
  }
  fmt.Println()
  // 获取指定日期的本地时间
  year := 2023
  month := time.March
  day := 17
  hour := 0
  minute := 0
  second := 0
  nano := 0
  loc := &time.Location{}
  date := time.Date(year, month, day, hour, minute, second, nano, loc)
  fmt.Println("Date:", date)
  // 将时间字符串转换为时间对象
  layout := "2006-01-02 15:04:05"
  value := "2023-03-23 08:30:00"
  parsedTime, err := time.Parse(layout, value)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println("Parsed Time:", parsedTime)
  // 格式化时间对象为字符串
  format := "2006-01-02 15:04:05 MST"
  formattedTime := parsedTime.Format(format)
  fmt.Println("Formatted Time:", formattedTime)
  // 计算两个时间之间的时间差
  t2 := time.Now()
  diff := t2.Sub(parsedTime)
  fmt.Println("Time Difference:", diff)
  // 将时间对象转换为UTC时区
  utcTime := parsedTime.UTC()
  fmt.Println("UTC Time:", utcTime)
  // 将时间对象转换为本地时区
  localTime := parsedTime.In(time.Local)
  fmt.Println("Local Time:", localTime)
}

输出:

Current Time: 2023-08-01 20:15:11.0034059 +0800 CST

Waiting for 5 seconds: .....

Date: 2023-03-17 00:00:00 +0000 UTC

Parsed Time: 2023-03-23 08:30:00 +0000 UTC

Formatted Time: 2023-03-23 08:30:00 UTC

Time Difference: 3147h45m16.0065551s

UTC Time: 2023-03-23 08:30:00 +0000 UTC

Local Time: 2023-03-23 16:30:00 +0800 CST

代码2

package main
import (
  "fmt"
  "time"
)
func main() {
  // 解析时间字符串为时间对象
  layout := "2006-01-02 15:04:05"
  strTime := "2023-03-23 12:30:00"
  t, err := time.Parse(layout, strTime)
  if err != nil {
    fmt.Println("时间解析错误:", err)
  }
  fmt.Println("解析后的时间:", t)
  // 时间加减
  d := time.Duration(24) * time.Hour
  t = t.Add(d)
  fmt.Println("加上一天的时间:", t)
  u := t.Add(-d)
  fmt.Println("减去一天的时间:", u)
  // 时间间隔
  diff := t.Sub(u)
  fmt.Println("加上一天和减去一天的时间间隔:", diff)
  // 时间格式化输出
  layout = "2006-01-02"
  t = time.Now()
  formattedTime := t.Format(layout)
  fmt.Println("格式化后的时间:", formattedTime)
  // 时间转换为Unix时间戳
  unixTime := t.Unix()
  fmt.Println("Unix时间戳:", unixTime)
  // 时间比较
  t1 := time.Now()
  t2 := t1.Add(time.Hour)
  diff = t2.Sub(t1)
  fmt.Println("t2 - t1 =", diff)
  fmt.Println("t1 < t2:", t1.Before(t2))
  fmt.Println("t2 > t1:", t2.After(t1))
}

输出:

解析后的时间: 2023-03-23 12:30:00 +0000 UTC

加上一天的时间: 2023-03-24 12:30:00 +0000 UTC

减去一天的时间: 2023-03-23 12:30:00 +0000 UTC

加上一天和减去一天的时间间隔: 24h0m0s

格式化后的时间: 2023-08-01

Unix时间戳: 1690892235

t2 - t1 = 1h0m0s

t1 < t2: true

t2 > t1: true


总结

本文介绍了Go语言中的time库,包括时间、日期和时区等相关概念及使用方法。通过掌握这些知识,可以更好地处理时间、日期和时区相关的问题,提高开发效率。


目录
相关文章
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
1936 103
|
Rust 安全 算法
Go标准库的新 math/rand
Go标准库的新 math/rand
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
Go 开发者
go-carbon v2.6.0 重大版本更新,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持
297 3
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
293 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
648 5
|
网络协议 Linux Go
用 Go 基于 epoll 实现一个最小化的IO库
Go 语言社区中存在多个异步网络框架,如 evio、nbio、gnet 和 netpoll 等。这些框架旨在解决标准库 netpoll 的低效问题,如一个连接占用一个 goroutine 导致的资源浪费。easyio 是一个最小化的 IO 框架,核心代码不超过 500 行,仅实现 Linux 下的 epoll 和 TCP 协议。它通过 Worker Pool、Buffer 等优化提高了性能,并提供了简单的事件处理机制。
236 0
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
347 4
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
502 6
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
265 3