時間の演算
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 63/68。
time.Time オブジェクトと time.Duration 値を理解したところで、過去や未来の時刻を計算するための算術演算を行うことができます。Goは、時間の算術演算のために2つの不可欠なメソッド、Add と Sub を提供しています。
Add メソッドは time.Duration を受け取り、元の時刻にその期間を加えた新しい time.Time を返します:
now := time.Now()
tomorrow := now.Add(24 * time.Hour)
fmt.Println(tomorrow)Subメソッドは2つの方法で動作します。あるtime.Timeから別のtime.Timeを引くと、それらの差を表すtime.Durationを返します:
start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // 2h0m0sを返しますこれらのメソッドを使用すると、締め切りの計算、経過時間の測定、または将来のイベントのスケジュール設定が簡単になります。元の time.Time オブジェクトは変更されません。Goのイミュータブル(不変)な操作を好む傾向に従い、どちらのメソッドも新しい値を返します。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単時間の算術演算を使用してプロジェクトのマイルストーンと期限を決定する、プロジェクト期限計算機を作成します。このチャレンジでは、time.Time オブジェクトの Add および Sub メソッドを使用して、将来の日付やイベント間の時間差を計算する能力をテストします。
2つの入力を受け取ります:
"year:month:day:hour:minute"形式のプロジェクト開始情報を含む文字列(例:"2024:1:15:9:0")"task1:duration_value:duration_unit,task2:duration_value:duration_unit"形式のタスク期間を含む文字列(例:"Planning:5:Day,Development:3:Week,Testing:10:Day")
あなたのタスクは以下の通りです:
- 最初の入力をコロンで分割して、年、月、日、時、分の値を抽出して解析する
- これらの文字列値を整数に変換し、
time.Dateを使用してプロジェクト開始時間を作成する(ロケーションにはtime.UTCを使用し、秒とナノ秒には 0 を使用する) - 2番目の入力をカンマで分割して、個々のタスクエントリを取得して解析する
- 各タスクエントリについて、コロンで分割してタスク名、期間の値、期間の単位を抽出する
- 期間の値を整数に変換し、適切な定数を使用して
time.Durationオブジェクトを作成する:"Day"の場合:24 * time.Hourを掛ける"Week"の場合:7 * 24 * time.Hourを掛ける"Hour"の場合:time.Hourを掛ける
- アプリケーションヘッダーを表示する:
"=== PROJECT DEADLINE CALCULATOR ===" - プロジェクト開始を表示する:
"Project start time: [start_time_object]" - 各タスクの期間を前のタスクの終了時間に追加して、タスクの期限を計算する(最初のタスクはプロジェクト開始時間に開始する):
- 各タスクについて、以下を表示する:
"Task: [task_name]"" Duration: [duration_object]"" Start: [task_start_time]"" End: [task_end_time]"(Addメソッドを使用して計算)
- プロジェクトのタイムラインを計算して表示する:
"=== PROJECT TIMELINE ===""Project start: [start_time_object]""Project end: [final_task_end_time]""Total project duration: [total_duration_object]"(プロジェクトの終了と開始の間でSubメソッドを使用して計算)
- タスク分析を表示する:
"=== TASK ANALYSIS ===""Number of tasks: [number_of_tasks]""Longest task: [longest_task_name] ([longest_duration_object])""Shortest task: [shortest_task_name] ([shortest_duration_object])"
- 連続するタスク間の時間を計算し、ギャップを表示する:
"=== TASK TRANSITIONS ==="- 連続するタスクの各ペアについて:
"[first_task_name] to [second_task_name]: [time_difference_object]"(タスクは連続しているため、0になるはずです)
- プロジェクト統計を表示する:
"=== PROJECT STATISTICS ===""Total working days: [total_duration_in_hours_divided_by_24]""Total working hours: [total_duration_in_hours]""Project spans [number_of_calendar_days] calendar days"
- 完了メッセージを表示する:
"Project timeline calculation completed successfully"
時間操作には time パッケージ、入力文字列の分割には strings パッケージ、文字列から整数への変換には strconv パッケージ、フォーマットされた出力には fmt パッケージを使用してください。Add メソッドは元の時間に期間を加えた新しい time.Time オブジェクトを返し、Sub メソッドは2つの時間の差を表す time.Duration を返すことを忘れないでください。このチャレンジは、時間の算術演算を使用して完全なプロジェクトタイムラインを構築する方法を示しています。
チートシート
Goは時間の演算に不可欠な2つのメソッド、AddとSubを提供しています。
Addメソッドはtime.Durationを引数に取り、新しいtime.Timeを返します。
now := time.Now()
tomorrow := now.Add(24 * time.Hour)Subメソッドはあるtime.Timeから別のtime.Timeを減算し、time.Durationを返します。
start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // 2h0m0sを返しますどちらのメソッドも、元のtime.Timeオブジェクトを変更せずに新しい値を返します。
自分で試してみよう
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// 入力を読み込む
var startInfo string
var taskInfo string
fmt.Scanln(&startInfo)
fmt.Scanln(&taskInfo)
// 開始時間の情報を解析する
startParts := strings.Split(startInfo, ":")
year, _ := strconv.Atoi(startParts[0])
month, _ := strconv.Atoi(startParts[1])
day, _ := strconv.Atoi(startParts[2])
hour, _ := strconv.Atoi(startParts[3])
minute, _ := strconv.Atoi(startParts[4])
// プロジェクトの開始時間を作成する
startTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// タスク情報を解析する
taskEntries := strings.Split(taskInfo, ",")
// TODO: 以下にコードを記述してください
// - 各タスクのエントリを処理して、名前、期間の値、および単位を抽出する
// - 各タスクの期間オブジェクトを作成する
// - タスクの開始時間と終了時間を計算する
// - 最長と最短のタスクを見つける
// - プロジェクトの統計を計算する
// - 必要なすべての出力セクションを表示する
// 出力は上記のあなたの実装によって生成されます
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。