Menu
CoddyTech

特定の日時の作成

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)も使えます。locationパラメーターには通常、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. 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 ==="を表示し、その後に各出来事について次の行を表示します(最後の4行は先頭にスペースを2つ付けます)。
      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"

書式ルール:Loaded:の行では、time.Timeの値を%vでそのまま出力します。例:Loaded: Moon Landing - 1969-07-20 20:17:00 +0000 UTC。それ以外の日付と時刻はすべて手作業で組み立てます。月、日、時には先頭のゼロを付けず、分は常に2桁にします(%02d)。そのため、同じ出来事はMoon Landing: 1969-7-20 at 20:17 UTCのように表示され、分が0の場合は21:00と表示されます。[unix_seconds]はUnix()の値で、1970年より前の日付では負の値になります。年代の一覧では、年代を古い順に並べ、各年代の出来事名は入力順のまま、空白を入れずにカンマでつなぎます。

timeパッケージを使ってtime.Dateで特定の日付を作成し、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. 各表示オプション(時系列、詳細、概要、年別)を処理する
	// 7. 完了メッセージを表示する
	
}
quiz icon腕試し

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

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

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