特定の日時の作成
CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 59/68。
time.Now()は現在の瞬間を示しますが、特定の日付や時刻を扱う必要があることもよくあります。Goには、指定した任意の日付と時刻を表すtime.Timeオブジェクトを作成するためのtime.Date関数が用意されています。
time.Date関数は、year、month、day、hour、minute、second、nanosecond、locationの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() から得られるものとまったく同じように機能し、同じすべての時間操作で使用できます。
チャレンジ
簡単time.Dateを使用して、歴史上の特定の日付と時刻を表す historical event timeline application を作成してください。このチャレンジでは、歴史上の正確な時点を表すtime.Timeオブジェクトを作成し、整理された形式で表示する能力をテストします。
2つの入力が与えられます。
- 次の形式の historical events を含む文字列
"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") - 次の形式で、カンマ区切りの display options を含む文字列
"option1,option2,option3"(例:"chronological,details,summary")
タスクは次のとおりです。
- 最初の入力をカンマで分割し、個々の event entries を取得する
- 各 event entry をコロンで分割し、event name、year、month、day、hour、minute を抽出する
- 数値文字列を整数に変換し、各 event について
time.Dateを使用してtime.Timeオブジェクトを作成する(location パラメータにはtime.UTCを使用し、seconds と nanoseconds には 0 を指定する) - application header を表示する:
"=== HISTORICAL TIMELINE APPLICATION ===" - events loading confirmation を表示する:
"Loading historical events..." - 各 event について、次を表示する:
"Loaded: [event_name] - [complete_time_object]" - 2番目の入力をカンマで分割し、display options を取得する
- 各 display option を処理する。
"chronological"の場合:"=== CHRONOLOGICAL ORDER ==="を表示し、その後に date 順(earliest first)でソートした events を、"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC"の形式で表示する"details"の場合:"=== DETAILED INFORMATION ==="を表示し、その後に各 event について次を表示する。"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 ごとにグループ化した events を、"[decade]s: [comma_separated_event_names]"の形式で表示する- completion message を表示する:
"Historical timeline processing completed"
time package を使用してtime.Dateで specific dates を作成し、strings package を使用して input strings を分割し、strconv package を使用して string numbers を integers に変換し、fmt package を使用して formatted output を生成してください。time.Dateのパラメータの正確な順序は、year、month、day、hour、minute、second、nanosecond、location であることに注意してください。chronological にソートするには、Before() method を使用してtime.Time objects を比較できます。このチャレンジでは、Go の time functionality を使用して specific moments in time を作成し、historical data を扱う方法を説明します。
自分で試してみよう
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. 各イベントエントリを解析して name、year、month、day、hour、minute を抽出する
// 2. アクセスする前に parts スライスに十分な要素があるか確認することを忘れないでください
// 3. strconv.Atoi() を使用して文字列の数値を整数に変換する
// 4. 各イベントに対して time.Date() を使用して time.Time オブジェクトを作成する
// 5. アプリケーションのヘッダーと読み込みメッセージを表示する
// 6. Process each display option (chronological, details, summary, years)
// 7. 完了メッセージを表示する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ