ABOUT ME

-

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

    댓글