특정 시간 생성하기
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 59번째.
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()로 얻은 객체와 정확히 동일하게 작동하며, 같은 모든 시간 연산에 사용할 수 있습니다.
챌린지
쉬움time.Date를 사용하여 역사 속 특정 날짜와 시간을 나타내는 역사적 사건 타임라인 애플리케이션을 만드세요. 이 과제에서는 정확한 역사적 순간을 나타내는 time.Time 객체를 만들고 이를 정리된 형식으로 표시하는 능력을 평가합니다.
다음 두 가지 입력을 받습니다.
"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]" - 두 번째 입력을 쉼표로 분할하여 표시 옵션을 가져옵니다.
- 각 표시 옵션을 처리합니다.
"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 ==="를 표시한 다음 사건을 10년 단위로 그룹화하여"[decade]s: [comma_separated_event_names]"형식으로 표시합니다.- 완료 메시지를 표시합니다:
"Historical timeline processing completed"
서식 규칙: Loaded: 줄은 time.Time 값을 %v를 사용해 그대로 출력합니다. 예: Loaded: Moon Landing - 1969-07-20 20:17:00 +0000 UTC. 그 밖의 모든 날짜와 시간은 직접 구성합니다. 월, 일, 시에는 앞에 0을 붙이지 않으며 분은 항상 두 자리로 표시합니다(%02d). 따라서 같은 사건은 Moon Landing: 1969-7-20 at 20:17 UTC로 출력되고, 분이 0이면 21:00으로 출력됩니다. [unix_seconds]는 Unix() 값이며, 1970년 이전 날짜에서는 음수입니다. 10년 단위 목록은 가장 이른 시기부터 가장 늦은 시기 순으로 표시하고, 각 시기의 사건 이름은 공백 없이 쉼표로 연결하며 입력 순서를 유지합니다.
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. 완료 메시지를 표시합니다
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Go 컴파일러