Yayako's Blog

「Shooting for the stars when I couldn't make a killing.」

仅作java2go的简单记录,有错误烦请提出

合集整理:Java转Go的学习-合集

demo已上传git:https://gitee.com/yayako/go-learning.git

time包及日期函数的使用

1
import "time"

time.Now()

用于获取当前时间的函数,返回了结构体 Time ,还可以进一步获取当前年月日时分秒。

1
2
3
4
5
6
time.Now().Year()
time.Now().Month()
time.Now().Day()
time.Now().Hour()
time.Now().Minute()
time.Now().Second()

格式化

Time 还提供了格式化方法

但是需要注意go语言的格式化时间模板不是常见的Y-m-d H:M:S,而是go诞生时间(2006-01-02 15:04:05 -> 2006 1 2 3 4 5)

1
2
3
4
5
6
7
timeTmp := time.Now()

// 使用format格式化
formatDate1 := timeTmp.Format("2006-01-02 03:04:05") // 使用 03 表示采取12小时制
fmt.Println(formatDate1) // 2020-11-04 01:09:32
formatDate2 := timeTmp.Format("2006/01/02 15:04:05") // 使用 15 表示采取24小时制
fmt.Println(formatDate2) // 2020/11/04 13:09:32

日期字符串转时间

1
2
3
timeStr := "2021-01-29 18:06:53"
// Local represents the system's local time zone. 代表系统本地时区
timeTmp, _ = time.ParseInLocation("2006-01-02 15:04:05", timeStr, time.Local)

结果

1
日期字符串[2021-01-29 18:06:53] 转 时间[2021-01-29 18:06:53 +0800 CST]

时间戳

通过 Unix 函数获取时间戳

1
timeStamp := time.Now().Unix()

时间戳转日期

1
2
3
4
// 参数1:秒时间戳,参数2:纳秒时间戳。不需要的设为默认值0即可
t := time.Unix(timeStamp, 0) // 返回结构体Time
timeStamp := time.Now().Unix()
timeStr := t.Format("2006-01-02 15:04:05")

结果

1
时间戳[1611914813] 转 时间[2021-01-29 18:06:53]

时间操作函数

time包中定义了许多常量,可以直接使用

1
2
3
4
5
6
7
8
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)

以及定义了一些时间操作函数

1
2
3
4
5
6
7
8
9
10
11
12
// 时间加法
func (t Time) Add(d Duration) Time
// 时间减法
func (t Time) Sub(u Time) Duration
// 从t以来经过的时间
// 类似于time.Now().Sub(t).
func Since(t Time) Duration
// 直到t所需的时间
// 类似于t.Sub(time.Now()).
func Until(t Time) Duration
// 将时间加上所给年月日并返回
func (t Time) AddDate(years int, months int, days int) Time

Add 为例

1
2
timeTmp = timeTmp.Add(time.Hour) // 2021-01-29 18:06:53 + 1h
fmt.Println(timeTmp.Format("2006-01-02 15:04:05"))

输出结果 2021-01-29 19:06:53

定时器

time.NewTicker(d Duration) 创建一个定时器,d 代表时间间隔,定时器的需要通过 for range 执行,任务执行完毕后调取 Stop 终止定时器。

需要注意的是,终止定时器后,还需通过 break 跳出该 for range 循环,否则会引发死锁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 定义一个定时器,5秒内每隔一秒打印一次当前时间
ticker := time.NewTicker(time.Second)
n := 5
for t := range ticker.C {
n--
fmt.Println(t)
if n == 0 {
ticker.Stop() // 终止定时器
// 若此处不写break退出定时任务语句,会发生死锁:
// fatal error: all goroutines are asleep - deadlock!
//
// goroutine 1 [chan receive]:
// main.main()
// golang-learning/src/main/ex8.go:71 +0x869
break
}
}

sleep函数

1
time.Sleep(time.Second * 3)

评论