Go에서 Time은 특정 시점을 나타내는 타입이에요.
날짜와 시간 정보는 메서드를 통해 접근하고, 비교하고, 조작할 수 있어요. 그런데 time 패키지 자체에서 호출하는 함수들도 있어요.
현재 날짜와 시간은 time.Now 함수로 가져올 수 있어요.
time.Parse 함수는 문자열을 Time 타입의 값으로 파싱해요.
Go는 파싱할 때 기대하는 레이아웃을 정의하는 특별한 방식이 있어요.
이 특별한 타임스탬프에 있는 값들을 사용해서 레이아웃 예시를 작성하면 돼요:
Mon Jan 2 15:04:05 -0700 MST 2006.
예를 들어:
import "time"
func parseTime() time.Time {
date := "Tue, 09/22/1995, 13:00"
layout := "Mon, 01/02/2006, 15:04"
t, err := time.Parse(layout,date) // time.Time, error
}
// => 1995-09-22 13:00:00 +0000 UTC
Time.Format() 메서드는 시간을 문자열로 표현한 값을 반환해요.
Parse 함수와 마찬가지로, 대상 레이아웃도 이 특별한 타임스탬프의 값들을 사용한 예시로 정의해요.
예를 들어:
import (
"fmt"
"time"
)
func main() {
t := time.Date(1995,time.September,22,13,0,0,0,time.UTC)
formattedTime := t.Format("Mon, 01/02/2006, 15:04") // string
fmt.Println(formattedTime)
}
// => Fri, 09/22/1995, 13:00
사용자 정의 레이아웃을 만들려면 이런 옵션들을 조합해서 사용해요. Go에는 미리 정의된 날짜 및 타임스탬프 형식 상수도 있어요.
| 시간 | 옵션 |
|---|---|
| 연도 | 2006 ; 06 |
| 월 | Jan ; January ; 01 ; 1 |
| 일 | 02 ; 2 ; _2 (앞에 0이 붙는 경우) |
| 요일 | Mon ; Monday |
| 시 | 15 ( 24시간 형식 ) ; 3 ; 03 (오전 또는 오후) |
| 분 | 04 ; 4 |
| 초 | 05 ; 5 |
| 오전/오후 표시 | PM |
| 연중 일수 | 002 ; __2 |
time.Time 타입에는 특정 시간에 접근하는 다양한 메서드가 있어요. 예를 들어 시는 Time.Hour(), 월은 Time.Month() 메서드로 가져올 수 있어요.
이게 어떻게 동작하는지 더 알고 싶다면 공식 문서를 확인해 봐요.
time 패키지에는 경과한 시간을 나타내는 Duration 타입도 있고, 위치와 시간대, 타이머, 그 밖의 관련 기능도 지원해요. 이런 내용은 다른 개념에서 다뤄요.
이 연습 문제에서는 2012년 9월 15일에 문을 연 미용실의 예약 스케줄러를 만들어 봐요.
다섯 개의 과제가 있는데, 모두 예약 날짜와 관련되어 있어요.
예약 날짜의 텍스트 표현을 해당하는 time.Time 형식으로 파싱하는 Schedule 함수를 구현해요:
Schedule("7/25/2019 13:45:00")
// => 2019-07-25 13:45:00 +0000 UTC
예약 날짜를 받아서 그 예약이 과거에 있었는지 확인하는 HasPassed 함수를 구현해요:
HasPassed("July 25, 2019 13:45:00")
// => true
예약 날짜를 받아서 예약이 오후(12:00 이상 18:00 미만)인지 확인하는 IsAfternoonAppointment 함수를 구현해요:
IsAfternoonAppointment("Thursday, July 25, 2019 13:45:00")
// => true
예약 날짜를 받아서 그 날짜와 시간에 대한 설명을 반환하는 Description 함수를 구현해요:
Description("7/25/2019 13:45:00")
// => "You have an appointment on Thursday, July 25, 2019, at 13:45."
UTC 기준으로 올해 미용실 개업 기념일 날짜를 반환하는 AnniversaryDate 함수를 구현해요.
올해가 2020년이라고 가정해요:
AnniversaryDate()
// => 2020-09-15 00:00:00 +0000 UTC
참고: 반환 값은 time.Time이고, 하루 중 시간은 중요하지 않아요.
Exercism에 가입하고 Go 트랙을 개념 34개연습 문제 165개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.