在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 包的简单易懂的功能。 这篇文章涵盖了很多必要的功能,但如果您需要细节,您可以随时参考官方文档。

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

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

相关文章

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

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

【Linux】虚拟机安装Linux、客户端工具,MobaXterm的使用,Linux常用命令

目录 一,安装Linux的centos7版本 具体安装步骤: 二,Linux常见的命令: 三、安装客户端工具 1、介绍 2、安装MobaXterm 3、换源 四、拍照功能 一,安装Linux的centos7版本 介绍: 具体安装步骤&#…

主定理(一般式)

主定理(Master Theorem)是用于分析递归算法时间复杂度的一个重要工具。它适用于形式化定义的一类递归关系,通常采用分治策略解决问题的情况。 目录 主定理简化版的局限主定理一般形式情况1: n l o g b a n^{log_{b}{a}} nlogb​a …

No174.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

阿里云服务linux系统CentOs8.5安装/卸载nginx1.15.9

说明:尝试使用CentOs8.5安装nginx1.9.9失败,make的时候报错了,后面降低版本为CentOs7.5安装成功了,参考文章:【精选】centos7安装nginx-1.9.9_linx centos nginx 1.9.9版本 nginx error log file: "/-CSDN博客 一、安装ngin…

学习ftp

文章目录 一、FTP介绍二、两种模式(主动模式和被动模式)三、FTP配置文件详解四、实际场景举例五、黑白名单六、网络限制 一、FTP介绍 1.FTP(File Transfer Protocol)是一种应用广泛且古老的互联网文件传输协议。 2.主要应用于互联…

python检测序列中的元素是否满足严格升序关系

方法1 def lessThan1(seq):for index, value in enumerate(seq[:-1]):if value > seq[index1]:return Falsereturn True方法2 def lessThan2(seq):func lambda x, y: x < yreturn all(map(func, seq[:-1], seq[1:]))方法3 from operator import ltdef lessThan3(seq)…

信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】

信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】 课本里章节里所有蓝色字体的思维导图

【Flutter】Flutter 中的图片管理 图片优化的最佳实践

【Flutter】Flutter 中的图片管理 图片优化的最佳实践 文章目录 一、前言二、图片资源的重要性1. 对于项目复杂性的影响2. 性能和资源优化3. 国际化和多平台支持4. UI/UX 的角度看图片管理5. 图片资源与应用安全三、Flutter 中的图片资源分类1. Asset 图片2. 网络图片3. 本地文…

java项目之时间管理系统(ssm框架)

项目简介 时间管理系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、用户管理、分类列表管理、在线学习管理、励志视频管理、活动项目管理、活动报名管理、目标制定管理、论坛管理、系统管理。用户&#xff1a;注册、个人中心、活动报名管理、目标制定管理、我的…

javaEE -10(11000字详解5层重要协议)

一&#xff1a;应用层重点协议 1.1&#xff1a; DNS DNS&#xff0c;即Domain Name System&#xff0c;域名系统。DNS是一整套从域名映射到IP的系统。 TCP/IP中使用IP地址来确定网络上的一台主机&#xff0c;但是IP地址不方便记忆&#xff0c;且不能表达地址组织信息&#x…

mac git ssh

1.作用 1.不用账号密码拉取git项目 2.使用 1.检查是否生成ssh的公钥和私钥 命令&#xff1a; cd ~/.ssh表示没有 No such file or directory 2.如果没有就生成公钥和私钥 ssh-keygen -t rsa -C "帅哥***.com"后面的是git邮箱地址 然后一直按enter&#xff0c;…

二叉树问题——对称二叉树

摘要 101. 对称二叉树 一、对称二叉树解析 1.1 递归思路分析 首先想清楚&#xff0c;判断对称二叉树要比较的是哪两个节点&#xff0c;要比较的可不是左右节点&#xff01;对于二叉树是否对称&#xff0c;要比较的是根节点的左子树与右子树是不是相互翻转的&#xff0c;理解…

Java基于SpringBoot+Vue的网上图书商城管理系统(附源码,教程)

文章目录 1. 简介2 技术栈3 系统功能4系统设计4.1数据库设计 5系统详细设计5.1系统功能模块5.1系统功能模块5.2管理员功能模块 源码下载地址 1. 简介 本次设计任务是要设计一个网上图书商城&#xff0c;通过这个系统能够满足网上图书商城的管理功能。系统的主要功能包括首页、…

进程(2)——进程状态(僵尸,睡眠……)【linux】

进程&#xff08;2&#xff09;——进程状态&#xff08;僵尸&#xff0c;睡眠……&#xff09;【linux】 一.操作系统的进程状态&#xff1a;1.1 运行态1.2 阻塞态1.3 挂起态 二.linux进程状态2.1 R——运行状态2.2 S——浅度睡眠状态2.3 D——&#xff08;disk sleep&#xf…

Shell 脚本学习 day01

release node v1 初始版本 #定义备份目录#当前时间#检查备份目录是否存在&#xff0c;不存在需要创建# 查找并备份 .xxx 文件# 提取文件名&#xff08;不包含路径部分&#xff09;# 构建备份文件名# 将查出来的.xxx文件拷贝到备份目录#!/bin/bash # context 备份根目录下所有.…

iOS调试技巧——使用Python 自定义LLDB

一、类介绍 在使用Python 自定义LLDB之前&#xff0c;先了解一下LLDB的一些类型 SBTarget 正在被调试的程序SBProcess 和程序关联的具体的进程SBThread 执行的线程SBFrame 和线程关联的一个栈帧SBVariable 变量&#xff0c;寄存器或是一个表达式 一般情况下&#xff0c;我们…

D-LINK SQL注入漏洞让攻击者获得管理员权限

D-Link DAR-7000 设备中发现了一个名为 SQL 注入的安全漏洞。 SQL注入是一种恶意攻击&#xff0c;它利用Web应用程序中的漏洞注入恶意SQL语句并获得对数据库的未经授权的访问。 此技术允许攻击者查看、修改和删除数据库中的数据&#xff0c;这可能对数据的机密性、完整性和可…

Linux下进程地址空间初步理解

进程地址空间 进程地址空间是操作系统为每个进程分配的一块内存空间&#xff0c;用于存储进程的代码、数据和堆栈等信息。进程地址空间是逻辑上独立而相互隔离的&#xff0c;每个进程拥有自己独立的地址空间&#xff0c;进程之间不能直接访问彼此的地址空间。 代码段&#xff…

sass和 scss的区别?

Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;和 SCSS&#xff08;Sassy CSS&#xff09;是两种流行的 CSS 预处理器&#xff0c;它们扩展了普通的 CSS 语法&#xff0c;提供了更多的功能和便利性。下面是 Sass 和 SCSS 的主要区别&#xff1a; 1&#xff…