-
[Golang] 날짜 계산, 포맷 변경하기언어/Golang 2018. 12. 19. 21:30
Go언어에서 날짜계산이나 포맷변경은 극악입니다. 실제로 검색해보면 욕 한바가지 써놓은 것을 쉽게 볼 수 있습니다.
현재날짜 가져오기
기본 현재날짜, utc, unix 별로 가져오는 로직입니다.
package main import ( "fmt" "time" ) func main() { now := time.Now() nowUTC := time.Now().UTC() nowUNIX := time.Now().Unix() fmt.Println(now) fmt.Println(nowUTC) fmt.Println(nowUNIX) } // 결과 // 2018-12-19 20:42:08.219845 +0900 KST m=+0.000394187 // 2018-12-19 11:42:08.219846 +0000 UTC // 1545219728
날짜포맷 변경하기
여기서 욕이 제일 많이 볼 수 있고 많이 나옵니다. GO언어는 다른 언어와 달리 날짜 포맷형식이 이상합니다.
아래는 time 패키지에서 제공해주는 constant입니다.
const ( 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" )
아래는 time 패키지에서 제공하는 포맷형식을 사용하는 방법과 흔히 사용되는 yyyy-mm-dd hh:mm:ss 형식으로 포맷한 방법입니다.
package main import ( "fmt" "time" ) func main() { now := time.Now() custom := now.Format("2006-01-02 15:04:05") ansic := now.Format(time.ANSIC) fmt.Println(custom) fmt.Println(ansic) } // 결과 // 2018-12-19 20:41:21 // Wed Dec 19 20:41:21 2018
위 코드에서 2006-01-02 15:04:05 는 날짜를 나타내는 것이 아닌 yyyy-mm-dd hh:mm:ss 를 의미합니다. 해당 날짜는 아무 무작위로 한 것처럼 보이지만 뜻이 숨어 있습니다.
Mon Jan 2 15:04:05 -0700 MST 2006 0 1 2 3 4 5 6
위와 같이 각 순서라고 생각하시면 되지만 자주 사용되는 yyyy-mm-dd 를 사용안하고 복잡한 2006-01-02 와 같은 형식을 선택한 것은 의문입니다.
현재시간에서 시, 분 차감하기
import ( "time" ) func main() { now := time.Now() convMinutes, _ := time.ParseDuration("10m") convHours, _ := time.ParseDuration("1h") diffMinutes := now.Add(-convMinutes).Format("2006-01-02 15:04:05") diffHours := now.Add(-convHours).Format("2006-01-02 15:04:05") fmt.Println(now) fmt.Println(diffMinutes) fmt.Println(diffHours) } // 결과 // 2018-12-19 20:52:35.100418 +0900 KST m=+0.000385834 // 2018-12-19 20:42:35 // 2018-12-19 19:52:35
ParseeDuration() 함수를 호출하여 계산하고자 하는 시간을 Duration 타입으로 변경해야 합니다. 위의 1h, 10m 과 같이 시, 분, 초를 명시해야 값이 정확하게 전달됩니다. Go에서 제공하는 시간단위는 "ns", "us" (or "µs"), "ms", "s", "m", "h" 입니다.
현재시간을 가져온 다음 Add() 함수를 통해 위에서 구한 값을 빼줍니다. 만약 -부호가 없으면 현재시간에서 더한 시간이 반환됩니다.
현재날짜에서 년,월,일 차감하기
import ( "time" ) func main() { now := time.Now() convDays := 1 convMonths := 1 convYears := 1 diffDays := now.AddDate(0, 0, -convDays).Format("2006-01-02 15:04:05") diffMonths := now.AddDate(0, -convMonths, 0).Format("2006-01-02 15:04:05") diffYears := now.AddDate(-convYears, 0, 0).Format("2006-01-02 15:04:05") fmt.Println(now) fmt.Println(diffDays) fmt.Println(diffMonths) fmt.Println(diffYears) } // 결과 // 2018-12-19 21:00:23.506858 +0900 KST m=+0.000362007 // 2018-12-18 21:00:23 // 2018-11-19 21:00:23 // 2017-12-19 21:00:23
위의 시간계산과 유사한 형태입니다. 날짜는 AddDate() 함수를 호출하며 AddDate(year, month, day) 와 같이 값을 넣어 주면 됩니다.