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

news2025/1/18 11:58:49

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.StartOfDay(): 返回当前日期的开始时间。
time.EndOfDay(): 返回当前日期的结束时间。
time.StartOfWeek(): 返回当前日期所在周的周一。
time.EndOfWeek(): 返回当前日期所在周的周日。
time.StartOfMonth(): 返回当前月份的开始时间。
time.EndOfMonth(): 返回当前月份的结束时间。
time.StartOfYear(): 返回当前年份的开始时间。
time.EndOfYear(): 返回当前年份的结束时间。
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库,包括时间、日期和时区等相关概念及使用方法。通过掌握这些知识,可以更好地处理时间、日期和时区相关的问题,提高开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式开发的学习内容和技能包括:

. 熟悉C语言编程 掌握基础电子知识&#xff0c;如数字电路、模拟电路和单片机 .熟练掌握嵌入式操作系统的原理、内核架构和应用&#xff0c;如Linux、RTOS等 了解各种外设接口及其驱动程序开发&#xff0c;如SPI、I2C、USART等 熟悉常用的嵌入式开发工具和软件工程流程&#…

【ASPICE】:学习记录

学习记录 ASPICE中文资料什么是ASPICE过程参考模型 ASPICE全称“Automotive Software Process Improvement and Capability dEtermination”&#xff0c;即“汽车软件过程改进及能力评定”模型框架 ASPICE中文资料 主要资料来源 什么是ASPICE 过程参考模型

神经网络原理概述

文章目录 1.神经元和感知器1.1.什么是感知器1.2.什么是单层感知器1.3.多层感知机&#xff08;Multi-Layer Perceptron&#xff0c;MLP&#xff09; 2.激活函数2.1.单位阶跃函数2.2.sigmoid函数2.3.ReLU函数2.4.输出层激活函数 3.损失函数4.梯度下降和学习率5.过拟合和Dropout6.…

python学到什么程度算入门,python从入门到精通好吗

本篇文章给大家谈谈python学到什么程度算入门&#xff0c;以及python从入门到精通好吗&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 学习 Python 之 进阶学习 一切皆对象 1. 变量和函数皆对象2. 模块和类皆对象3. 对象的基本操作 (1). 可以赋值给变量(2). …

JAVA- SQL注入案例(黑马程序员)和避免 超级详细

文章目录 sql注入准备1.创建应该新的数据库用于测试&#xff1b;2.修改配置3.启动jar包4.打开网页测试5.测试sql注入 sql注入避免1. java中的登录逻辑代码2.演示sql注入3.原因5.参数化查询-PreparedStatement SQL注入是什么&#xff1f; SQL 注入&#xff08;SQL Injection&…

【Python】Web学习笔记_flask(2)——getpost

flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 from flask import Flask,url_for,redirect,requestappFlask(__name__)app.route(/) def index():namerequest.args.get(name)agerequest.args.get(age)messagef姓名:{nam…

【LeetCode 75】第十七题(1493)删掉一个元素以后全为1的最长子数组

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给一个数组&#xff0c;求删除一个元素以后能得到的连续的最长的全是1的子数组。 我们可以先单独统计出连续为1的子数组分别长度…

命令模式-请求发送者与接收者解耦

去小餐馆吃饭的时候&#xff0c;顾客直接跟厨师说想要吃什么菜&#xff0c;然后厨师再开始炒菜。去大点的餐馆吃饭时&#xff0c;我们是跟服务员说想吃什么菜&#xff0c;然后服务员把这信息传到厨房&#xff0c;厨师根据这些订单信息炒菜。为什么大餐馆不省去这个步骤&#xf…

【JVM】(一)深入理解JVM运行时数据区

文章目录 一、JVM 运行流程二、虚拟机栈&#xff08;线程私有&#xff09;三、本地方法栈 &#xff08;线程私有&#xff09;四、方法区&#xff08;元数据区&#xff09;五、堆&#xff08;线程共享&#xff09;六、程序计数器&#xff08;线程私有&#xff09; 一、JVM 运行流…

安装Apache遇到的问题

安装Apache服务 httpd -k install -n Apache2.4 #-n后面表示自定义访问名称 问题1&#xff1a; 此时去 windows 的开始摁扭里找到控制器右键管理员运行 问题2&#xff1a; 命令行没用对 应该用&#xff1a; .\httpd -k install -n Apache2.4 #-n后面表示自定义访问名称

远程控制平台四之优化部署

服务器端打包 把服务器打成jar包对于后台开发的朋友来说小菜一碟,但对于前端开发可能有些细节要注意一下,尤其是有依赖其他第三方库的情况下,这里梳理了一下流程: File – Project Structure – Artifacts – add – JAR – From modules and dependencies 选中module和主…

前端构建(打包)工具发展史

大多同学的前端学习路线&#xff1a;三件套框架慢慢延伸到其他&#xff0c;在这个过程中&#xff0c;有一个词出现的频率很高&#xff1a;webpack 。 作为一个很出名的前端构建工具我们在网上随便一搜&#xff0c;就会有各种教程&#xff1a;loader plugin entry吧啦吧啦。 但…

嵌入式Linux的学习嵌入式一开始该怎么学?

把握以下几点&#xff1a; 文件 进程&#xff0c;线程&#xff0c;信号 进程&#xff0c;线程通信同步 网络&#xff1a;这个简单&#xff0c;就那几个API&#xff0c;TCP和udp。 嵌入式Linux 目前我正在学&#xff0c;我看到资料是正点原子&#xff0c;野火和韦东山作为参…

在中国人民大学与加拿大女王大学金融硕士项目中蜕变,成长

毕业十年后&#xff0c;还想得起大学时你的样子吗&#xff1f;有人这十年浑浑噩噩&#xff0c;或过着按部就班的日子&#xff0c;渐渐认命了&#xff1b;也有人用这十年实现了底层逆袭&#xff0c;完成了华丽的人生转身。如中国人民大学与加拿大女王大学金融硕士项目&#xff0…

栈的压入,弹出序列

栈的压入弹出序列问题可以通过模拟栈的压入和弹出过程来解决。 具体思路如下&#xff1a; 定义一个辅助栈&#xff0c;用于模拟压栈和弹栈操作。遍历给定的压栈序列&#xff0c;在每一次循环中执行以下操作&#xff1a; 将当前元素压入辅助栈。循环检查辅助栈的栈顶元素是否与…

SQL-每日一题【1158. 市场分析 I】

题目 Table: Users Table: Orders Table: Items 请写出一条SQL语句以查询每个用户的注册日期和在 2019 年作为买家的订单总数。 以 任意顺序 返回结果表。 查询结果格式如下。 示例 1: 解题思路 1.题目要求我们查询每个用户的注册日期和在 2019 年作为买家的订单总数。我们可…

天工开物 #7 Rust 与 Java 程序的异步接口互操作

许多语言的高性能程序库都是建立在 C/C 的核心实现上的。 例如&#xff0c;著名 Python 科学计算库 Pandas 和 Numpy 的核心是 C 实现的&#xff0c;RocksDB 的 Java 接口是对底层 C 接口的封装。 Rust 语言的基本目标之一就是替代 C 在这些领域的位置&#xff0c;为开发者提供…

Python+PyQt5来模拟实现多人聊天

一、界面功能展示 1、设置一个通信 用户1 2、设置通信 用户2 3、进入聊天功能界面 4、发送信息来实现实时通信 二、代码实现 &#xff08;要源码请留言&#xff09;

Spring框架中的@Configuration参数proxyBeanMethods

一.概念分析 在Spring框架中&#xff0c;Configuration注解用于声明一个Java类作为配置类&#xff0c;它替代了传统的XML配置方式。通过Configuration注解标记的类可以包含Bean注解&#xff0c;用于定义Spring容器中的Bean对象。而在Configuration注解中&#xff0c;有一个非常…

HarmonyOS 开发基础(三)登录页面单向数据绑定(父组件向子组件传参)

一、目录结构认识 开发软件目录截图部分文件夹说明 文件组织结构图 二、完成单向数据绑定 index.etx // 导出方式直接从文件夹 import MyInput from "../common/commons/myInput" Entry Component /* 组件可以基于struct实现&#xff0c;组件不能有继承关系&am…