상세 컨텐츠

본문 제목

[Go] "2006-01-02 15:04:05" 이 무슨 날이길래

오수성 수석부장

by Dann2 2024. 4. 19. 11:17

본문

728x90

 

여느 프로그래밍 언어와 마찬가지로 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

 


 

처음에 봤을 땐 아무 날짜나 넣으면 되는 줄 알고 오늘 날짜로 넣었다가 에러가 왕왕 발생해서 좀 더 구글링 해보니 이유가 허탈해서 기록해 봅니다.

 

Appendix

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

관련글 더보기