Menu
CoddyTech

日時のフォーマット

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の時刻フォーマットは覚えやすく、柔軟に使えます。基準となる日付を覚えておけば、その構成要素を好きなパターンに並べるだけで、どんな形式でも作成できます。

challenge icon

チャレンジ

簡単

Go独自の基準日レイアウトシステムを使用してtime.Timeオブジェクトを整形する、複数形式の日付と時刻の表示システムを作成してください。この課題では、さまざまな日付と時刻の表現を作成するために、異なるレイアウトパターンでFormatメソッドを使用する能力を試します。

次の2つの入力が与えられます。

  • "year:month:day:hour:minute"の形式で日付情報を含む文字列(例:"2023:12:25:14:30")
  • "format1,format2,format3"の形式で、カンマ区切りの書式指定を含む文字列(例:"iso,american,european,time12,time24")

次の処理を行ってください。

  1. 最初の入力をコロンで分割し、年、月、日、時、分の値を取り出す
  2. strconvパッケージを使用して、これらの文字列の値を整数に変換する
  3. 解析した値を使ってtime.Dateでtime.Timeオブジェクトを作成する(場所にはtime.UTCを使用し、秒とナノ秒には0を指定する)
  4. アプリケーションのヘッダーを表示する:"=== DATE/TIME FORMATTER ==="
  5. 元の時刻を表示する:"Source time: [complete_time_object]"
  6. 2つ目の入力をカンマで分割し、書式指定を取得する
  7. 書式設定のヘッダーを表示する:"Formatted outputs:"
  8. 各書式指定に対して、適切なレイアウト文字列を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]"を表示する
  9. 統計情報を計算して表示する:
    • "=== FORMATTING SUMMARY ==="
    • "Total formats applied: [number_of_format_requests]"
    • "Date components: [year]-[month]-[day]"
    • "Time components: [hour]:[minute]"
  10. 参照情報を表示する:
    • "=== 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"
  11. 完了メッセージを表示する:"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: 以下にコードを記述する
	// アプリケーションのヘッダーを表示する
	// 元の時刻を表示する
	// 各書式指定のリクエストを処理し、書式を適用した結果を表示する
	// 統計情報を計算して表示する
	// 参照情報を表示する
	// 完了メッセージを表示する
	
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ