在Go中处理时间数据

news/发布时间2024/5/16 1:52:15

在许多场合,你将不得不编写必须处理时间的代码。你可以写一个时钟程序,或者在你的代码中测量两点之间的时间差。无论是哪种方式,知道如何在Go中处理时间数据是很重要的。这很简单,了解一些有趣的函数可以帮助你节省时间。在Go中处理时间数据需要你从Go标准库中导入 time 包。这个包有很多方法和类型供你使用,但我选取了最常用的方法和类型,并在这篇文章中进行了描述。如果你想看更多关于这个主题的信息,请查看time包的文档页面。

获取时间

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

t := time.Now()
fmt.Println(t)
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())
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 函数来帮助我们。 让我们看看它是如何工作的。

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)
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 来解析这些时间戳字符串。

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)
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.bcls.cn/XDWl/1774.shtml

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

相关文章

电脑进水无法开机怎么办 电脑进水开不了机的解决方法

意外总是会不定时打破你的计划,电脑这类电器最怕遇到的除了火还有水,设备进水会导致数据丢失,那么我们遇到电脑进水怎么办?进水之后不正确处理也会引起很多不必要的麻烦. 解决办法 第一步:关机 如果您的电脑是在开…

c语言结构体与共用体

前面我们介绍了基本的数据类型 在c语言中 有一种特殊的数据类型 由程序员来定义类型 目录 一结构体 1.1概述 1.2定义结构体 1.3 结构体变量的初始化 1.4 访问结构体的成员 1.5结构体作为函数的参数 1.6指向结构的指针 1.7结构体大小的计算 二共用体 2.1概述 2.2 访…

C# OpenCvSharp DNN Image Retouching

目录 介绍 模型 项目 效果 代码 下载 C# OpenCvSharp DNN Image Retouching 介绍 github地址:https://github.com/hejingwenhejingwen/CSRNet (ECCV 2020) Conditional Sequential Modulation for Efficient Global Image Retouching 模型 Model Properti…

PHP脉聊交友系统网站源码,可通过广告变现社交在线聊天交友即时通讯APP源码,附带视频搭建教程

探索全新社交体验:一站式PHP交友网站解决方案 🌐 全球化交友,无界沟通 在数字化的浪潮下,社交已不再受地域限制。我们的PHP交友网站不仅支持多国语言,还配备了即时翻译功能,让您轻松跨越语言障碍&#xff…

【AI学习】LangChain学习

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

C++初阶篇----新手进村

目录 一、什么是C二、C关键字三、命名空间3.1命名空间的定义3.2命名空间的使用 四、C输入和输出五、缺省参数5.1缺省参数的概念5.2缺省参数的分类 六、函数重载6.1函数重载的概念6.2函数重载的原理----名字修饰 七、引用7.1引用概念7.2引用特性7.3常引用7.4引用的使用7.5传值、…

Vue3实现带动画效果的tab栏切换

效果图如下所示&#xff1a; 实现思路&#xff1a; 其实很简单 1、首先切换tab栏时tab标签激活下标与对应显示内容下标要一致。 2、其次点击tab栏切换时更新下标 3、最后就是css添加动画效果 这样就了&#xff01;&#xff01;&#xff01; 上全部代码 <template><…

[word] 怎么把word表格里的字放在正中间? #职场发展#知识分享#知识分享

怎么把word表格里的字放在正中间&#xff1f; word表格中文字在中间的处理方式如下&#xff1a; 1、在表格中选择需要居中的文字的单元格&#xff0c;具体如下图。 2、全选后&#xff0c;鼠标在工具栏中找到&#xff1a;对齐方式&#xff0c;点击它后面的倒三角&#xff0c;如…

C/C++内存管理

一. C/C内存分布 首先我们先来看一下如下代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int*…

HTML总结

1.网页 1.1 什么是网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一页&#xff0c;通常是 HTML格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的基本元素&#xff0c;它通常由图片、…

git上传报错:Object too large, rejecting the pack

在gerrit设置了最大不能上传超过600M的文件&#xff0c;今天开发遇到推送问题&#xff1a; 结果到本地怎么也找不到大文件。 后来只能按commit排查&#xff0c;用如下命令排查到了&#xff1a; 解决方法,将大文件去掉&#xff1a;&#xff08;commitid为大文件所在commit&…

网络原理 - HTTP/HTTPS(4)

HTTP响应详解 认识"状态码"(status code) 状态码表示访问一个页面的结果.(是访问成功,还是失败,还是其它的一些情况...).(响应结果如何) 学习状态码 -> 为了调试问题. 写服务器时,按照状态码的含义正确使用. 200 OK 这是最常见的状态码,表示访问成功. 抓包抓…

Android 13.0 SystemUI下拉状态栏定制二 锁屏页面横竖屏通知栏都居中功能实现

1.前言 在13.0的系统rom定制化开发中,在关于systemui的锁屏页面功能定制中,由于在平板横屏通知栏功能中,通知栏总是显示在右边,并且是在右边居中显示的, 由于需要和竖屏显示一样,所以就需要用到在时钟下面显示通知栏,然后同样需要居中显示通知栏,所以就来分析下相关的…

npm常用命令

转载于&#xff1a;npm常用指令_npm指令-CSDN博客

Opencv简单图像操作

Opencv 一、读取图片 1.imshow Mat imread(const string& filename, intflags1 );flags: enum { /* 8bit, color or not */CV_LOAD_IMAGE_UNCHANGED -1, /* 8bit, gray */CV_LOAD_IMAGE_GRAYSCALE 0, /* ?, color */CV_LOAD_IMAGE_COLOR 1, /* any depth, ? */…

ES6 ~ ES11 学习笔记

课程地址 ES6 let let 不能重复声明变量&#xff08;var 可以&#xff09; let a; let b, c, d; let e 100; let f 521, g "atguigu", h [];let 具有块级作用域&#xff0c;内层变量外层无法访问 let 不存在变量提升&#xff08;运行前收集变量和函数&#…

Latex 公式 合并行与列

问题 latex 编辑公式时需要合并行与列 实例 使用 \multirow 和 \multicolumn % \footnotesize \small \begin{equation}\Delta l_p \left\{ \setlength\arraycolsep{2pt} \begin{array}{lll} A , & F, & \multirow[t]{2}{1cm}{$ \mathrm{for~} k 3,6,7, $} \…

Kotlin基本语法1到函数

1.range表达式 fun main() {var age 12.3if (age in 0.0..3.3){println("婴幼儿")}else if (age in 4.0..12.2){println("少儿")}else{println("未知")}/*** in 后面还可以接 list set 都可以*/if (age !in 0.0..3.3){println("婴幼儿&quo…

Unity UGUI的DrawCall优化

Unity UGUI是一种强大的用户界面设计工具&#xff0c;它可以帮助开发者快速创建各种界面元素&#xff0c;从按钮和文本到滑块和面板等。然而&#xff0c;在使用UGUI时&#xff0c;一个常见的性能瓶颈就是DrawCall过多导致的性能下降。在本文中&#xff0c;我们将深入探讨UGUI的…

智慧公厕:让智慧城市的公共厕所焕发“智慧活力”

智慧城市的建设已经进入了一个新的阶段&#xff0c;不仅仅是智慧交通、智慧环保&#xff0c;如今甚至连公厕都开始迎来智慧化时代。智慧公厕作为智慧城市的神经末梢&#xff0c;正在通过信息化、数字化和智慧化的方式&#xff0c;实现全方位的精细化管理。本文以智慧公厕源头专…
推荐文章