软件的设计是为了让工作更容易完成,对许多人来说,这包括与日期和时间进行交互。日期和时间值在现代软件中无处不在。例如,跟踪汽车何时需要服务并让车主知道,跟踪数据库中的变化以创建审计日志,或者只是比较一个时间和另一个时间来确定一个过程花费了多长时间。因此,检索当前时间,操作时间值以从中提取信息,并以易于理解的格式显示给用户是应用程序的基本属性。
在本教程中,您将创建一个Go程序来获取计算机的当前本地时间,然后以更容易阅读的格式打印到屏幕上。接下来,解析字符串以提取日期和时间信息。我们还将转换两个时区之间的日期和时间值,以及加减时间值以确定两个时间之间的间隔。
在本节中,您将使用Go的time
包获取当前时间。Go标准库中的time
包提供了各种与日期和时间相关的函数,可以使用time.Time
来表示特定的时间点。时间的类型。除了时间和日期,它还可以保存日期和时间所在时区的信息。
要开始创建一个探索time
包的程序,你需要为文件创建一个目录。你可以在电脑上的任何地方创建这个目录,但许多开发人员倾向于为他们的项目创建一个目录。在本教程中,你将使用一个名为projects
的目录。
创建projects
目录并导航到它:
mkdir projects
cd projects
在projects
目录下,运行mkdir
来创建一个datetime
目录,然后使用cd
导航到它:
mkdir datetime
cd datetime
创建好项目目录后,使用nano
或者你喜欢的编辑器打开一个main.go
文件:
nano main.go
在main.go
文件中,添加一个main
函数,它将获取当前时间并打印出来:
projects/datetime/main.go
package main
import (
"fmt"
"time"
)
func main() {
currentTime := time.Now()
fmt.Println("The time is", currentTime)
}
在这个程序中,使用time
包中的time.Now
函数获取当前本地时间作为time.Time
值,然后将其存储在currentTime
变量中。一旦它被存储在变量中,fmt.Println
函数使用time.Time
的默认字符串输出格式将currentTime
打印到屏幕上。
使用go Run
和main.go
文件运行程序:
go run main.go
OutputThe time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626
输出将显示当前的日期和时间,这与示例不同。此外,您看到的时区(此输出中的-0500 CDT
)可能不同,因为time.Now()
返回本地时区的时间。
你可能还注意到输出中有一个m=
值。该值是单调时钟, Go在内部测量时间差异时使用.单调时钟被设计为在程序运行时补偿计算机系统时钟的日期和时间的任何潜在变化。通过使用单调时钟,与五分钟后的“time.Now”值相比,“time.Now”值仍然会得到正确的结果(五分钟间隔),即使计算机的系统时钟在该五分钟间隔期间向前或向后改变了一小时。你不需要彻底理解本教程中的代码或示例,但如果你想了解更多关于单调时钟以及Go如何使用它们,time
包文档中的monotonic clocks部分提供了更多详细信息。
现在,虽然您确实显示了当前时间,但它对用户可能没有用处。它可能不是您想要的格式,或者它包含的日期或时间可能比您想要显示的更多。
幸运的是,time.Time
类型包含各种方法来获取你想要的日期或时间的特定部分。例如,如果你只想知道currentTime
变量的年份部分,你可以使用 Year
方法,或者使用Hour
方法获取当前的小时数。
再次打开main.go
文件,并在输出中添加一些time.Time
方法,看看它们会产生什么:
projects/datetime/main.go
...
func main() {
currentTime := time.Now()
fmt.Println("The time is", currentTime)
fmt.Println("The year is", currentTime.Year())
fmt.Println("The month is", currentTime.Month())
fmt.Println("The day is", currentTime.Day())
fmt.Println("The hour is", currentTime.Hour())
fmt.Println("The minute is", currentTime.Hour())
fmt.Println("The second is", currentTime.Second())
}
接下来,使用go run
再次运行程序:
go run main.go
OutputThe time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626
The year is 2021
The month is August
The day is 15
The hour is 14
The minute is 14
The second is 45
与前面的输出一样,当前日期和时间与示例不同,但格式应该相似。这一次,在输出中,你将看到完整的日期和时间像之前一样打印出来,而且还有一个包含年、月、日、时、分和秒的列表。注意,月份不是打印为数字(像打印完整的日期那样),而是显示为英文字符串August
。这是因为Month
方法以time.Month
类型返回月份,而不仅仅是一个数字,并且当它作为string
打印时,该类型被设计为打印出完整的英文名称。
现在,再次更新程序中的main.go
文件,并将各种函数输出替换为对fmt.Printf
的单个函数调用,这样您就可以以更接近您可能希望向用户显示的格式打印当前日期和时间:
projects/datetime/main.go
...
func main() {
currentTime := time.Now()
fmt.Println("The time is", currentTime)
fmt.Printf("%d-%d-%d %d:%d:%d\n",
currentTime.Year(),
currentTime.Month(),
currentTime.Day(),
currentTime.Hour(),
currentTime.Hour(),
currentTime.Second())
}
将更新保存到main.go
文件后,像之前那样使用go run
命令运行它:
go run main.go
OutputThe time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626
2021-8-15 14:14:45
这一次你的输出可能更接近你想要的,但仍然有一些东西可以对输出进行调整。月份现在再次以数字格式显示,因为fmt.Printf
格式使用%d
来告诉time.Month
类型,它应该使用数字而不是string
,但它只显示为单个数字。如果您想显示两位数字,可以更改fmt.Printf
格式以表示这一点,但如果您还想显示12小时时间而不是上面输出中显示的24小时时间,该怎么办?使用fmt.Printf
方法,你必须自己做数学计算。使用fmt.Printf
打印日期和时间是可能的,但正如你所看到的,它最终可能会变得麻烦。这样做,你可能会为每个想要显示的部分生成大量的行,或者需要自己进行大量计算来确定要显示什么。
在本节中,我们创建了一个新程序,使用time.Now
获取当前时间。一旦你有了当前时间,你就可以使用各种函数,例如time.Time
类型的Year
和Hour
来打印出有关当前时间的信息。然而,以自定义格式显示它确实开始成为一项艰巨的工作。为了使这种常见的工作更容易,包括Go在内的许多编程语言提供了一种特殊的方式来格式化日期和时间,类似于fmt.Printf
可以用于格式化字符串。
除了Year
、Hour
和其他与数据相关的方法,time.Time
类型还提供了一个名为Format
的方法。Format
方法允许你提供一个string
布局,类似于你如何提供fmt.Printf
或fmt.Sprintf
格式,它将告诉Format
方法你希望如何打印日期和时间。在本节中,您将使用Format
方法以更简洁的方式复制上一节中添加的时间输出。
不过,在使用Format
方法之前,如果Format
不是每次运行程序时都发生变化,它将更容易看到如何影响日期和时间的输出。到目前为止,你都是通过time.Now
获取当前时间,所以每次运行它都会显示不同的数字。Go的time
包提供了另一个有用的函数,time.Date
函数,它允许你为time.Time
指定具体的日期和时间。
要在你的程序中使用time.Date
而不是time.Now
,请再次打开main.go
文件并更新它,将time.Now
替换为time.Date
:
projects/datetime/main.go
...
func main