Menu
Coddy logo textTech

日時のフォーマット

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の時刻フォーマットは覚えやすく、かつ柔軟なものになっています。基準となる日付さえ覚えてしまえば、その構成要素を希望のパターンに並べるだけで、どのようなフォーマットでも作成できます。

quiz icon腕試し

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

quiz icon腕試し

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

quiz icon腕試し

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

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.Datetime.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独自のレイアウトベースのフォーマットシステムがどのように機能するかを示します。

チートシート

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: 以下にコードを記述してください
	// アプリケーションのヘッダーを表示する
	// 元の時間を表示する
	// 各フォーマットリクエストを処理し、フォーマットされた出力を表示する
	// 統計を計算して表示する
	// リファレンス情報を表示する
	// 完了メッセージを表示する
	
}
quiz icon腕試し

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

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