time パッケージは Go 言語で時間と日付を処理するための標準ライブラリです。時間、タイマー、持続時間、タイムゾーンなどを表現し操作するための多くの関数と型を提供します。
簡単な紹介#
一般的に使用される関数と型には以下が含まれます:
時間の表現と作成関数:Date ()、Now ()、Parse ()、Unix () などの関数は、異なる方法で時間オブジェクトを作成および取得するために使用されます。
時間のフォーマットと解析:Format () と Parse () 関数は、時間オブジェクトと文字列の相互変換に使用されます。特定のフォーマットテンプレートを定義することで、必要に応じて時間をフォーマットまたは解析できます。
時間の計算と比較:Add ()、AddDate ()、Sub () などの関数は、時間の加減算を行うために使用されます。たとえば、一定の時間量を追加したり、2 つの時間の間隔を計算したり、時間間の比較をサポートします。
持続時間の処理:Duration 型は、時間の間隔または持続時間を表すために使用され、ナノ秒、マイクロ秒、ミリ秒、秒、分、時間単位の時間を表現できます。また、持続時間を操作および変換するための一連のメソッドを提供します。
タイムゾーンの処理:Location 型は、タイムゾーン情報を表すために使用され、システムで定義されたタイムゾーンやカスタムタイムゾーンをロードできます。LoadLocation () 関数を使用してタイムゾーン情報をロードし、In () および UTC () メソッドを使用して時間を特定のタイムゾーンまたは UTC 時間に変換できます。
タイマー:Timer と Ticker 型は、定期的にイベントをトリガーするために使用されます。Timer は指定された時間後に単一のイベントをトリガーし、Ticker は固定の時間間隔で繰り返しイベントをトリガーします。
time パッケージには、時間操作やフォーマットに使用される他のいくつかの関数や、月や曜日を表す型なども含まれています。
Time パッケージの内容は多く、例を通じて time パッケージを学ぶのが良いと思います。以下に、Go の公式 time パッケージの下の型に従って、time パッケージで一般的に使用される関数の例を順に紹介します:
関数#
func After(d Duration) <-chan Time
func Sleep(d Duration)
func Tick(d Duration) <-chan Time
package main
import (
"fmt"
"time"
)
func main() {
// After 関数は、指定された時間後にチャネルが時間値を受け取るチャネルを返します
select {
case <-time.After(2 * time.Second):
fmt.Println("After")
}
// Sleep 関数はプログラムを指定された時間だけ停止させます
fmt.Println("Start")
time.Sleep(2 * time.Second)
fmt.Println("End")
// Tick 関数は、指定された時間間隔ごとにチャネルが時間値を受け取るチャネルを返します
ticker := time.Tick(1 * time.Second)
for tick := range ticker {
fmt.Println("Tick:", tick)
}
}
# 出力
After
Start
End
Tick: 2023-05-28 19:52:59.051953 +0800 CST m=+5.002580117
Tick: 2023-05-28 19:53:00.051654 +0800 CST m=+6.002592024
Tick: 2023-05-28 19:53:01.050407 +0800 CST m=+7.001636794
Tick: 2023-05-28 19:53:02.050139 +0800 CST m=+8.001642844
...
Duration#
Duration
は時間の間隔を表します。
func ParseDuration(s string) (Duration, error)
func Since(t Time) Duration
func Until(t Time) Duration
func (d Duration) Abs() Duration
func (d Duration) Hours() float64
func (d Duration) Microseconds() int64
func (d Duration) Milliseconds() int64
func (d Duration) Minutes() float64
func (d Duration) Nanoseconds() int64
func (d Duration) Round(m Duration) Duration
func (d Duration) Seconds() float64
func (d Duration) String() string
func (d Duration) Truncate(m Duration) Duration
package main
import (
"fmt"
"time"
)
func main() {
// ParseDuration 関数は文字列を Duration 型に解析します
d, _ := time.ParseDuration("1h30m")
fmt.Println("Parsed Duration:", d)
// Since 関数は現在の時間と指定された時間の間の時間差を Duration 型として返します
t := time.Date(2023, time.May, 7, 12, 0, 0, 0, time.UTC)
duration := time.Since(t)
fmt.Println("Time Since:", duration)
// Until 関数は指定された時間と現在の時間の間の時間差を Duration 型として返します
duration = time.Until(t)
fmt.Println("Time Until:", duration)
// Duration 型の一般的なメソッドの例
duration = 2 * time.Hour + 30 * time.Minute
fmt.Println("Hours:", duration.Hours())
fmt.Println("Minutes:", duration.Minutes())
fmt.Println("Seconds:", duration.Seconds())
fmt.Println("Milliseconds:", duration.Milliseconds())
fmt.Println("Microseconds:", duration.Microseconds())
fmt.Println("Nanoseconds:", duration.Nanoseconds())
// Duration 型の時間間隔をフォーマットして出力
fmt.Println("Duration String:", duration.String())
}
# 戻り値
Parsed Duration: 1h30m0s
Time Since: 504h21m51.536756s
Time Until: -504h21m51.536761s
Hours: 2.5
Minutes: 150
Seconds: 9000
Milliseconds: 9000000
Microseconds: 9000000000
Nanoseconds: 9000000000000
Duration String: 2h30m0s
Location#
Location
型は場所を表すもので、LoadLocation を使用して時間の場所を設定できます。
type Location:
func FixedZone(name string, offset int) *Location
func LoadLocation(name string) (*Location, error)
func LoadLocationFromTZData(name string, data []byte) (*Location, error)
func (l *Location) String() string
package main
import (
"fmt"
"time"
)
func main() {
// FixedZone 関数は固定オフセットのタイムゾーンを作成します
zone := time.FixedZone("CST", int(8*time.Hour.Seconds()))
fmt.Println("Fixed Zone:", zone)
// LoadLocation 関数は指定された名前のタイムゾーンをロードします
shanghai, err := time.LoadLocation("Asia/Shanghai") // UTC+08:00
if err != nil {
fmt.Println("Failed to load Asia/Shanghai location:", err)
return
}
timeInShanghai := time.Date(2023, 5, 28, 20, 0, 0, 0, shanghai)
fmt.Println("Time in Shanghai:", timeInShanghai)
newYork, err := time.LoadLocation("America/New_York")
if err != nil {
fmt.Println("Failed to load America/New_York location:", err)
return
}
timeInNewYork := timeInShanghai.In(newYork)
fmt.Println("Time in New York:", timeInNewYork)
timesAreEqual := timeInShanghai.Equal(timeInNewYork)
fmt.Println(timesAreEqual)
}
現在、timeInShanghai はニューヨークのタイムゾーンに変換されているため、timeInNewYork と同じ時間点を表します。Equal メソッドは true を返します。
Month#
Month 型
func (m Month) String() string
package main
import (
"fmt"
"time"
)
func main() {
// String メソッドは Month 型の文字列表現を返します
month := time.May
fmt.Println("Month String:", month.String())
}
ParseError#
func (e *ParseError) Error() string
package main
import (
"fmt"
"time"
)
func main() {
// Parse 関数は時間文字列を解析する際に ParseError 型のエラーを返すことがあります
_, err := time.Parse("2006-01-02", "invalid")
if err != nil {
parseError := err.(*time.ParseError)
fmt.Println("Parse Error:", parseError.Error())
}
}
Ticker#
Ticker は主にタイマーです。
func NewTicker(d Duration) *Ticker
func (t *Ticker) Reset(d Duration)
func (t *Ticker) Stop()
package main
import (
"fmt"
"time"
)
func main() {
// NewTicker 関数は定期的にトリガーされる Ticker オブジェクトを作成します
ticker := time.NewTicker(1 * time.Second)
go func() {
for tick := range ticker.C {
fmt.Println("Tick:", tick)
}
}()
// Ticker を停止します
time.Sleep(5 * time.Second)
ticker.Stop()
fmt.Println("Ticker Stopped")
}
Time 型#
Time 型は time パッケージで最も一般的に使用される型です。
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
func Now() Time
func Parse(layout, value string) (Time, error)
func ParseInLocation(layout, value string, loc *Location) (Time, error)
func Unix(sec int64, nsec int64) Time
func UnixMicro(usec int64) Time
func UnixMilli(msec int64) Time
func (t Time) Add(d Duration) Time
func (t Time) AddDate(years int, months int, days int) Time
func (t Time) After(u Time) bool
func (t Time) AppendFormat(b []byte, layout string) []byte
func (t Time) Before(u Time) bool
func (t Time) Clock() (hour, min, sec int)
func (t Time) Compare(u Time) int
func (t Time) Date() (year int, month Month, day int)
func (t Time) Day() int
func (t Time) Equal(u Time) bool
func (t Time) Format(layout string) string
func (t Time) GoString() string
func (t *Time) GobDecode(data []byte) error
func (t Time) GobEncode() ([]byte, error)
func (t Time) Hour() int
func (t Time) ISOWeek() (year, week int)
func (t Time) In(loc *Location) Time
func (t Time) IsDST() bool
func (t Time) IsZero() bool
func (t Time) Local() Time
func (t Time) Location() *Location
func (t Time) MarshalBinary() ([]byte, error)
func (t Time) MarshalJSON() ([]byte, error)
func (t Time) MarshalText() ([]byte, error)
func (t Time) Minute() int
func (t Time) Month() Month
func (t Time) Nanosecond() int
func (t Time) Round(d Duration) Time
func (t Time) Second() int
func (t Time) String() string
func (t Time) Sub(u Time) Duration
func (t Time) Truncate(d Duration) Time
func (t Time) UTC() Time
func (t Time) Unix() int64
func (t Time) UnixMicro() int64
func (t Time) UnixMilli() int64
func (t Time) UnixNano() int64
func (t *Time) UnmarshalBinary(data []byte) error
func (t *Time) UnmarshalJSON(data []byte) error
func (t *Time) UnmarshalText(data []byte) error
func (t Time) Weekday() Weekday
func (t Time) Year() int
func (t Time) YearDay() int
func (t Time) Zone() (name string, offset int)
func (t Time) ZoneBounds() (start, end Time)
package main
import (
"fmt"
"time"
)
func main() {
// Date 関数は指定された年、月、日、時、分、秒、ナノ秒、タイムゾーンに基づいて Time オブジェクトを作成します
date := time.Date(2023, time.May, 7, 12, 0, 0, 0, time.UTC)
fmt.Println("Date:", date)
// Now 関数は現在の時間の Time オブジェクトを返します
now := time.Now()
fmt.Println("Now:", now)
// Parse 関数は指定された時間文字列を Time オブジェクトに解析します
// ここで最初のパラメータは 2006-01-02 15:04:05 でなければなりません
parsedTime, _ := time.Parse("2006-01-02 15:04:05", "2023-05-07 12:00:00")
fmt.Println("Parsed Time:", parsedTime)
// Unix 関数は Unix タイムスタンプに基づいて Time オブジェクトを作成します
unixTime := time.Unix(1670140800, 0)
fmt.Println("Unix Time:", unixTime)
// Time 型の一般的なメソッドの例
fmt.Println("Year:", now.Year())
fmt.Println("Month:", now.Month())
fmt.Println("Day:", now.Day())
fmt.Println("Hour:", now.Hour())
fmt.Println("Minute:", now.Minute())
fmt.Println("Second:", now.Second())
fmt.Println("Nanosecond:", now.Nanosecond())
fmt.Println("Weekday:", now.Weekday())
// Time オブジェクトの文字列表現をフォーマットして出力
fmt.Println("Formatted Time:", now.Format("2006-01-02 15:04:05"))
// 時間の比較
otherTime := time.Date(2023, time.May, 7, 10, 0, 0, 0, time.UTC)
fmt.Println("Before:", now.Before(otherTime))
fmt.Println("After:", now.After(otherTime))
fmt.Println("Equal:", now.Equal(otherTime))
// 時間の計算
afterTime := now.Add(2 * time.Hour)
fmt.Println("After 2 Hours:", afterTime)
addedDate := now.AddDate(1, 0, 0) // 1年追加
fmt.Println("Added Date:", addedDate)
// タイムゾーン関連の操作
loc, _ := time.LoadLocation("America/New_York")
localTime := now.In(loc)
fmt.Println("Local Time:", localTime)
utcTime := localTime.UTC()
fmt.Println("UTC Time:", utcTime)
// タイムスタンプ
unix := now.Unix()
unixMicro := now.UnixMicro()
unixMilli := now.UnixMilli()
unixNano := now.UnixNano()
fmt.Println("Unix:", unix)
fmt.Println("Unix Micro:", unixMicro)
fmt.Println("Unix Milli:", unixMilli)
fmt.Println("Unix Nano:", unixNano)
}
// 出力
Date: 2023-05-07 12:00:00 +0000 UTC
Now: 2023-05-28 20:37:21.055316 +0800 CST m=+0.000293065
Parsed Time: 2023-05-07 12:00:00 +0000 UTC
Unix Time: 2022-12-04 16:00:00 +0800 CST
Year: 2023
Month: May
Day: 28
Hour: 20
Minute: 37
Second: 21
Nanosecond: 55316000
Weekday: Sunday
Formatted Time: 2023-05-28 20:37:21
Before: false
After: true
Equal: false
After 2 Hours: 2023-05-28 22:37:21.055316 +0800 CST m=+7200.000293065
Added Date: 2024-05-28 20:37:21.055316 +0800 CST
Local Time: 2023-05-28 08:37:21.055316 -0400 EDT
UTC Time: 2023-05-28 12:37:21.055316 +0000 UTC
Unix: 1685277441
Unix Micro: 1685277441055316
Unix Milli: 1685277441055
Unix Nano: 1685277441055316000
以上は time
パッケージで一般的に使用される関数と型の例です。必要に応じて参考にして使用できます。
まとめ#
time パッケージの一般的な操作のまとめ:
- 時間の作成と表現:Date ()、Now ()、Parse ()、Unix () などの関数を使用して時間オブジェクトを作成および取得します。
- 時間のフォーマットと解析:Format () と Parse () 関数を使用して時間オブジェクトと文字列を変換します。
- 時間の計算と比較:Add ()、AddDate ()、Sub () などの関数を使用して時間の加減算を行い、時間の先後を比較します。
- 持続時間の処理:Duration 型を使用して時間の間隔を表現し、時間単位の変換と操作を行います。
- タイムゾーンの処理:Location 型を使用してタイムゾーンを表現し、事前定義されたタイムゾーン情報をロードし、特定のタイムゾーンに時間を変換します。
- タイマーとタイマー:Timer と Ticker 型を使用して定期的にイベントをトリガーします。
以上は time パッケージの簡単なまとめです。時間と日付に関連する操作を処理するための重要なツールであり、実際のニーズに応じてその関数や型を使用できます。