시간 연산
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 63번째.
이제 time.Time 객체와 time.Duration 값을 이해했으므로, 과거 또는 미래의 시간을 계산하기 위해 산술 연산을 수행할 수 있습니다. Go는 시간 산술을 위한 두 가지 필수 메서드인 Add 및 Sub를 제공합니다.
Add 메서드는 time.Duration을 인자로 받아 원래 시간에 해당 기간을 더한 새로운 time.Time을 반환합니다:
now := time.Now()
tomorrow := now.Add(24 * time.Hour)
fmt.Println(tomorrow)Sub 메서드는 두 가지 방식으로 작동합니다. 하나의 time.Time에서 다른 time.Time을 빼면, 두 시간 사이의 차이를 나타내는 time.Duration을 반환합니다:
start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // 2h0m0s를 반환합니다이러한 메서드들을 사용하면 마감 기한을 계산하거나, 경과 시간을 측정하거나, 미래의 이벤트를 예약하는 것이 간단해집니다. 원본 time.Time 객체는 변경되지 않은 상태로 유지됩니다. 불변(immutable) 연산을 선호하는 Go의 방식을 따라 두 메서드 모두 새로운 값을 반환합니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움시간 산술 연산을 사용하여 프로젝트 마일스톤과 마감일을 결정하는 프로젝트 마감일 계산기를 만드세요. 이 챌린지는 time.Time 객체의 Add 및 Sub 메서드를 사용하여 미래 날짜와 이벤트 간의 시간 차이를 계산하는 능력을 테스트합니다.
두 개의 입력을 받게 됩니다:
"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으로 설정합니다). - 두 번째 입력을 쉼표로 분리하여 개별 작업 항목을 가져옵니다.
- 각 작업 항목에 대해 콜론으로 분리하여 작업 이름, 기간 값, 기간 단위를 추출합니다.
- 기간 값을 정수로 변환하고 적절한 상수를 사용하여
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 메서드는 두 시간 사이의 차이를 나타내는 time.Duration을 반환한다는 점을 기억하세요. 이 챌린지는 시간 산술 연산을 사용하여 완전한 프로젝트 타임라인을 구축하는 방법을 보여줍니다.
치트 시트
Go는 시간 연산을 위한 두 가지 필수 메서드인 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: 아래에 코드를 작성하세요
// - 각 작업 항목을 처리하여 이름, 기간 값 및 단위를 추출합니다
// - 각 작업에 대한 기간 객체를 생성합니다
// - 작업 시작 및 종료 시간을 계산합니다
// - 가장 긴 작업과 가장 짧은 작업을 찾습니다
// - 프로젝트 통계를 계산합니다
// - 모든 필수 출력 섹션을 표시합니다
// 출력은 위의 구현에 의해 생성됩니다
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.