詳解golang的日期與時間型態的變化與使用

 在 Golang 中,日期與時間的操作主要是通過內建的 time 套件完成的。time 提供了多種處理日期與時間的方法、型態和功能,非常適合用於時間相關的應用程式開發。


Golang 日期與時間的基本型態

1.

time.Time

time.Time 是 Golang 中的日期與時間的核心型態,用於表示特定的時間點。

它是不可變的(immutable),即一旦創建,值無法被更改。

import (

"fmt"

"time"

)

func main() {

now := time.Now() // 獲取當前時間

fmt.Println("Current Time:", now)

}


2.

time.Duration

time.Duration 表示兩個時間點之間的時間間隔,精確到納秒。

是 int64 的別名,內部表示為納秒數。

import (

"fmt"

"time"

)

func main() {

duration := time.Hour + 30*time.Minute

fmt.Println("Duration:", duration)

}

Golang 日期與時間的格式化與解析


1.

格式化時間:Format 方法


格式化範例:

import (

"fmt"

"time"

)


func main() {

now := time.Now()

fmt.Println("Default Format:", now)


// 自訂格式

fmt.Println("YYYY-MM-DD:", now.Format("2006-01-02"))

fmt.Println("YYYY/MM/DD HH:MM:SS:", now.Format("2006/01/02 15:04:05"))

fmt.Println("DD-MM-YYYY:", now.Format("02-01-2006"))

}

2.

解析時間:Parse 方法


Parse 用於將字串解析為 time.Time 型態。


import (

"fmt"

"time"

)


func main() {

timeStr := "2025-02-06 15:30:00"

layout := "2006-01-02 15:04:05"


parsedTime, err := time.Parse(layout, timeStr)

if err != nil {

fmt.Println("Error parsing time:", err)

} else {

fmt.Println("Parsed Time:", parsedTime)

}

}




常用功能


1.

獲取當前時間:time.Now

now := time.Now()

fmt.Println("Current Time:", now)

2.

計算時間差:Sub

Sub 方法用於計算兩個時間點之間的差距,返回 time.Duration。


import (

"fmt"

"time"

)


func main() {

start := time.Now()

time.Sleep(2 * time.Second) // 模擬延遲

end := time.Now()


duration := end.Sub(start)

fmt.Println("Elapsed Time:", duration)

}


3.

增加/減少時間:Add

可以通過 time.Duration 增加或減少時間。


import (

"fmt"

"time"

)


func main() {

now := time.Now()


// 加一小時

plusOneHour := now.Add(1 * time.Hour)

fmt.Println("One Hour Later:", plusOneHour)


// 減一天

minusOneDay := now.Add(-24 * time.Hour)

fmt.Println("One Day Earlier:", minusOneDay)

}

4.

比較時間:Before、After 和 Equal


import (

"fmt"

"time"

)


func main() {

time1 := time.Date(2025, 2, 6, 10, 0, 0, 0, time.UTC)

time2 := time.Date(2025, 2, 7, 10, 0, 0, 0, time.UTC)


fmt.Println("time1 is before time2:", time1.Before(time2))

fmt.Println("time1 is after time2:", time1.After(time2))

fmt.Println("time1 is equal to time2:", time1.Equal(time2))

}



計時功能


1.

計算執行時間:time.Since

time.Since 是 time.Now().Sub(t) 的快捷方式。


import (

"fmt"

"time"

)


func main() {

start := time.Now()


// 模擬一些工作

time.Sleep(2 * time.Second)


duration := time.Since(start)

fmt.Println("Execution Time:", duration)

}


2.

使用 Ticker 執行定時任務

time.Ticker 可用於週期性執行任務。


import (

"fmt"

"time"

)


func main() {

ticker := time.NewTicker(1 * time.Second)

defer ticker.Stop()


for i := 0; i < 5; i++ {

<-ticker.C

fmt.Println("Tick at", time.Now())

}

}



注意事項

時區處理: 使用 time.LoadLocation 和 In 方法來處理不同的時區。


loc, _ := time.LoadLocation("Asia/Taipei")

now := time.Now().In(loc)

fmt.Println("Time in Taipei:", now)

高精度計時: 如果需要更高的計時精度,可以使用 time.Now().UnixNano() 獲取當前時間的納秒級時間戳。


長時間操作: 當處理超過一天以上的時間間隔時,建議使用 time.Duration,避免精度損失。


留言

這個網誌中的熱門文章

[Kotlin]如何學習Kotlin

[golang]如何使用 gorm 高效執行批量插入 (可以透過 Create()、CreateInBatches(),或者 原生 SQL 語句 來提升效率)

[Kotlin]Kotlin Multiplatform (KMP) 如何安裝使用和部署