[Golang] 시간 다루기

반응형

go에서 time 패키지를 이용하여 시간을 다루는 방법에 대해서 간단하게 알아보자.

 

현재 시간

t := time.Now() 
fmt.Println(t) //2020-10-24 02:44:06.14677 +0900 KST m=+0.000171402

Now 함수는 현재 시간을 반환해준다.

 

실행 시간 계산하기

Task 실행 전의 시간과 Task 실행 후의 시간을 빼서 간단하게 프로그램의 실행시간을 측정해볼 수도 있다.

startTime := time.Now()

// Task
sum := 0
for i := 1; i <= 100; i++ {
  sum += i
}
fmt.Println(sum)


elapsedTime := time.Since(startTime)
fmt.Printf("실행시간: %s\n", elapsedTime)

 

 

포맷

시간 포맷을 정할 때 Format 함수를 사용한다.

func (t Time) Format(layout string) string

layout 파라미터에는 원하는 형식을 넣어주면 된다.

s := time.Now()
fmt.Println(s.Format("Jan 2, 2006")) // Oct 24, 2020
fmt.Println(t.Format(time.RFC3339))   //   2020-10-24T00:00:00Z

레이아웃 문자열인 Jan 2, 2006 은 시간 포맷으로 익숙하지는 않다. 고에서는 레퍼런스 데이트로 20060102150405 를 사용하고 있다. 아무 의미 없이 정한 날짜인 줄 알았는데 아니었다. 아래와 같은 의미라고 한다.

0        1    2 3    4   5                           6

사용할 수 있는 레이아웃 문자열은 글 하단부에 정리하였으니 참고해서 사용하자.

 

 

 

문자열 파싱

문자열을 Time으로 파싱할 때 time.parse 함수를 사용한다.

func Parse(layout, value string) (Time, error)

layout 파라미터에는 원하는 형식을 넣어주면 되고 value 파라미터에는 파싱할 문자열을 넣어주면 된다.

 

"2020-10-24" 문자열을 layout 문자열 "2006-01-02" 을 이용해 yyyy-mm-dd 같은 포맷으로 만들 수 있다.

input := "2020-10-24"
layout := "2006-01-02"

t, _ := time.Parse(layout, input)
fmt.Println(t)   // 2020-10-24 00:00:00 +0000 UTC

 

 

 

시간 연산

Add 함수를 통해 시간을 연산할 수 있다.

func (t Time) Add(d Duration) Time

 

package main

import (
	"fmt"
	"time"
)

func main() {
  start := time.Date(2020, 10, 24, 12, 0, 0, 0, time.UTC)
  afterTenSeconds := start.Add(time.Second * 10)
  afterTenMinutes := start.Add(time.Minute * 10)
  afterTenHours := start.Add(time.Hour * 10)
  afterTenDays := start.Add(time.Hour * 24 * 10)

  fmt.Printf("start = %v\n", start)
  fmt.Printf("start.Add(time.Second * 10) = %v\n", afterTenSeconds)
  fmt.Printf("start.Add(time.Minute * 10) = %v\n", afterTenMinutes)
  fmt.Printf("start.Add(time.Hour * 10) = %v\n", afterTenHours)
  fmt.Printf("start.Add(time.Hour * 24 * 10) = %v\n", afterTenDays)

}

 

출력은 다음과 같다.

start = 2020-10-24 12:00:00 +0000 UTC
start.Add(time.Second * 10) = 2020-10-24 12:00:10 +0000 UTC
start.Add(time.Minute * 10) = 2020-10-24 12:10:00 +0000 UTC
start.Add(time.Hour * 10) = 2020-10-24 22:00:00 +0000 UTC
start.Add(time.Hour * 24 * 10) = 2020-11-03 12:00:00 +0000 UTC

 

 

 

AddDate 함수를 이용하여 날짜를 연산할 수 있다.

func (t Time) AddDate(years int, months int, days int) Time
package main

import (
	"fmt"
	"time"
)

func main() {
  start := time.Date(2020, 10, 24, 12, 0, 0, 0, time.UTC)

  oneDayLater := start.AddDate(0, 0, 1)
  oneMonthLater := start.AddDate(0, 1, 0)
  oneYearLater := start.AddDate(1, 0, 0)

  fmt.Printf("oneDayLater: start.AddDate(0, 0, 1) = %v\n", oneDayLater)
  fmt.Printf("oneMonthLater: start.AddDate(0, 1, 0) = %v\n", oneMonthLater)
  fmt.Printf("oneYearLater: start.AddDate(1, 0, 0) = %v\n", oneYearLater)
}

 

출력은 다음과 같다.

oneDayLater: start.AddDate(0, 0, 1) = 2020-10-25 12:00:00 +0000 UTC
oneMonthLater: start.AddDate(0, 1, 0) = 2020-11-24 12:00:00 +0000 UTC
oneYearLater: start.AddDate(1, 0, 0) = 2021-10-24 12:00:00 +0000 UTC

 

 

 

 


Layout 포맷

 

time 패키지안에 다음과 같은 상수가 존재한다.

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"
)

 

Common layouts

Go layout Java
2006-01-02 yyyy-MM-dd
20060102 yyyyMMdd
January 02, 2006 MMMM dd, yyyy
02 January 2006 dd MMMM yyyy
02-Jan-2006 dd-MMM-yyyy
01/02/06 MM/dd/yy
01/02/2006 MM/dd/yyyy
010206 MMddyy
Jan-02-06 MMM-dd-yy
Jan-02-2006 MMM-dd-yyyy
06 yy
Mon EEE
Monday EEEE
Jan-06 MMM-yy

 

Time

Go layout Java
15:04 HH:mm
15:04:05 HH:mm:ss
3:04 PM K:mm a
03:04:05 PM KK:mm:ss a

 

Date and time

Go layout Java
2006-01-02T15:04:05 yyyy-MM-dd'T'HH:mm:ss
2006-01-02T15:04:05-0700 yyyy-MM-dd'T'HH:mm:ssZ
2 Jan 2006 15:04:05 d MMM yyyy HH:mm:ss
2 Jan 2006 15:04 d MMM yyyy HH:mm
Mon, 2 Jan 2006 15:04:05 MST EEE, d MMM yyyy HH:mm:ss z