시간 포맷팅
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 60번째.
time.Time 객체를 만들고 나면, 이를 읽기 쉬운 문자열 형식으로 변환해야 하는 경우가 많습니다. Go는 다른 프로그래밍 언어와는 다른 독특한 시간 형식 지정 방식을 사용합니다.
%Y-%m-%d 같은 형식 코드를 사용하는 대신, Go는 기준 날짜를 템플릿으로 사용합니다. 이 기준 날짜는 Mon Jan 2 15:04:05 MST 2006이며, 정확히 2006년 1월 2일 오후 3시 4분 5초(산악 표준시)를 나타냅니다.
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // 출력: 2023-10-26핵심은 원하는 패턴에 맞게 기준 날짜 구성 요소를 배치하는 것입니다. YYYY-MM-DD 형식에는 기준 날짜가 그 패턴에서 그렇게 보이므로 "2006-01-02"를 사용합니다. Jan 2, 2006와 같은 다른 형식에는 "Jan 2, 2006"을 사용하면 됩니다.
이 레이아웃 기반 접근 방식 덕분에 Go의 시간 형식 지정은 기억하기 쉽고 유연합니다. 기준 날짜를 기억해 두면, 원하는 패턴에 따라 구성 요소를 배치하는 것만으로 어떤 형식이든 만들 수 있습니다.
챌린지
쉬움Go의 고유한 기준 날짜 레이아웃 시스템을 사용해 time.Time 객체의 형식을 지정하는 여러 형식의 날짜 및 시간 표시 시스템을 만드세요. 이 과제에서는 다양한 날짜 및 시간 표현을 만들기 위해 서로 다른 레이아웃 패턴과 함께 Format 메서드를 사용하는 능력을 확인합니다.
두 가지 입력을 받습니다.
"year:month:day:hour:minute"형식의 날짜 정보가 포함된 문자열(예:"2023:12:25:14:30")"format1,format2,format3"형식으로 쉼표로 구분된 형식 요청이 포함된 문자열(예:"iso,american,european,time12,time24")
해야 할 일은 다음과 같습니다.
- 첫 번째 입력을 콜론으로 분할하여 연도, 월, 일, 시, 분 값을 추출합니다.
strconv패키지를 사용하여 이 문자열 값을 정수로 변환합니다.- 파싱한 값을 사용해
time.Date로time.Time객체를 만듭니다(위치에는time.UTC를 사용하고, 초와 나노초에는 0을 사용합니다). - 애플리케이션 헤더를 표시합니다:
"=== DATE/TIME FORMATTER ===" - 원본 시간을 표시합니다:
"Source time: [complete_time_object]" - 두 번째 입력을 쉼표로 분할하여 형식 요청을 가져옵니다.
- 형식 지정 헤더를 표시합니다:
"Formatted outputs:" - 각 형식 요청에 대해
Format메서드와 적절한 레이아웃 문자열을 사용합니다."iso"의 경우: 레이아웃"2006-01-02"를 사용하고"ISO format: [formatted_result]"를 표시합니다."american"의 경우: 레이아웃"01/02/2006"을 사용하고"American format: [formatted_result]"를 표시합니다."european"의 경우: 레이아웃"02/01/2006"을 사용하고"European format: [formatted_result]"를 표시합니다."long"의 경우: 레이아웃"January 2, 2006"을 사용하고"Long format: [formatted_result]"를 표시합니다."time12"의 경우: 레이아웃"3:04 PM"을 사용하고"12-hour time: [formatted_result]"를 표시합니다."time24"의 경우: 레이아웃"15:04"를 사용하고"24-hour time: [formatted_result]"를 표시합니다."full"의 경우: 레이아웃"Monday, January 2, 2006 at 3:04 PM"을 사용하고"Full format: [formatted_result]"를 표시합니다."compact"의 경우: 레이아웃"20060102"를 사용하고"Compact format: [formatted_result]"를 표시합니다.
- 통계를 계산하여 표시합니다.
"=== FORMATTING SUMMARY ===""Total formats applied: [number_of_format_requests]""Date components: [year]-[month]-[day]""Time components: [hour]:[minute]"
- 기준 정보를 표시합니다.
"=== REFERENCE DATE INFO ===""Go uses reference date: Mon Jan 2 15:04:05 MST 2006""This represents: January 2nd, 2006 at 3:04:05 PM""Layout patterns arrange these components as needed"
- 완료 메시지를 표시합니다:
"Date formatting completed using Go's layout system"
시간 작업에는 time 패키지를, 입력 문자열 분할에는 strings 패키지를, 문자열을 정수로 변환하는 데는 strconv 패키지를, 형식화된 출력에는 fmt 패키지를 사용하세요. Go의 시간 형식 지정에서는 기준 날짜 Mon Jan 2 15:04:05 MST 2006를 템플릿으로 사용하며, 원하는 패턴에 따라 이 구성 요소들을 배치한다는 점을 기억하세요. 이 과제에서는 하나의 시간 객체에 여러 가지 형식 패턴을 적용하여 Go의 고유한 레이아웃 기반 형식 지정 시스템이 작동하는 방식을 살펴봅니다.
직접 해보기
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// 입력 읽기
var dateInput string
var formatInput string
fmt.Scanln(&dateInput)
fmt.Scanln(&formatInput)
// 콜론을 기준으로 분리하여 날짜 구성 요소 파싱하기
dateComponents := strings.Split(dateInput, ":")
// 문자열 구성 요소를 정수로 변환하기
year, _ := strconv.Atoi(dateComponents[0])
month, _ := strconv.Atoi(dateComponents[1])
day, _ := strconv.Atoi(dateComponents[2])
hour, _ := strconv.Atoi(dateComponents[3])
minute, _ := strconv.Atoi(dateComponents[4])
// time.Time 객체 생성하기
sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// 형식 요청 파싱하기
formatRequests := strings.Split(formatInput, ",")
// TODO: 아래에 코드 작성하기
// 애플리케이션 헤더 표시하기
// 원본 시간 표시하기
// 각 형식 요청을 처리하고 형식에 맞춘 출력 표시하기
// 통계 계산 및 표시하기
// 참고 정보 표시하기
// 완료 메시지 표시하기
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Go 컴파일러