2025/3/19

This commit is contained in:
2025-03-19 14:36:09 +08:00
commit abb37c49a7
18 changed files with 2005 additions and 0 deletions

137
技术/Go/常用包/time.md Normal file
View File

@@ -0,0 +1,137 @@
在 Go 语言中,`time` 包提供了丰富的时间和日期处理功能,广泛应用于时间的获取、格式化、解析以及时间间隔的操作。以下是一些常用的 `time` 包函数及其使用方法:
---
### **1. 获取当前时间**
- **`Now() Time`**
返回当前的本地时间。
示例:
```go
now := time.Now()
fmt.Println("当前时间:", now) // 输出: 当前时间: 2025-03-17 14:30:00.xxx
```
---
### **2. 时间的创建**
- **`Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time`**
根据指定的年、月、日、时、分、秒、纳秒和时区创建一个时间对象。
示例:
```go
t := time.Date(2025, time.March, 17, 14, 30, 0, 0, time.Local)
fmt.Println("指定时间:", t) // 输出: 指定时间: 2025-03-17 14:30:00 +0800 CST
```
- **`Unix(sec int64, nsec int64) Time`**
根据 Unix 时间戳(秒数和纳秒数)创建时间对象。
示例:
```go
t := time.Unix(1710651000, 0)
fmt.Println("Unix时间对应时间:", t) // 输出: Unix时间对应时间: 2025-03-17 14:30:00 +0800 CST
```
---
### **3. 时间格式化与解析**
- **`Format(layout string) string`**
将时间对象格式化为字符串,`layout` 是格式模板,必须使用固定的参考时间 `2006-01-02 15:04:05` 的形式。
示例:
```go
t := time.Now()
formatted := t.Format("2006-01-02 15:04:05")
fmt.Println("格式化时间:", formatted) // 输出: 格式化时间: 2025-03-17 14:30:00
```
- **`Parse(layout, value string) (Time, error)`**
将字符串解析为时间对象,`layout` 是格式模板。
示例:
```go
t, err := time.Parse("2006-01-02 15:04:05", "2025-03-17 14:30:00")
if err != nil {
fmt.Println("解析错误:", err)
} else {
fmt.Println("解析时间:", t) // 输出: 解析时间: 2025-03-17 14:30:00 +0000 UTC
}
```
- **`ParseInLocation(layout, value string, loc *Location) (Time, error)`**
类似于 `Parse`,但允许指定时区。
示例:
```go
loc, _ := time.LoadLocation("Asia/Shanghai")
t, _ := time.ParseInLocation("2006-01-02 15:04:05", "2025-03-17 14:30:00", loc)
fmt.Println("解析时间:", t) // 输出: 解析时间: 2025-03-17 14:30:00 +0800 CST
```
---
### **4. 时间计算**
- **`Add(d Duration) Time`**
在当前时间上增加一个时间间隔(`Duration`)。
示例:
```go
t := time.Now()
future := t.Add(24 * time.Hour)
fmt.Println("一天后的时间:", future)
```
- **`Sub(u Time) Duration`**
计算两个时间之间的差值,返回一个 `Duration`。
示例:
```go
t1 := time.Now()
t2 := t1.Add(2 * time.Hour)
duration := t2.Sub(t1)
fmt.Println("时间差:", duration) // 输出: 时间差: 2h0m0s
```
- **`Since(t Time) Duration`**
返回从指定时间到当前时间的时间间隔。
示例:
```go
t := time.Date(2025, time.March, 16, 14, 30, 0, 0, time.Local)
duration := time.Since(t)
fmt.Println("距离现在的时间:", duration) // 输出: 距离现在的时间: 24h0m0s
```
---
### **5. 时间间隔Duration**
- **`time.Duration`**
表示时间间隔,通常以纳秒为单位。可以通过常量如 `time.Second`、`time.Minute` 等表示固定的时间间隔。
示例:
```go
duration := 2*time.Hour + 30*time.Minute
fmt.Println("时间间隔:", duration) // 输出: 时间间隔: 2h30m0s
```
---
### **6. 定时器与休眠**
- **`Sleep(d Duration)`**
让当前 Goroutine 进入休眠状态,持续指定的时间间隔。
示例:
```go
fmt.Println("开始休眠...")
time.Sleep(2 * time.Second)
fmt.Println("休眠结束!")
```
- **`After(d Duration) <-chan Time`**
返回一个通道,在指定的时间间隔后发送当前时间。
示例:
```go
fmt.Println("等待2秒...")
<-time.After(2 * time.Second)
fmt.Println("2秒已过!")
```
---
### **7. 时间相关常量**
- **`time.Second`、`time.Minute`、`time.Hour` 等**
提供了常用的时间单位常量,便于时间间隔的计算。
示例:
```go
fmt.Println("一小时有多少秒:", time.Hour.Seconds()) // 输出: 一小时有多少秒: 3600
```