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.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 mainimport ("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 := 2023month := time.Marchday := 17hour := 0minute := 0second := 0nano := 0loc := &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 mainimport ("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.Hourt = 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库,包括时间、日期和时区等相关概念及使用方法。通过掌握这些知识,可以更好地处理时间、日期和时区相关的问题,提高开发效率。
相关文章:

Go语言time库,时间和日期相关的操作方法
time库 用于处理时间、日期和时区的核心库。在实际开发中,常常需要与时间打交道,例如记录日志、处理时间差、计算时间间隔等等。因此,掌握time库的使用方法对于Go开发者来说非常重要。 在Go语言中,时间表示为time.Time类型&…...

JVM总结笔记
JVM JVM是什么?JVM 的主要组成部分JVM工作流程JVM内存模型直接内存与堆内存的区别:堆栈的区别Java会存在内存泄漏吗?简述Java垃圾回收机制垃圾收集算法轻GC(Minor GC)和重GC(Full GC)新生代gc流程JVM优化与JVM调优 JVM是什么? JVM是Java Virtual Mach…...
C++ 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴]
C 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴] 使用map默认会根据key排序的原理作缓存,队列满了依次推出,抛弃掉过时的数据 #include <functional> #include <iostream> #include <map> #…...
华为数通HCIA-地址分类及子网划分
ip地址(逻辑地址) 作用:唯一标识一张网卡 特点:设备天生没有,需要人为配置,可以随时修改 格式:点分十进制 大小:32bit 组成:网络位主机位 网络位:用于标…...

Linux第七章之gdb与makefile使用
一、Linux调试器-gdb使用 1.1背景 程序的发布方式有两种,debug模式和release模式Linux gcc/g出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g 选项[重要] 1.2开始使用 …...

Mycat-Balance使用指南
MyCAT Balance是一个Java NIO的高性能负载均衡器,可以替代普通的硬件的交换机或其LVS类似的复杂机制,实现MyCAT集群的负载均衡。 MyCAT Balance的配置文件在conf目录下,frontend-conf.为前端配置,包括绑定的端口等,js…...

玩转顺序表——【数据结构】
在C语言学习中,我们经常会遇见增删查改等一系列操作,而这些操作全都与线性表关联,没有线性表将会对这些操作完成的十分艰难!那今天就让我们来了解一下顺序表如何增删查改!!! 目录 1.线性表 2…...
SSE(Server-Sent Events,服务器推送事件)和sockets(套接字)通信区别
SSE(Server-Sent Events,服务器推送事件)和sockets(套接字)都是用于实现实时通信的技术,但它们具有不同的特点和应用场景。 SSE 的优点: 简单易用:SSE 是基于HTTP协议的一种实时通…...

【设计模式——学习笔记】23种设计模式——代理模式Proxy(原理讲解+应用场景介绍+案例介绍+Java代码实现)
介绍 基础介绍 代理模式为一个对象提供一个代理对象,以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是:可以在不修改目标对象代码的基础上,增强额外的功能操作,即扩展目标对象的功能被代理的对象…...

大学英语四新视野 课后习题+答案翻译 Unit1~Unit8
Unit 1 Text A: Words in use 2022年6月16日 20:57 1 As the gender barriers crumbled, the number of women working as lawyers, doctors, or bankers began to increase significantly from the mid-20th century. 随着性别障碍的消除,从20世纪中期开始&am…...

Java入门指南:Java语言优势及其特点
目录 1. Java语言简介及发展概述 2. Java语言的优势 2.1 可移植性 2.2 面向对象 2.3 安全性 2.4 大量类库 3. Java语言与C/C的区别 4. 初识Java程序入口之main方法 5. 注释、标识符、关键字 5.1 注释 5.2 标识符 5.3 关键字 1. Java语言简介及发展概述 Java是一种面…...

Jenkins 节点该如何管理?
Jenkins 拥有分布式构建(在 Jenkins 的配置中叫做节点),分布式构建能够让同一套代码在不同的环境(如:Windows 和 Linux 系统)中编译、测试等 Jenkins 的任务可以分布在不同的节点上运行 节点上需要配置 Java 运行时环境,JDK 版本大于 1.5 节…...

hugging face下载数据集
开始直接执行这个,下载下来的图片打不开 git clone https://huggingface.co/datasets/diffusers/dog-example 解决办法: 安装git lfs 1. curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash 2. sudo apt…...
解决Django报错 : No module named ‘MySQLdb‘
Django的版本是2.0,Python的版本号是3.6.4 在models.py创建好了模型类之后使用命令:python manage.py makemigrations 进行迁移,但是突然报错:ImportError:No module named MySQLdb 查询了相关资料发现python2.x版本是支持mysql…...

【Docker】Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作原理详细讲解
前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 作者简介: 辭七七…...

【论文笔记】RCM-Fusion: Radar-Camera Multi-Level Fusion for 3D Object Detection
原文链接:https://arxiv.org/abs/2307.10249 1. 引言 目前的一些雷达-相机融合3D目标检测方法进行实例级的融合,从相机图像生成3D提案,并与雷达点云相关联以修正提案。但这种方法没有在最初阶段使用雷达,依赖于相机3D检测器&…...
STM32-风速传感器(ADC)
目录 0 说明 1 传感器介绍 2 代码说明 2.1 ADC.c 2.2 adc.h 2.3 main.c 0 说明 本篇文章主要是说明怎么使用STM32单片机读取风速传感器采集到的数据,读取方式是ADC,并且附带着STM32所需要的全部代码,所使用的风速传感器如下图所示。 附&am…...
【conda】配置国内镜像源
【conda】配置国内镜像源 1、官方2、国内常用镜像3、配置查看当前conda配置设置搜索是显示通道地址 4、清除缓存5、恢复默认全部删除指定删除 1、官方 https://docs.conda.io/projects/conda/en/latest/configuration.html 2、国内常用镜像 https://developer.aliyun.com/mi…...

python森林生物量(蓄积量)数据处理到随机森林估算全流程
python森林生物量(蓄积量)估算全流程 一.哨兵2号获取/处理/提取数据1.1 影像处理与下载采用云概率影像去云采用6S模型对1C级产品进行大气校正geemap下载数据到本地NDVI 1.2 各种参数计算(生物物理变量、植被指数等)LAI:…...

使用Freemarker模版导出xls文件使用excel打开提示文件损坏
本文是通过一步步的还原事件的发生并解决的一个过程记录,如果想知道如何解决的可以直接跳转文章末尾结论部分 提示一下,关注一下 Table 标签中的 ss:ExpandedRowCount 属性 解决的问题 在项目中使用freemarker的xml模板导出xls格式的Excel文件时…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...