当前位置: 首页 > news >正文

在Go中处理时间数据

获取时间

这可能是软件包中最常用的方法。我们如何知道当前的时间呢?像这样:

t := time.Now()
fmt.Println(t)ini复制代码2023-04-16 23:54:45.924965 +0800 CST m=+0.000152293

这就是当前的时间。这是很麻烦的,所以我将把它分解成几个部分。

2023-02-06:年月日。
23:01:48.9983151:时、分、秒
0800:与 GMT 的时差。
CST:您所在的当前时区。
m=+0.000152293: 单调时钟读数。

我们将在本文后面介绍单调时钟。 我们现在可以继续前进。
有没有更好的方法来格式化这个?
你打赌。

t := time.Now()
fmt.Println(t.Year())
fmt.Println(t.Month())
fmt.Println(t.Day())
fmt.Println(t.Date())
fmt.Println(t.Hour())
fmt.Println(t.Minute())
fmt.Println(t.Second())yaml复制代码2023
April
17
2023 April 17
0
3
31

以下是如何提取时间的每个元素。 很简单,对吧?
我们如何以更漂亮的格式打印它?
fmt.Printf("%d %d %d\n", t.Year(), t.Month(), t.Day())

2023 4 17

您可以看到我们如何使用 fmt.Printf 函数来根据自己的喜好格式化时间。
但是如果我们想用名字显示月份,比如二月而不是 2 怎么办? 如果我们想以 12 小时制而不是 24 小时制显示时间怎么办? 你可以看到它是如何很快变得复杂的。
有一种更好的格式化时间的方法
幸运的是,我们有 time.Format 函数来帮助我们。 让我们看看它是如何工作的。
less复制代码

fmt.Println(t.Format("Mon Jan 2 15:04:05 2006 MST"))
fmt.Println(t.Format("Mon Jan 2 15:04:05"))
fmt.Println(t.Format("2006/01/02"))
fmt.Println(t.Format("3:04PM"))
fmt.Println(t.Format("15:04PM"))
Mon Apr 17 00:06:21 2023 CST
Mon Apr 17 00:06:21
2023/04/17
12:06AM
00:06AM

我认为这是我刚开始学习这个主题时最让我失望的部分。 这也是您可以看到语言设计者有多么厚颜无耻的部分。
我们可以看到 time.Format 接受一个字符串,该字符串表示我们希望时间采用的格式。这是奇怪的部分,因为 Go 对格式字符串的格式非常非常讲究。
Mon Apr 17 00:06:21 2023 CST

格式字符串必须是该字符串的变体,否则代码会打印出奇怪的时间。 有趣的是,如果排除 Mon,格式字符串的每个元素都代表一个整数。 Jan 是 1,2 是 2,15 是 3。
复制代码1 2 3 4 5 6 -7

不过,从上面的代码中,您可以看到我们如何按照我们想要的方式格式化我们的时间。 而且我们不必编写额外的函数来将小时转换为 12 或 24 小时制,或者将每个整数映射到月份。
您也可以使用预定义的格式,如下所示:

fmt.Println(time.UnixDate)
fmt.Println(time.RFC3339)yaml复制代码Mon Jan _2 15:04:05 MST 2006
2006-01-02T15:04:05Z07:00

查看文档以了解更多格式。
不同的时区呢?
如上所示,系统会自动检测时区。 但是,在某些情况下,您可能需要显示不同时区的时间。

nt := time.Now()
lt := time.Now().Local()
ut := time.Now().UTC()
fmt.Println(nt)
fmt.Println(lt)
fmt.Println(ut)
2023-04-17 00:11:10.214751 +0800 CST m=+0.000135417
2023-04-17 00:11:10.214751 +0800 CST
2023-04-16 16:11:10.214751 +0000 UTC

Local() 获取本地时区,这与 time.Now() 会自动检测到的时间相同。 调用 UTC() 会将时区转换为 UTC。
但是,如果我们需要更强大的东西怎么办?

l, _ := time.LoadLocation("UTC")
fmt.Printf("%s\n", nt.In(l))l, _ = time.LoadLocation("Europe/London")
fmt.Printf("%s\n", nt.In(l))l, _ = time.LoadLocation("America/Los_Angeles")
fmt.Printf("%s\n", nt.In(l))l, _ = time.LoadLocation("Asia/Seoul")
fmt.Printf("%s\n", nt.In(l))
2023-04-16 16:12:00.918525 +0000 UTC
2023-04-16 17:12:00.918525 +0100 BST
2023-04-16 09:12:00.918525 -0700 PDT
2023-04-17 01:12:00.918525 +0900 KST

time.LoadLocation 将加载您选择的语言环境。 您可以使用此结果通过传入你的 time.In 来转换您的时间。
您还可以从字符串中读取时间
在许多情况下,您将不得不读入一个字符串。 通常,这些将是时间戳。 在这些时间戳字符串上使用时间库的函数不是很好吗?
默认情况下,时间库适用于 time.Time 类型。 但是,我们可以使用 time.Parse 来解析这些时间戳字符串。
go复制代码

timestamp := "2023-02-06 23:49:01"
ts, err := time.Parse("2006-01-02 15:04:05", timestamp)
if err != nil {fmt.Println(err)
}
fmt.Println(ts)
yaml复制代码2023-02-06 23:49:01 +0000 UTC

您还可以使用上述 Format 方法格式化 ts。
等等,什么是单调时钟?
让我们回到这个话题。 这听起来比实际情况要可怕得多。
您的计算机有一个计时时钟。 很有可能这次相当不稳定。 有没有过在去另一个国家旅行后你的时钟慢了几个小时的经历? 是否曾经需要重新设置您的时钟以使其与您的手表相匹配? 这个时钟叫做挂钟,很容易改变。
虽然挂钟擅长报时,但不适合测量时间。 例如,看看这段代码。

t1 := time.Now()
fmt.Println(t1)
time.Sleep(time.Second)
t2 := time.Now()
fmt.Println(time.Now())
fmt.Println(t2.Sub(t1))
2023-04-17 00:15:32.65858 +0800 CST m=+0.000109168
2023-04-17 00:15:33.660121 +0800 CST m=+1.001672543
1.001563166s

上面的代码测量了 t1 和 t2 之间经过的时间。 这看起来很明显,因为我们在声明 t2 之前等待了一秒钟。 但是,如果我们以某种方式设法在该跨度内切换我们的操作系统时间设置呢? 如果我们将系统时钟增加 4 小时,是否意味着 t1 和 t2 之间经过的时间为 4 小时 1 秒? 这是荒谬的!
这就是 Go 使用单调时钟来测量时间的原因。 从打印出来的时间里的m值可以看出,时间差大约是一秒。 单调时钟允许准确测量时间。

结论

我们对时间的概念如此熟悉,以至于我们倾向于认为我们对它的理解是理所当然的。 然而,时间往往是在计算机中表示的更令人沮丧的事物之一。 幸运的是,Go 开发人员已经从我们这里抽象出了大部分原始转换,这样我们就可以使用 time 包的简单易懂的功能。 这篇文章涵盖了很多必要的功能,但如果您需要细节,您可以随时参考官方文档。

相关文章:

在Go中处理时间数据

获取时间 这可能是软件包中最常用的方法。我们如何知道当前的时间呢?像这样: t : time.Now() fmt.Println(t)ini复制代码2023-04-16 23:54:45.924965 0800 CST m0.000152293这就是当前的时间。这是很麻烦的,所以我将把它分解成几个部分。 …...

SOLIDWORKS PDM 2024数据管理5大新功能

1. 改进的视觉内容 • 通过装配体可视化功能,在 SOLIDWORKS 中以图形方式查看零部件数据,如工作流程状态。• 使用特定图标迅速识别焊件切割清单零部件。 优点:重要数据和系统信息一目了然。 2.增强的数据保护和跟踪功能 •保护“包含”和…...

5G与医疗:开启医疗技术的新篇章

5G与医疗:开启医疗技术的新篇章 随着5G技术的快速发展和普及,它已经在医疗领域产生了深远的影响。5G技术为医疗行业提供了更高效、更准确、更及时的通信方式,从而改变了医疗服务的模式和患者的体验。本文将探讨5G技术在医疗领域的应用场景、优…...

Linux云服务器限制ip进行ssh远程连接

对Linux云服务器限制IP进行SSH远程连接的原因主要有以下几点: 增加安全性:SSH是一种加密的网络传输协议,可以保护数据的机密性和完整性。通过限制SSH连接的IP地址,可以防止未经授权的访问和数据泄露。只有拥有访问权限的IP地址才…...

【100天精通Python】Day72:Python可视化_一文掌握Seaborn库的使用《二》_分类数据可视化,线性模型和参数拟合的可视化,示例+代码

目录 1. 分类数据的可视化 1.1 类别散点图(Categorical Scatter Plot) 1.2 类别分布图(Categorical Distribution Plot) 1.3 类别估计图(Categorical Estimate Plot) 1.4 类别单变量图(Cat…...

(二开)Flink 修改源码拓展 SQL 语法

1、Flink 扩展 calcite 中的语法解析 1)定义需要的 SqlNode 节点类-以 SqlShowCatalogs 为例 a)类位置 flink/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java 核心方法: Override pu…...

java中spi与api的区别

近期看了很多开源组件的源码,发现很多地方地方用到了 spi 的功能,开始思考 spi 与 api 的区别 发现 spi 侧重于抽象层次的概念,目前接触到的就是 java 里大量用到了这个,通过定义的接口来抽象通用的功能,然而 api 是不…...

【Android知识笔记】插件化专题(二)

在上一篇专题【Android知识笔记】插件化专题(一) 中详细介绍了Android三种插件化方案的实现以及它们的优缺点对比总结等。这一篇中主要来看一下一些插件化开源框架的实现原理,当然市场上的插件化框架有很多,层出不穷,如 DiDi VirtualApk、360 Replugin 等。本人在过去的工…...

赶紧收藏!史上最全IDEA快捷键大全

参考 IntelliJ IDEA 的官网,列举出了IntelliJ IDEA(Windows 版)的所有快捷键。 建议收藏,有需要的时候根据关键字来查找! idea专业版获取 kdocs.cn/l/ctYoaM6evJkl 该快捷键共分 16 类,可以方便的按各类…...

IntelliJ IDEA 把package包展开和压缩

想要展开就把对勾取消,想要压缩就勾上...

Python——自动创建文件夹

文章目录 前言一、判断文件夹或者文件是否存在二、创建一级文件夹三、创建多级文件夹四、代码封装前言 利用 Python编程语言实现自动创建文件夹,程序以函数形式封装,直接按要求传参即可调用。 在python中没有直接针对文件夹的操作方法,可以借助模块os,os.path和shutil来操作…...

Leetcode—21.合并两个有序链表【简单】

2023每日刷题(十三) Leetcode—21.合并两个有序链表 直接法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* mergeTwoLists(struct ListNode* list1, struct…...

数据链路层和DNS之间的那些事~

数据链路层,考虑的是两个节点之间的传输。这里面的典型协议也很多,最知名的就是“以太网”。我们本篇主要介绍的就是以太网协议。这个协议规定了数据链路层,也规定了物理层的内容。 目录 以太网帧格式 帧头 载荷 帧尾 DNS 从输入URL到…...

Spring-声明式事务

声明式事务 一、简介1、准备工作2、测试 二、声明式事务概念1、编程式事务2、声明式事务3、基于注解的声明式事务1.测试无事务情况2.加入事务①Transactional注解标识的位置②事务属性:只读③事务属性:超时④事务属性:回滚策略⑤事务属性&…...

腾讯云轻量服务器地域选择教程,一篇文章就够了

腾讯云轻量应用服务器地域是指轻量服务器数据中心所在的地理位置,如上海、广州和北京等地域,如何选择地域?腾讯云百科txybk.com建议地域选择遵循就近原则,用户距离轻量服务器地域越近,网络延迟越低,速度就越…...

【斗罗二】王东升级三环,戴华斌挑衅,雨浩单手接鼎订下赌约

【侵权联系删除】【文/郑尔巴金】 深度爆料,《绝世唐门》第20集,一场瞩目的战斗即将爆发。王冬,这位一年级的强攻系班长,将与戴华斌进行一场激烈的较量。王冬拥有三大武魂,其中最为人们所熟知的是那光明女神蝶&#x…...

洛谷 B2135:单词替换

【题目来源】https://www.luogu.com.cn/problem/B2135【题目描述】 输入一个字符串,以回车结束(字符串长度 ≤200)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换…...

IDEA中application.properties文件中文乱码

现象: 原因: 项目编码格式与IDEA编码格式不一致导致的 解决办法: 在File->Settings->Editor->File Encodings选项中,将Global Encoding,Project Encoding,Default encoding for properties files这三个选项置为一致&a…...

Rust 模块系统

文章目录 模块系统crate包cargo 创建库库的使用 模块系统 Rust的{模块系统|the module system},包括: * 包(Packages): Cargo 的一个功能,它允许你构建、测试和分享 crate。 * Crates :一个模…...

面向服务架构-架构师(六十四)

SOA概述和发展、参考架构、协议和规范、标准和原则、设计模式、构件和实施。 SOA概述和发展 服务指系统对外提供的功能,SOA是一种应用框架。 微服务去掉了ESB企业服务总线,SOA集中式,SOA和微服务的区别: 微服务更加精细。服务…...

Dynamic Deep Learning for Li-ion Battery Fault Detection: A Practical Approach with Real-world EV Da

1. 动态深度学习在锂电池故障检测中的核心价值 锂电池作为电动汽车的核心部件,其健康状况直接关系到整车的安全性和可靠性。传统基于阈值的检测方法在面对复杂多变的实际工况时,往往表现不佳。我们团队在实际测试中发现,某品牌车辆在低温环境…...

多宽带联网(五) OpenWrt中MWAN3高级策略分流实战(游戏加速、视频优化场景)

1. MWAN3策略分流的核心价值 家里拉了两条宽带却发现刷视频卡、打游戏延迟高?这种情况我遇到过太多次了。去年给朋友家调试网络时,他同时接了电信和联通两条200M宽带,但看4K视频还是缓冲,玩外服游戏延迟总在200ms以上。后来用Open…...

如何跨越语言盲区,让学术表达精准落地

当我们完成了精妙的实验设计,获得了宝贵的数据,准备向世界展示科研成果时,却常常在“最后一公里”遭遇阻碍。这种阻碍并非源于科研本身的深度,而是来自于语言表达的信心不足与自查盲区。你是否也有过这样的经历:对着屏…...

Pinocchio库初体验:用Python快速验证你的双足机器人模型正逆解

Pinocchio库实战:Python双足机器人正逆运动学快速验证指南 当你第一次打开Pinocchio的文档时,可能会被那些复杂的数学公式和术语吓到。但别担心,我们今天要做的,就是抛开理论直接上手——用不到50行代码,让你的双足机…...

基于机器学习的驾驶疲劳检测,应该如何入门?

基于机器学习的驾驶疲劳检测可以说是本科/硕士毕设中性价比很高的一个题目:它既有充足的开源参考资料,又容易做出可视化的Demo,答辩时也比较讨喜。 我来帮你把这个看似庞大的项目拆解成流水线。 你不需要去手搓底层的神经网络,只…...

Matlab/Simulink仿真BLDC电机:避开转速闭环控制的5个常见坑

BLDC电机转速闭环仿真避坑指南:从参数配置到结果验证的完整解决方案 在电机控制领域,BLDC(无刷直流电机)因其高效率、长寿命和低维护成本等优势,已成为工业自动化、电动汽车和消费电子等领域的主流选择。Matlab/Simul…...

GHelper:华硕笔记本轻量级替代方案与性能优化指南

GHelper:华硕笔记本轻量级替代方案与性能优化指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, …...

告别复制粘贴!用Qwen Code在终端里直接重构500行烂代码(附真实项目截图)

告别复制粘贴!用Qwen Code在终端里直接重构500行烂代码(附真实项目截图) 接手一个满是技术债的项目,就像走进一间多年无人打扫的仓库——到处是随意堆放的代码、重复的逻辑、难以理解的函数命名。更糟的是,传统的AI辅助…...

别再为日期格式头疼了!Oracle TO_TIMESTAMP函数保姆级使用指南(含常见报错解决)

Oracle TO_TIMESTAMP实战:从混乱字符串到精准时间戳的避坑指南 刚接手一个数据迁移项目时,我对着几十万条格式各异的日期记录发愁——有"2023/12/01"这样的斜杠分隔,也有"01-Dec-23 14.30.00.123"带英文月份缩写和毫秒的…...

RePKG终极指南:Wallpaper Engine资源提取与转换的完整解决方案

RePKG终极指南:Wallpaper Engine资源提取与转换的完整解决方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经遇到过这样的问题?在Wallpaper Eng…...