Menu
Coddy logo textTech

特定の日時の作成

CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 59/68。

time.Now() は現在の時刻を取得しますが、特定の年月日や時刻を扱う必要があることもよくあります。Go は、指定した任意の日時を表す time.Time オブジェクトを作成するための time.Date 関数を提供しています。

time.Date関数は、年、月、日、時、分、秒、ナノ秒、および場所の8つのパラメータをこの順序で受け取ります。基本的な構文は次のとおりです。

birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)

Goは、月の指定にtime.Marchのような定数を使用します。これにより、数値を使用するよりもコードの可読性が向上します。お好みに応じて、整数(1-12)を使用することもできます。ロケーションパラメータには、通常、UTC時間の場合はtime.UTCを、システムのローカルタイムゾーンの場合はtime.Localを使用します。

このアプローチにより、誕生日、締め切り、歴史的な日付など、特定の時点を完全に制御して作成することができます。生成された time.Time オブジェクトは、time.Now() から取得したものとまったく同じように動作し、すべての同じ時間操作で使用できます。

challenge icon

チャレンジ

簡単

歴史上の特定の年月日と時間を表すために time.Date を使用する、歴史イベントのタイムラインアプリケーションを作成してください。このチャレンジでは、正確な歴史的瞬間のために time.Time オブジェクトを作成し、整理された形式で表示する能力が試されます。

2つの入力を受け取ります:

  • "event1:year:month:day:hour:minute,event2:year:month:day:hour:minute" という形式の歴史イベントを含む文字列(例:"Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0"
  • "option1,option2,option3" という形式のカンマで区切られた表示オプションを含む文字列(例:"chronological,details,summary"

あなたのタスクは以下の通りです:

  1. 最初の入力をカンマで分割して、個々のイベントエントリを取得します。
  2. 各イベントエントリについて、コロンで分割してイベント名、年、月、日、時、分を抽出します。
  3. 数値文字列を整数に変換し、各イベントに対して time.Date を使用して time.Time オブジェクトを作成します(ロケーションパラメータには time.UTC を使用し、秒とナノ秒には 0 を使用します)。
  4. アプリケーションヘッダーを表示します:"=== HISTORICAL TIMELINE APPLICATION ==="
  5. イベント読み込みの確認を表示します:"Loading historical events..."
  6. 各イベントについて、次を表示します:"Loaded: [event_name] - [complete_time_object]"
  7. 2番目の入力をカンマで分割して、表示オプションを取得します。
  8. 各表示オプションを処理します:
    • "chronological" の場合:"=== CHRONOLOGICAL ORDER ===" を表示し、その後に日付順(古い順)にソートされたイベントを表示します。形式は "[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" です。
    • "details" の場合:"=== DETAILED INFORMATION ===" を表示し、その後に各イベントについて以下を表示します:
      • "Event: [event_name]"
      • " Date: [year]-[month]-[day]"
      • " Time: [hour]:[minute] UTC"
      • " Weekday: [weekday_name]"
      • " Unix timestamp: [unix_seconds]"
    • "summary" の場合:"=== TIMELINE SUMMARY ===" を表示し、その後に以下を表示します:
      • "Total events: [number_of_events]"
      • "Earliest event: [earliest_event_name] ([year])"
      • "Latest event: [latest_event_name] ([year])"
      • "Time span: [years_between_earliest_and_latest] years"
    • "years" の場合:"=== EVENTS BY DECADE ===" を表示し、その後に年代ごとにグループ化されたイベントを表示します。形式は "[decade]s: [comma_separated_event_names]" です。
  9. 完了メッセージを表示します:"Historical timeline processing completed"

time.Date で特定の時間を生成するために time パッケージを、入力文字列を分割するために strings パッケージを、数値文字列を整数に変換するために strconv パッケージを、そしてフォーマットされた出力のために fmt パッケージを使用してください。time.Date は、年、月、日、時、分、秒、ナノ秒、ロケーションの順序でパラメータを受け取ることに注意してください。時系列でソートするには、Before() メソッドを使用して time.Time オブジェクトを比較できます。このチャレンジは、Goの時間機能を使用して特定の瞬間を作成し、歴史データを扱う方法を示しています。

自分で試してみよう

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// スペースを適切に処理するために bufio.Scanner を使用して入力を読み込む
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	eventsInput := scanner.Text()
	
	scanner.Scan()
	optionsInput := scanner.Text()
	
	// 入力からイベントを解析する
	eventEntries := strings.Split(eventsInput, ",")
	
	// 入力から表示オプションを解析する
	displayOptions := strings.Split(optionsInput, ",")
	
	// TODO: 以下にコードを記述してください
	// 1. 各イベントのエントリを解析して、名前、年、月、日、時、分を抽出する
	// 2. アクセスする前に、parts スライスに十分な要素があるか確認することを忘れないようにする
	// 3. strconv.Atoi() を使用して文字列の数値を整数に変換する
	// 4. 各イベントに対して time.Date() を使用して time.Time オブジェクトを作成する
	// 5. アプリケーションのヘッダーと読み込みメッセージを表示する
	// 6. 各表示オプション(chronological、details、summary、years)を処理する
	// 7. 完了メッセージを表示する
	
}
quiz icon腕試し

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

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