日時のフォーマット
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独自のレイアウトベースのフォーマットシステムがどのように機能するかを示します。
チートシート
Goは時刻のフォーマットに、ユニークな基準日時(reference date)のアプローチを使用します:Mon Jan 2 15:04:05 MST 2006
time.Timeオブジェクトをフォーマットするには、基準日時に基づいたレイアウトパターンを指定してFormatメソッドを使用します:
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // 出力: 2023-10-26一般的なレイアウトパターン:
"2006-01-02"- ISO形式 (YYYY-MM-DD)"01/02/2006"- アメリカ形式 (MM/DD/YYYY)"02/01/2006"- ヨーロッパ形式 (DD/MM/YYYY)"January 2, 2006"- 長い形式"3:04 PM"- 12時間制"15:04"- 24時間制"Monday, January 2, 2006 at 3:04 PM"- 完全な形式"20060102"- コンパクトな形式
重要なのは、基準日時の構成要素を希望のパターンに配置することです。
自分で試してみよう
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: 以下にコードを記述してください
// アプリケーションのヘッダーを表示する
// 元の時間を表示する
// 各フォーマットリクエストを処理し、フォーマットされた出力を表示する
// 統計を計算して表示する
// リファレンス情報を表示する
// 完了メッセージを表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。