📜  在 Golang 中的持续时间

📅  最后修改于: 2021-10-24 13:15:20             🧑  作者: Mango

与时间和日期相关的操作是软件开发的关键部分(例如日志保存)。 Go 标准库提供了一个时间包,里面有很多处理日期和时间的函数和方法。操作系统测量两种类型的时间“挂钟”时间和“单调”时间。挂钟时间用于告诉时间,而单调时钟时间用于测量时间。 Go time 包提供了测量和操作两个时钟的功能。 Golang拥有了time.time数据类型来处理挂钟时间和time.Duration对付单调时间。

第一个基本方法是 time.Now() ,它返回当前日期和时间高达纳秒精度。返回值的数据类型为 time.Time,它是一个结构体。根据 Golang 的官方文档,“A Time 表示具有纳秒精度的时间瞬间。”

package main
  
import (
    "fmt"
    "time"
)
  
func main() {
  
    // Returns current time.
    t := time.Now()
    fmt.Println(t)
}

输出:

2020-04-29 00:37:36.849599502 +0530 IST m=+0.000166550 

在 Go 中,任何声明但未初始化的变量默认设置为零值。 Time 类型的零值是 1 月 1 日,第 1 年,00:00:00.000000000 UTC,这在现实生活中是不可能的。 IsZero 方法还可用于检查 Time 变量是否已初始化。

package main
  
import (
    "fmt"
    "time"
)
  
func main() {
    var t time.Time
    fmt.Println(t)
    fmt.Println(t.IsZero())
}

输出:

0001-01-01 00:00:00 +0000 UTC 
true 

time.Time 数据类型具有包含时间、日期、位置、时区和单调时间的基本类型结构。 Go time 包具有从时间瞬间(如日期、时间、日期、位置等)中提取各个部分的方法。

package main
  
import (
    "fmt"
    "time"
)
  
func main() {
  
    t := time.Now()
    fmt.Println(t)
  
    // We can get individual values
    // of hour, minute, seconds,
    // nanoseconds from time.Time
    // datatype
  
    // Returns wall clock time
    // from time.Time datatype
    fmt.Println(t.Clock())
    fmt.Println(t.Hour())
    fmt.Println(t.Minute())
    fmt.Println(t.Second())
    fmt.Println(t.Nanosecond())
  
    fmt.Println("---------------------------------")
  
    // We can get individual values
    // of day, month, year, yearday,
    // and weekday from time.Time
    // datatype
  
    // Returns date from
    // time.Time datatype
    fmt.Println(t.Date())
    fmt.Println(t.Day())
    fmt.Println(t.Month())
    fmt.Println(t.Year())
    fmt.Println(t.YearDay())
    fmt.Println(t.Weekday())
  
    // week number
    fmt.Println(t.ISOWeek())
  
    fmt.Println("---------------------------------")
  
    // current time in string formats
    fmt.Println(t.String())
  
    // nanoseconds passed
    // from 1 january 1970
    fmt.Println(t.Unix())
  
    // prints abbreviated timezone and
    // its offset in seconds from
    // east of UTC
    fmt.Println(t.Zone())
  
    // prints nanoseconds
    // elapsed from 1 january 1970
    fmt.Println(t.UnixNano())
}

输出:

2020-04-29 17:54:25.643755713 +0530 IST m=+0.000064065
17 54 25
17
54
25
643755713
---------------------------------
2020 April 29
29
April
2020
120
Wednesday
2020 18
---------------------------------
2020-04-29 17:54:25.643755713 +0530 IST m=+0.000064065
1588163065
IST 19800
1588163065643755713

Golang ==运算符不仅比较时间,还比较位置和单调时钟读数。

time.Duration有一个基类型 int64。持续时间将两个瞬间之间的经过时间表示为 int64 纳秒计数”。最大可能的纳秒表示可达 290 年。

type Duration int64

各种持续时间实例的转换:

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)
package main
  
import (
    "fmt"
    "time"
)
  
func main() {
  
    // random duration in nanoseconds
    var d time.Duration = 1000000000
  
    // converts d in hour
    fmt.Println(d.Hours())
  
    // converts d in minutes
    fmt.Println(d.Minutes())
  
    // converts d in seconds
    fmt.Println(d.Seconds())
  
    // converts d in miliseconds
    fmt.Println(d.Milliseconds())
  
    // converts d in microseconds
    fmt.Println(d.Microseconds())
  
    // string representation go d
    fmt.Println(d.String())
}

输出:

0.0002777777777777778
0.016666666666666666
1
1000
1000000
1s