반응형
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 |
반응형