日時のフォーマット
CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 60/68。
time.Time オブジェクトを取得したら、読みやすい文字列形式に変換する必要がよくあります。Goでは、他のプログラミング言語とは異なる独自の方法で時刻をフォーマットします。
%Y-%m-%dのような書式コードを使う代わりに、Goではテンプレートとして基準日付を使います。この基準日付はMon Jan 2 15:04:05 MST 2006で、2006年1月2日午後3時4分5秒(山岳部標準時)という正確な時刻を表しています。
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // 出力: 2023-10-26重要なポイントは、基準日の各要素を希望するパターンに並べることです。YYYY-MM-DD形式の場合、そのパターンでの基準日の表記に合わせて"2006-01-02"を使います。Jan 2, 2006のような別の形式では、"Jan 2, 2006"を使います。
このレイアウトベースのアプローチにより、Goの時刻フォーマットは覚えやすく、柔軟に使えます。基準となる日付を覚えておけば、その構成要素を好きなパターンに並べるだけで、どんな形式でも作成できます。
チャレンジ
簡単Go独自の基準日レイアウトシステムを使用してtime.Timeオブジェクトを整形する、複数形式の日付と時刻の表示システムを作成してください。この課題では、さまざまな日付と時刻の表現を作成するために、異なるレイアウトパターンでFormatメソッドを使用する能力を試します。
次の2つの入力が与えられます。
"year:month:day:hour:minute"の形式で日付情報を含む文字列(例:"2023:12:25:14:30")"format1,format2,format3"の形式で、カンマ区切りの書式指定を含む文字列(例:"iso,american,european,time12,time24")
次の処理を行ってください。
- 最初の入力をコロンで分割し、年、月、日、時、分の値を取り出す
strconvパッケージを使用して、これらの文字列の値を整数に変換する- 解析した値を使って
time.Dateでtime.Timeオブジェクトを作成する(場所にはtime.UTCを使用し、秒とナノ秒には0を指定する) - アプリケーションのヘッダーを表示する:
"=== DATE/TIME FORMATTER ===" - 元の時刻を表示する:
"Source time: [complete_time_object]" - 2つ目の入力をカンマで分割し、書式指定を取得する
- 書式設定のヘッダーを表示する:
"Formatted outputs:" - 各書式指定に対して、適切なレイアウト文字列を
Formatメソッドで使用する:"iso"の場合:レイアウトに"2006-01-02"を使用し、"ISO format: [formatted_result]"を表示する"american"の場合:レイアウトに"01/02/2006"を使用し、"American format: [formatted_result]"を表示する"european"の場合:レイアウトに"02/01/2006"を使用し、"European format: [formatted_result]"を表示する"long"の場合:レイアウトに"January 2, 2006"を使用し、"Long format: [formatted_result]"を表示する"time12"の場合:レイアウトに"3:04 PM"を使用し、"12-hour time: [formatted_result]"を表示する"time24"の場合:レイアウトに"15:04"を使用し、"24-hour time: [formatted_result]"を表示する"full"の場合:レイアウトに"Monday, January 2, 2006 at 3:04 PM"を使用し、"Full format: [formatted_result]"を表示する"compact"の場合:レイアウトに"20060102"を使用し、"Compact format: [formatted_result]"を表示する
- 統計情報を計算して表示する:
"=== FORMATTING SUMMARY ===""Total formats applied: [number_of_format_requests]""Date components: [year]-[month]-[day]""Time components: [hour]:[minute]"
- 参照情報を表示する:
"=== REFERENCE DATE INFO ===""Go uses reference date: Mon Jan 2 15:04:05 MST 2006""This represents: January 2nd, 2006 at 3:04:05 PM""Layout patterns arrange these components as needed"
- 完了メッセージを表示する:
"Date formatting completed using Go's layout system"
時刻の操作にはtimeパッケージを、入力文字列の分割にはstringsパッケージを、文字列から整数への変換にはstrconvパッケージを、書式付き出力にはfmtパッケージを使用してください。Goの時刻の書式設定では、基準日Mon Jan 2 15:04:05 MST 2006をテンプレートとして使用し、必要なパターンに合わせてこれらの要素を並べます。この課題では、同じ時刻オブジェクトに複数の異なる書式パターンを適用することで、Go独自のレイアウトベースの書式設定システムの仕組みを学びます。
自分で試してみよう
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// 入力を読み取る
var dateInput string
var formatInput string
fmt.Scanln(&dateInput)
fmt.Scanln(&formatInput)
// コロンで分割して日付の各要素を解析する
dateComponents := strings.Split(dateInput, ":")
// 文字列の各要素を整数に変換する
year, _ := strconv.Atoi(dateComponents[0])
month, _ := strconv.Atoi(dateComponents[1])
day, _ := strconv.Atoi(dateComponents[2])
hour, _ := strconv.Atoi(dateComponents[3])
minute, _ := strconv.Atoi(dateComponents[4])
// time.Timeオブジェクトを作成する
sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// 書式指定のリクエストを解析する
formatRequests := strings.Split(formatInput, ",")
// TODO: 以下にコードを記述する
// アプリケーションのヘッダーを表示する
// 元の時刻を表示する
// 各書式指定のリクエストを処理し、書式を適用した結果を表示する
// 統計情報を計算して表示する
// 参照情報を表示する
// 完了メッセージを表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ