GoLong的学习之路(十四)语法之标准库 time(时间包)的使用

文章目录

  • time包
    • 跨时区
    • 时间戳
    • 时间间隔
    • 时间操作
      • add
      • Sub
      • Equal
      • Before
      • After
    • 定时器
    • 时间格式化
    • 解析字符串格式的时间

time包

时间和日期是我们编程中经常会用到的,本文主要介绍了 Go 语言内置的 time 包的基本用法。

  • time 包提供了一些关于时间显示和测量用的函数。
  • time 包中日历的计算采用的是公历,不考虑润秒。

Go 语言中使用time.Time类型表示时间。我们可以通过time.Now函数获取当前的时间对象,然后从时间对象中可以获取到年、月、日、时、分、秒等信息。

// timeDemo 时间对象的年月日时分秒
func timeDemo() {now := time.Now() // 获取当前时间fmt.Printf("current time:%v\n", now)year := now.Year()     // 年month := now.Month()   // 月day := now.Day()       // 日hour := now.Hour()     // 小时minute := now.Minute() // 分钟second := now.Second() // 秒fmt.Println(year, month, day, hour, minute, second)
}

跨时区

Go 语言中使用 location 来映射具体的时区。时区(Time Zone)是根据世界各国家与地区不同的经度而划分的时间定义,全球共分为24个时区。

中国差不多跨5个时区(壮哉我中国,地大物博),为了时区的一致,在国内通常使用的是北京的时区。

下面的示例代码中使用beijing来表示东八区8小时的偏移量,其中time.FixedZone和time.LoadLocation这两个函数则是用来获取location信息。

// timezoneDemo 时区示例
func timezoneDemo() {// 中国没有夏令时,使用一个固定的8小时的UTC时差。// 对于很多其他国家需要考虑夏令时。secondsEastOfUTC := int((8 * time.Hour).Seconds())// FixedZone 返回始终使用给定区域名称和偏移量(UTC 以东秒)的 Location。beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)// 如果当前系统有时区数据库,则可以加载一个位置得到对应的时区// 例如,加载纽约所在的时区newYork, err := time.LoadLocation("America/New_York") // UTC-05:00if err != nil {fmt.Println("load America/New_York location failed", err)return}fmt.Println()// 加载上海所在的时区//shanghai, err := time.LoadLocation("Asia/Shanghai") // UTC+08:00// 加载东京所在的时区//tokyo, err := time.LoadLocation("Asia/Tokyo") // UTC+09:00// 创建时间对象需要指定位置。常用的位置是 time.Local(当地时间) 和 time.UTC(UTC时间)。//timeInLocal := time.Date(2023, 10, 27, 20, 0, 0, 0, time.Local)  // 系统本地时间timeInUTC := time.Date(2023, 10, 27, 12, 0, 0, 0, time.UTC)sameTimeInBeijing := time.Date(2023, 10, 27, 20, 0, 0,  beijing)sameTimeInNewYork := time.Date(2009, 1, 1, 7, 0, 0, 0, newYork)// 北京时间(东八区)比UTC早8小时,所以上面两个时间看似差了8小时,但表示的是同一个时间timesAreEqual := timeInUTC.Equal(sameTimeInBeijing)fmt.Println(timesAreEqual)// 纽约(西五区)比UTC晚5小时,所以上面两个时间看似差了5小时,但表示的是同一个时间timesAreEqual = timeInUTC.Equal(sameTimeInNewYork)fmt.Println(timesAreEqual)
}

注意
由于time.loadLocation 依赖系统的时区数据库,在不确定程序的运行环境的情况下建议先定义时区偏移量,然后使用time.FixedZone 的方式指定时区。

(这个我遇到过,你们敢信,在这个时代,我曾经遇到过一个xp系统的电脑。人还不会配置时间,系统时间就有问题。所以一定不能依赖系统的时区数据库)

时间戳

Unix Time是自1970年1月1日 00:00:00 UTC 至当前时间经过的总秒数。

// timestampDemo 时间戳
func timestampDemo() {now := time.Now()        // 获取当前时间timestamp := now.Unix()  // 秒级时间戳milli := now.UnixMilli() // 毫秒时间戳 Go1.17+micro := now.UnixMicro() // 微秒时间戳 Go1.17+nano := now.UnixNano()   // 纳秒时间戳fmt.Println(timestamp, milli, micro, nano)
}

time 包还提供了一系列将 int64 类型的时间戳转换为时间对象的方法。

这里注意还是得转换一下时区

secondsEastOfUTC := int((8 * time.Hour).Seconds())beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)// 北京时间 2022-02-22 22:22:22.000000022 +0800 CSTt := time.Date(2022, 02, 22, 22, 22, 22, 22, beijing)
var (sec  = t.Unix()msec = t.UnixMilli()usec = t.UnixMicro())// 将秒级时间戳转为时间对象(第二个参数为不足1秒的纳秒数)timeObj := time.Unix(sec, 22)fmt.Println(timeObj)           // 2022-02-22 22:22:22.000000022 +0800 CSTtimeObj = time.UnixMilli(msec) // 毫秒级时间戳转为时间对象fmt.Println(timeObj)           // 2022-02-22 22:22:22 +0800 CSTtimeObj = time.UnixMicro(usec) // 微秒级时间戳转为时间对象fmt.Println(timeObj)           // 2022-02-22 22:22:22 +0800 CST

时间间隔

time.Duration是time包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。

time.Duration表示一段时间间隔,可表示的最长时间段大约290年。

time.Duration表示1纳秒,time.Second表示1秒。

const (Nanosecond  Duration = 1Microsecond          = 1000 * NanosecondMillisecond          = 1000 * MicrosecondSecond               = 1000 * MillisecondMinute               = 60 * SecondHour                 = 60 * Minute
)

源码

在这里插入图片描述

时间操作

add

func (t Time) Add(d Duration) Time
func main() {now := time.Now()later := now.Add(time.Hour) // 当前时间加1小时后的时间fmt.Println(later)
}

Sub

func (t Time) Sub(u Time) Duration

返回一个时间段t-u。

如果结果超出了Duration可以表示的最大值最小值,将返回最大值最小值

要获取时间点t-d(d为Duration),可以使用t.Add(-d)。

Equal

func (t Time) Equal(u Time) bool

判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。

这个方法和用t==u不同,这种方法还会比较地点和时区信息。

Before

func (t Time) Before(u Time) bool

如果t代表的时间点在u之前,返回真;否则返回假。

After

func (t Time) After(u Time) bool

如果t代表的时间点在u之后,返回真;否则返回假。

定时器

使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个通道(channel)

func tickDemo() {ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器for i := range ticker {fmt.Println(i)//每秒都会执行的任务}
}

时间格式化

time.Format函数能够将一个时间对象格式化输出为指定布局的文本表示形式,需要注意的是 Go 语言中时间格式化的布局不是常见的Y-m-d H:M:S,而是使用2023-10-27 15:04:05.000

  • 如果想格式化为12小时格式,需在格式化布局中添加PM。
  • 小数部分想保留指定位数就写0,如果想省略末尾可能的0就写 9。
// formatDemo 时间格式化
func formatDemo() {now := time.Now()// 格式化的模板为 2006-01-02 15:04:05// 24小时制fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))// 12小时制fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))// 小数点后写0,因为有3个0所以格式化输出的结果也保留3位小数fmt.Println(now.Format("2006/01/02 15:04:05.000")) // 2022/02/27 00:10:42.960// 小数点后写9,会省略末尾可能出现的0fmt.Println(now.Format("2006/01/02 15:04:05.999")) // 2022/02/27 00:10:42.96// 只格式化时分秒部分fmt.Println(now.Format("15:04:05"))// 只格式化日期部分fmt.Println(now.Format("2006.01.02"))
}

在这里插入图片描述

解析字符串格式的时间

对于从文本的时间表示中解析出时间对象,time包中提供了time.Parse和time.ParseInLocation两个函数。

其中time.Parse在解析时不需要额外指定时区信息。

// parseDemo 指定时区解析时间
func parseDemo() {// 在没有时区指示符的情况下,time.Parse 返回UTC时间timeObj, err := time.Parse("2006/01/02 15:04:05", "2022/10/05 11:25:20")if err != nil {fmt.Println(err)return}fmt.Println(timeObj) // 2022-10-05 11:25:20 +0000 UTC// 在有时区指示符的情况下,time.Parse 返回对应时区的时间表示// RFC3339     = "2006-01-02T15:04:05Z07:00"timeObj, err = time.Parse(time.RFC3339, "2023-10-05T11:25:20+08:00")if err != nil {fmt.Println(err)return}fmt.Println(timeObj) // 2022-10-05 11:25:20 +0800 CST
}

在这里插入图片描述

time.ParseInLocation函数需要在解析时额外指定时区信息。

func parseDemo() {now := time.Now()fmt.Println(now)// 加载时区loc, err := time.LoadLocation("Asia/Shanghai")if err != nil {fmt.Println(err)return}// 按照指定时区和指定格式解析字符串时间timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2022/10/05 11:25:20", loc)if err != nil {fmt.Println(err)return}fmt.Println(timeObj)fmt.Println(timeObj.Sub(now))
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenText 安全取证软件——降低成本和风险的同时,简化电子取证流程

OpenText 安全取证软件,行业标准的数字调查解决方案,适用于各种规模和各种行业的组织 降低成本和复杂性 • 远程调查比轮流调查过程更有效 对结果持有信心 • 磁盘级可见性可以完成相关端点数据的搜索和收集 谨慎调查 • 完整的网络调查&#xf…

[动态规划] (一) LeetCode 1137.第N个泰波那契数

[动态规划] (一) LeetCode 1137.第N个泰波那契数 文章目录 [动态规划] (一) LeetCode 1137.第N个泰波那契数题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结空间优化代码实现 总结 1137. 第 N 个泰波那契数 题目解析 解题思路 状态表示 (1) 题目要…

2023.NET技术沙龙知识学习笔记

目录 一.Bootstrap Blazor UI组件库企业级应用介绍1.Blazor是什么2.为什么要用Blazor3.Bootstrap Blazor是什么 二.使用WebAssembly运行、扩展.NET应用程序1.WebAssembly简介2.WebAssembly的起源3.为什么选择二进制格式?4.WebAssembly与传统JavaScript的对比5.执行速…

数据结构之队列(源代码➕图解➕习题)

前言 在学过栈之后,会了解到栈的底层是根据顺序表或者链表来构建的,那么我们今天要学习的队列是否也是基于顺序表和链表呢?那我们直接进入正题吧! 1. 队列的概念(图解) 还是跟上节一样,依旧用图…

Linux中shell脚本练习

目录 1.猜数字 2.批量创建用户 3.监控网卡Receive Transmit 数据的变化 4.部署Linux 5.系统性能检测脚本 6.分区脚本 7.数据库脚本 1.猜数字 随机数的生成 使用环境变量RANDOM,范围是0~32767 编写guest.sh,实现以下功能&#xff1…

Servlet 与Spring对比!

前言: Spring相关的框架知识,算是目前公司在用的前沿知识了,很重要!! 那么以Spring为基础的框架有几个? 以Spring为基础的框架包括若干模块,其中主要的有Spring Framework、Spring Boot、Spring…

MAC安装stable diffusion

./webui.sh --precision full --no-half-vae --disable-nan-check --api Command: "/Users/xxxx/aigc/stable-diffusion-webui/venv/bin/python3" -m pip install torch2.0.1 torchvision0.15.2 Error code: 2 执行命令: pip install torch2.0.1 torchvi…

Linux之J2EE的项目部署及发布

目录 前言 一、会议OA单体项目windows系统部署 1.检验工作 1. 检验jar项目包是否可以运行 2. 验证数据库脚本是否有误 3. 测试项目功能 2. 部署工作 2.1 传输文件 2.2 解压项目及将项目配置到服务器中 2.3 配置数据库 2.4 在服务器bin文件下点击startup.bat启动项目 …

时序预测 | Python实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIMA-LSTM差…

docker应用部署---nginx部署的配置

1. 搜索nginx镜像 docker search nginx2. 拉取nginx镜像 docker pull nginx3. 创建容器,设置端口映射、目录映射 # 在/root目录下创建nginx目录用于存储nginx数据信息 mkdir ~/nginx cd ~/nginx mkdir conf cd conf# 在~/nginx/conf/下创建nginx.conf文件,粘贴下…

【转信创】银河麒麟:系统安全机制

银河麒麟执行脚本时一直显示权限不足,可能需要修改安全状态。 查看当前kysec的相关安全状态: getstatus 修改当前Kysec的相关安全状态: # 设置Kysec安全状态为软/强制模式; sudo setstatus softmode/normal # 关闭执行控制功能…

数据库简史:多主数据库架构的由来和华为参天引擎的机遇

注:本文发表后,收到了很多后台反馈,其中关于大型机的早期成就不容省略。微调重发本文,纯属个人观点,错谬之处,仍然期待指正。 2023年10月13日,在北京举办的“2023金融业数据库技术大会"上&…

linux-vsftp虚拟多用户

目录 1.安装vsftp 2.安装DB工具,能转化普通文件为vsftpd识别数据库加密文件 3.创建登录虚拟用户的名单 4.加密文件 6.需要修改vsftpd的配置文件 7.修改vsftp的配置文件,加载支持虚拟用户模式 8.针对不同用户开启不同权限 9.重启服务 10.测试 安…

【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一、Sort函数介绍1.Sort函数接口2.Sort…

buuctf_练[CISCN2019 华东南赛区]Web4

[CISCN2019 华东南赛区]Web4 文章目录 [CISCN2019 华东南赛区]Web4掌握知识解题思路代码分析正式解题 关键paylaod 掌握知识 ​ 根据url地址传参结构来判断php后端还是python后端;uuid.getnode()函数的了解,可以返回主机MAC地址十六进制;pyt…

替换所有的问号

这篇也是凑数的 哈哈.... 稍后会整合到算法通关第三关白银挑战 . 描述 : 给你一个仅包含小写英文字母和 ? 字符的字符串 s,请你将所有的 ? 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。 注意 : 不能 修改非 ? 字符 . 题目 : …

【Linux】第五站:Linux权限

文章目录 一、shell命令以及运行原理二、Linux下用户的分类1.root用户和普通用户的切换2.对一条指令的提权 三、什么叫做权限1.权限2.文件的属性3.文件类型4.权限属性 四、更改权限1. chmod 更改文件的属性2. chown 更改拥有者3. chgrp更改所属组4.chown一次性更改拥有者和所属…

我的创作纪念日 - 2048

机缘 昨天刚刚收到 C 站的 1024 勋章: 今天爬山途中就又收到了 CSDN 的创作 2048 天纪念推送: 虽然 1024、2048 这些数字对普通人来说可能没有意义,但对于程序员来说却有不一样的情结。感谢 C 站这波细心的操作,替程序员的我们记…

接口返回响应,统一封装(ResponseBodyAdvice + Result)(SpringBoot)

需求 接口的返回响应&#xff0c;封装成统一的数据格式&#xff0c;再返回给前端。 依赖 对于SpringBoot项目&#xff0c;接口层基于 SpringWeb&#xff0c;也就是 SpringMVC。 <dependency><groupId>org.springframework.boot</groupId><artifactId&g…

Camtasia mac版怎么加字幕 Camtasia mac版怎么打马赛克

在视频制作过程中&#xff0c;字幕和马赛克是两项非常常用的编辑功能&#xff0c;添加字幕可以提高观众的观看体验&#xff0c;添加马赛克可以保护视频创作者不想公开的画面内容。Camtasia作为一款知名的视频制作软件&#xff0c;在具备基本的录制和视频编辑功能的同时&#xf…