여느 프로그래밍 언어와 마찬가지로 Go에도 날짜/시간 포맷을 바꿔주는 패키지가 있습니다.
기본 내장 패키지인 time인데요,
예를 들어서, "2022-02-0314:08:09"는 우리가 흔히 쓰는 "YYYY-MM-DD hh:mm:ss" 형식입니다.
만약 "YYMMDD aa hh:mm"(220203 Thu 14:08)으로 바꾸려면 어떻게 해야 할까요?
package main
import (
"fmt"
"time"
)
func main() {
// YYYY-MM-DD hh:mm:ss
dateStr := "2022-02-03 14:08:07"
fmt.Println("Input date: ", dateStr)
dateTime, err := time.Parse("2006-01-02 15:04:05", dateStr)
if err != nil {
panic(err.Error())
}
fmt.Printf("[YYMMDD aa hh:mm] %v\n", dateTime.Format("060102 Mon 15:04"))
}
// Output
// Input date: 2022-02-03 14:08:07
// [YYMMDD aa hh:mm] 220203 Thu 14:08
먼저 날짜 문자열을 time.Time 타입으로 파싱 합니다.
이때 어떤 형식으로 되어있는지 레이아웃을 함께 넘겨줍니다.
dateTime, err := time.Parse("2006-01-02 15:04:05", dateStr)
그리고 원하는 포맷대로 출력을 해주는데요,
여기서도 마찬가지로 Format 메서드에 출력해주고 싶은 형식에 맞게 레이아웃을 넘겨줍니다.
fmt.Printf("[YYMMDD aa hh:mm] %v\n", dateTime.Format("060102 Mon 15:04"))
여기서 보시면 파싱 할 때 레이아웃을 "2006-01-02 15:04:05" 등과 같이 특정 날짜를 입력하도록 되어 있습니다.
(YYYY-MM-DD 같은 모양이 아니라)
왜 이런 모양일까요?
약간의 구글링을 해본 결과 이유는 다음과 같습니다.
각 날짜에 해당하는 값이 어느 필드(년, 월, 일 등)인지를 나타내고 있었습니다.
요일 - 월 - 일 - 시 - 분 - 초 - 연도 순서대로 0, 1, 2, 3,... 6을 부여한 것입니다.
아래 표를 보면 좀 더 이해하기 쉬울 겁니다.
Mon Jan 02 15:04:05 2006
0 1 2 3 4 5 6
따라서, 위의 예시를 기준으로 날짜를 파싱 할 때 레이아웃 값으로 이것저것 넣고 출력해 보면 다음과 같습니다.
Index | Input | Layout | Output |
0 (요일) | 2022-02-0314:08:09 | Mon / Monday | Wed / Wednesday |
1 (월) | 01 / 1 / Jan / January | 02 / 2 / Feb / February | |
2 (일) | 02 / 2 | 03 / 3 | |
3 (시) | 03 / 3 / 15 | 02 / 2 / 14 | |
4 (분) | 04 / 4 | 08 / 8 | |
5 (초) | 05 / 5 | 09 / 9 | |
6 (연도) | 06 / 2006 | 22 / 2022 |
처음에 봤을 땐 아무 날짜나 넣으면 되는 줄 알고 오늘 날짜로 넣었다가 에러가 왕왕 발생해서 좀 더 구글링 해보니 이유가 허탈해서 기록해 봅니다.
time 패키지에서 제공하는 템플릿 레이아웃들
const (
Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
DateTime = "2006-01-02 15:04:05"
DateOnly = "2006-01-02"
TimeOnly = "15:04:05"
)
내가 생각하는 가장 잘 만든 기계 No.1 (1) | 2024.04.29 |
---|---|
보드게임 추천 (5) | 2024.04.19 |
대발아 머리 좀 대바라 (7) | 2024.04.12 |