Goで日付と時刻の扱いをマスターする:実践ガイド

4月 21, 2025

日付と時刻を扱うことは、APIの構築、タスクのスケジューリング、イベントのロギングなど、プログラミングの基本的な側面です。Goでは 時間 パッケージは、日付、時間、タイムゾーン、期間を管理するための堅牢で直感的な方法を提供します。このガイドでは 時間 パッケージの基本的な操作から高度なユースケースまで、実践的な例とベストプラクティスを紹介します。最後には、Goでの日付と時刻の扱いをマスターする自信がつくでしょう。

日時の扱いが重要な理由

日付と時刻は多くのアプリケーションで重要である:

  • API タイムスタンプをフォーマットし、解析する必要がある。
  • スケジューラー タスクの正確なタイミングに依存している。
  • 過去ログ イベントを追跡するためにタイムスタンプを使用する。
  • ユーザーインターフェース ローカライズされたフォーマットで日付を表示します。

ゴーズ 時間 パッケージはシンプルかつ強力に設計されており、これらのシナリオを効率的に処理するツールを提供します。サードパーティのライブラリに大きく依存するいくつかの言語とは異なり、Goの標準ライブラリが必要なすべてのものであることがよくあります。さっそく使ってみよう!

タイムパッケージで始める

時間 パッケージはGoの標準ライブラリーの一部なので、外部依存は必要ない。使用するには、パッケージをインポートしてください:

行く
インポート "time"

のコアタイプ。 時間 パッケージである:

  • 時間:特定の時点を表す(例:"2025-04-21 10:30:00")。
  • 時間:時間の長さを表す(例:5時間30秒)。
  • 時間.場所:タイムゾーンを表す(例:"America/New_York")。

基本的な操作から始めよう。

現在の日付と時刻の操作

現在の日付と時刻を取得するには time.Now():
行く
パッケージメイン

インポート (
    "fmt"
    時間
)

func main() {
    now := time.Now()
    fmt.Println("Current time:", now)
}

これは次のような出力だ:

現在時刻: 2025-04-21 10:30:45.123456789 +0000 UTC

時間 値には、日付、時刻、タイムゾーン(デフォルトではUTC)が含まれます。年、月、時間などの個々のコンポーネントを抽出することができます:

行く
年 := now.Year() // 例:2025年
month := now.Month() // 例:4月
day := now.Day() // 例:21日
hour := now.Hour() // 例:10
minute := now.Minute() // 例:30
second := now.Second() // 例:45

fmt.Printf("Date: %d-%02d-%02d\n", year, month, day)
fmt.Printf("Time: %02d:%02d:%02d\n", hour, minute, second)

出力:

日付: 2025-04-21
時間:10:30:45

これは、タイムスタンプの特定の部分を記録したり表示したりするのに便利です。

日付の解析と書式設定

日付の解析とフォーマットに対するGoのアプローチはユニークだ。のような書式指定子を使うのではなく %Y または %m (他の言語では一般的)、Goは参照時間を使う: 2006年1月2日 15時04分05秒 (としてフォーマットされる 2006-01-02 15:04:05).この日付が選ばれたのは、覚えやすく、囲碁の誕生年(2006年)と一致しているからだ。

日付の書式設定

をフォーマットする。 時間 値を文字列に変換するには time.Format() を、基準時刻に基づいたレイアウト文字列で返します:

行く
now := time.Now()
formatted := now.Format("2006-01-02 15:04:05")
fmt.Println("Formatted time:", formatted)

出力:

フォーマット時間:2025-04-21 10:30:45

フォーマットをカスタマイズすることができます。例えば

行く
fmt.Println(now.Format("Mon, Jan 2, 2006"))// 例:2025年4月21日(月
fmt.Println(now.Format("3:04 PM"))           // 例:午前10時30分

日付の解析

文字列を 時間 値を使用する。 time.Parse():

行く
dateStr := "2025-04-21 10:30:00"
レイアウト := "2006-01-02 15:04:05"
t, err := time.Parse(layout, dateStr)
もしerr != nil {なら
    fmt.Println("Error parsing time:", err)
    戻る
}
fmt.Println("Parsed time:", t)

出力:

解析時間:2025-04-21 10:30:00 +0000 UTC

文字列がレイアウトと一致しない場合、 time.Parse() はエラーを返すので、常にエラーをチェックしてください。

便利なように、Goは次のような定義済みのレイアウトを提供します。 タイム 標準フォーマットの場合:

行く
t, err = time.Parse(time.RFC3339, "2025-04-21T10:30:00Z")
fmt.Println("Parsed RFC3339 time:", t)

日付と時刻の操作

時間 パッケージを使うと、日付や時刻の算術演算が簡単にできる。

時間の足し算と引き算

用途 追加() を追加する。 時間 への 時間:

行く
now := time.Now()
future := now.Add(24 * time.Hour) // 1日足す
past := now.Add(-2 * time.Hour) // 2時間引く

fmt.Println("Now:", now)
fmt.Println("Future:", future)
fmt.Println("過去:", 過去)
時間 のような定数を使用して作成できます。 時間, 時間.分あるいは 時間.秒.デュレーションを解析することもできる:

行く
duration, _ := time.ParseDuration("1h30m")
future = now.Add(期間)
fmt.Println("1時間30分後:", future)

時差の計算

2つの時間の差を求めるには サブ():

行く
start := time.Now()
time.Sleep(2 * time.Second) // いくつかの作業をシミュレートする
end := time.Now()

elapsed := end.Sub(start)
fmt.Printf("経過時間:%v\n", elapsed)

出力:

経過時間:2.001234567秒

日付の比較

比較できる 時間 を使用しています。 前(), 後()、 そして イコール():

行く
t1 := time.Now()
t2 := t1.Add(1 * time.Hour)

fmt.Println("t1 before t2?", t1.Before(t2))// 真
fmt.Println("t2 after t1?", t2.After(t1)) // true
fmt.Println("t1 equal t2?", t1.Equal(t2)) // false  // false

タイムゾーンへの対応

タイムゾーンは厄介なものですが、囲碁は次のように単純化します。 時間.場所.

タイムゾーンの読み込み

特定のタイムゾーンで作業するには time.LoadLocation():

行く
loc, err := time.LoadLocation("America/New_York")
if err != nil { もしerr !
fmt.Println("Error loading location:", err)
リターン
}
nyTime := time.Now().In(loc)
fmt.Println("New York time:", nyTime)

time.LoadLocation() 関数は、IANAタイムゾーン・データベース(例:"America/New_York"、"Asia/Tokyo")を使用します。場所を指定しない場合、GoはデフォルトでUTCを使用します。

タイムゾーン間の変換

時刻を別のタイムゾーンに変換するには イン():

行く
utcTime := time.Now()
loc, _ = time.LoadLocation("アジア/東京")
tokyoTime := utcTime.In(loc)
fmt.Println("UTC time:", utcTime)
fmt.Println("Tokyo time:", tokyoTime)

UTCと現地時間の使用

UTCの場合はUTC()を使う:

行く
utc := time.Now().UTC()
fmt.Println("UTC time:", utc)
システムのローカル・タイム・ゾーンには、Local()を使用する:
次のようにします。
local := time.Now().Local()
fmt.Println("Local time:", local)

実践例

実際のシナリオを探ってみよう。

タスクのスケジューリング

タスクを一定間隔で実行するには、time.Tick()を使う:

行く
ticker := time.Tick(2 * time.Second)
for t := tickerの範囲 {.
    fmt.Println("Tick at", t)
}
1回だけ遅延させる場合は、time.After()を使用します:
行く
セレクト
case <-time.After(3 * time.Second):
    fmt.Println("3 秒後...")
}

年齢の計算

生年月日から年齢を計算する:

行く
birthStr := "1990-05-15"
birthTime, _ := time.Parse("2006-01-02", birthStr)
now := time.Now()
age := now.Year() - birthTime.Year()
if now.YearDay() < birthTime.YearDay() { もしnow.YearDay() < birthTime.YearDay()なら
age-- // 誕生日が今年でない場合は調整する
}
fmt.Printf("Age: %dTn", age)

APIのフォーマット

APIはしばしばISO 8601 (RFC3339)のタイムスタンプを使用する:

行く
now := time.Now()
apiTime := now.Format(time.RFC3339)
fmt.Println("API timestamp:", apiTime)

よくある落とし穴とベストプラクティス

落とし穴
  • 誤ったレイアウト: のレイアウトのミスマッチ time.Parse() または time.Format() はよくあるエラーだ。常に基準時間(2006-01-02 15:04:05).
  • タイムゾーンの想定: すべての時間がUTCまたはローカルタイムであると仮定すると、バグにつながる可能性があります。タイムゾーンは常に明示的に指定してください。
  • エラーを無視する などの機能がある。 time.Parse() そして time.LoadLocation() エラーを返す。常にエラーを処理すること。
ベストプラクティス
  • 保管にはUTCを使う: タイムゾーンの混乱を避けるため、タイムスタンプはUTCで保存します。
  • 入力を検証する: ユーザーから提供された日付を解析する場合は、フォーマットを検証し、エラーを優雅に処理します。
  • 定義済みのレイアウトを活用する: のような定数を使用する。 タイム 標準フォーマットの場合。
  • プロフィールのパフォーマンス を頻繁に呼び出すことは避けてください。 time.Now() タイトなループでは、比較的高価になる可能性があるからだ。

サードパーティライブラリ

一方 時間 のようなライブラリで十分です。 github.com/jinzhu/now を使えば、複雑な操作(例えば、週の始まりを見つけるなど)を簡略化できる。標準ライブラリで十分な場合が多いので、使用は控えめに。

結論

ゴーズ 時間 パッケージは、日付、時刻、タイムゾーンを扱うための強力なツールです。書式設定や解析から演算やスケジューリングまで、堅牢な時間管理に必要なすべてを提供します。核となる概念を理解することで-時間.時間, 時間.期間、 そして 時間.場所そしてベストプラクティスに従うことで、最も複雑な日付と時刻のシナリオでも自信を持って扱うことができます。

本ガイドの例を使って実験し、以下のことを探求してください。 囲碁公式ドキュメントそして、独自の時間ベースの機能を構築してみてください。タスクのスケジューリング、イベントのログ、APIレスポンスのフォーマットなど、Goでの日付と時刻の取り扱いをマスターすれば、アプリケーションの信頼性と使いやすさが向上します。高性能でスケーラブルなアプリケーションを カーマテックの エキスパート Golang開発サービス 現代のビジネスニーズに合わせた

 

 

 

 

 

 

jaJapanese