特定の日時の作成
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 59/68。
time.Now() は現在の時刻を取得しますが、特定の年月日や時刻を扱う必要があることもよくあります。Go では、指定した任意の日時を表す time.Time オブジェクトを作成するための time.Date 関数が用意されています。
time.Date関数は、年、月、日、時、分、秒、ナノ秒、およびロケーションの順に、正確に7つのパラメータを受け取ります。基本的な構文は次のとおりです:
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() から取得したものとまったく同じように動作し、すべての同じ時間操作で使用できます。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単歴史上の特定の年月日と時間を表すために 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")
あなたのタスクは以下の通りです:
- 最初の入力をカンマで分割して、個々のイベントエントリを取得します。
- 各イベントエントリについて、コロンで分割してイベント名、年、月、日、時、分を抽出します。
- 数値文字列を整数に変換し、各イベントに対して
time.Dateを使用してtime.Timeオブジェクトを作成します(ロケーションパラメータにはtime.UTCを使用し、秒とナノ秒には 0 を使用します)。 - アプリケーションヘッダーを表示します:
"=== HISTORICAL TIMELINE APPLICATION ===" - イベント読み込みの確認を表示します:
"Loading historical events..." - 各イベントについて、次を表示します:
"Loaded: [event_name] - [complete_time_object]" - 2番目の入力をカンマで分割して、表示オプションを取得します。
- 各表示オプションを処理します:
"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]"の形式で表示します。- 完了メッセージを表示します:
"Historical timeline processing completed"
time.Date で特定のプロパティを持つ日付を作成するために time パッケージを、入力文字列を分割するために strings パッケージを、数値文字列を整数に変換するために strconv パッケージを、そしてフォーマットされた出力のために fmt パッケージを使用してください。time.Date は、年、月、日、時、分、秒、ナノ秒、ロケーションの正確な順序でパラメータを受け取ることに注意してください。時系列でソートするには、Before() メソッドを使用して time.Time オブジェクトを比較できます。このチャレンジは、Goの時刻機能を使用して特定の瞬間を作成し、歴史データを扱う方法を示しています。
チートシート
特定の日時の time.Time オブジェクトを作成するには、time.Date を使用します。
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)time.Date 関数は、次の順序で 8 つのパラメータを受け取ります。
- 年 (int)
- 月 (time.Month または int 1-12)
- 日 (int)
- 時 (int)
- 分 (int)
- 秒 (int)
- ナノ秒 (int)
- ロケーション (*time.Location)
可読性を高めるために time.March のような月の定数を使用するか、整数 (1-12) を使用します。一般的なロケーションは time.UTC や time.Local です。
自分で試してみよう
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. 完了メッセージを表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。