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) 와 같이 값을 넣어 주면 됩니다. 

+ Random Posts