Skip to content

time

time パッケージは時間とカレンダーに関する関数とメソッドを提供します。

time.Now() 関数は現在の時間を取得できます。

go
func Now() Time
go
now := time.Now()
fmt.Println(now)
//2022-11-17 10:00:18.6983438 +0800 CST m=+0.007095001

戻り値のデータタイプは Time 構造体で、非常に多くの時間操作メソッドを含んでいます。

go
func (t *Time) nsec() int32 // ナノ秒

func (t *Time) sec() int64 // 秒

func (t *Time) unixSec() // Unix 時間形式の秒を返す

func (t *Time) addSec(d int64) // 秒を追加

func (t *Time) setLoc(loc *Location) // 地域を設定

func (t *Time) stripMono() // 時間の単調クロック読み取りを削除

func (t Time) After(u Time) // ある時間がその後かどうかを判断

func (t Time) Before(u Time) bool // ある時間がその前かどうかを判断

func (t Time) Equal(u Time) bool // 2 つの時間が同じ瞬間を表すかどうかを判断

func (t Time) Sub(u Time) Duration // 2 つの時間の差を求める

func (t Time) Add(d Duration) Time // 時間間隔を追加

時間単位

time パッケージには基本的な時間単位定数が格納されています。

go
const (
  minDuration Duration = -1 << 63
  maxDuration Duration = 1<<63 - 1
)

const (
  Nanosecond  Duration = 1
  Microsecond          = 1000 * Nanosecond
  Millisecond          = 1000 * Microsecond
  Second               = 1000 * Millisecond
  Minute               = 60 * Second
  Hour                 = 60 * Minute
)

これらのタイプは time.Duration で、最小単位はナノ秒、最大は時間です。

フォーマット

時間タイプはフォーマット出力できますが、Go でのフォーマットテンプレートは一般的な yyyy-mm-dd ではなく、Go の誕生時間をテンプレートとしています。Go が誕生したのは 2006 年 1 月 2 日午後 15 時 04 分です。

go
now := time.Now()

24 時間形式で出力

go
fmt.Println(now.Format("2006-01-02 15:04:05 Monday Jan"))
//2022-11-17 10:44:48 Thursday Nov

日付のみ出力

go
fmt.Println(now.Format("2006-01-02"))
//2022-11-17

12 時間形式の時間のみ出力

go
fmt.Println(now.Format("15:04:05 PM"))
//10:48:47 AM

時間の解析

一般的に、文字列時間を特定の形式で Go の時間構造体に変換するニーズがあります。次にやるべきことはまさにこれです。

go
func main() {
   location, err := time.LoadLocation("Asia/Shanghai")
   if err != nil {
      fmt.Println(err)
      return
   }

   inLocation, err := time.ParseInLocation("2006/01/02", "2012/10/12", location)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(inLocation.String())
}

最終出力

2012-10-12 00:00:00 +0800 CST

Timer

Timer はタイマーで、channel を外部に公開します。指定された時間になると、channel がメッセージを受信して閉じます。

go
func NewTimer(d Duration) *Timer

time.NewTimer() を通じて新しいタイマーを作成できます。

sh
func main() {
  timer := time.NewTimer(time.Second)
  defer timer.Stop()
  select {
  case t := <-timer.C:
    fmt.Println(t)
  }
}
2023-09-25 21:25:03.5696803 +0800 CST m=+1.007908001

timer を使用した後は、速やかに閉じる必要があります。

Ticker

Ticker は定时器で、timer との違いは、timer が一度きりであるのに対し、Ticker は定期的にトリガーされることです。

go
func NewTicker(d Duration) *Ticker

time.NewTicker() を通じて新しい定时器を作成できます。

go
func main() {
  ticker := time.NewTicker(time.Second)
  defer ticker.Stop()
  for i := 0; i < 3; i++ {
    select {
    case t := <-ticker.C:
      fmt.Println(t)
    }
  }
}
2023-09-25 21:29:20.4429256 +0800 CST m=+1.009508401
2023-09-25 21:29:21.4512075 +0800 CST m=+2.017790301
2023-09-25 21:29:22.4501592 +0800 CST m=+3.016742001

同様に、ticker を使用した後も速やかに閉じる必要があります。

sleep

time.Sleep() は現在のゴルーチンを一定時間サスペンド状態にします。この間、ゴルーチンはブロックされ、実行状態に回復するまで待機します。

go
func Sleep(d Duration)
sh
func main() {
  start := time.Now()
  fmt.Println(start)
  time.Sleep(time.Second * 2)
  end := time.Now()
  fmt.Println(end)
}
2023-09-25 21:36:35.7229057 +0800 CST m=+0.001627901
2023-09-25 21:36:37.7347742 +0800 CST m=+2.013496401

上記のプログラムは start を出力した後、2 秒間ブロックされ、その後 end を出力します。

Golang学习网由www.golangdev.cn整理维护