-
[Golang] time 패키지의 기본적인 사용법 알아보기 ( Now, LoadLocation )Golang 2024. 6. 12. 07:23728x90반응형
- 목차
들어가며.
Golang 의 time 패키지는 날짜와 시간을 처리하기 위한 다양한 기능을 제공하는 표준 라이브러리입니다.
이번 글에서는 time 패키지의 기본적인 사용법과 주요 기능들을 살펴보겠습니다.현재 시각 가져오기.
time 패키지는 여타 프로그래밍 언어와 같이 현재 시각 정보를 가져올 수 있습니다.
time.Now()
time.Now()를 사용하여 현재 시간을 가져올 수 있습니다.
package example_time import ( "fmt" "time" ) func TimeExample() { var now time.Time = time.Now() fmt.Println(now) }
Timezone 을 변경하는 방법.
time.Now() 와 같은 함수를 사용하여 time.Time 구조체를 생성할 수 있습니다.
하지만 일반적으로 생성된 time.Time 값은 Local Timezone 인 Asia/Seoul 을 따르게 됩니다.
그래서 time 패키지는 여러가지 방식으로 Timezone 을 변경하는 방법을 제공합니다.
UTC.
time.Time 구조체는 UTC 라는 메소드를 제공합니다.
이름처럼 time.Time 값의 Timezone 을 UTC 로 변경합니다.
UTC 메소드의 시그니처는 아래와 같습니다.
Timezone 을 변경한 새로운 time.Time 구조체 값을 반환합니다.
func (t Time) UTC() Time
아래의 예시코드는 Time 구조체의 UTC 메소드의 활용 예시입니다.
now 과 nowUTC 변수에 Time 구조체 값을 할당하여 그 결과를 분석합니다.
또한 UTC 메소드를 새로운 구조체 값을 생성하기에 Immutable 하게 동작합니다.
package example_time import ( "fmt" "time" ) func TimeExample() { var now time.Time = time.Now() var nowUTC time.Time = now.UTC() fmt.Printf("now: %v\nnowUTC: %v\nnow == nowUTC: %t\n", now, nowUTC, &now == &nowUTC) // now: 2024-12-28 09:08:35.14508 +0900 KST m=+0.002065334 // nowUTC: 2024-12-28 00:08:35.14508 +0000 UTC // now == nowUTC: false }
LoadLocation.
time 패키지의 LocaLocation 함수는 Location 구조체를 생성하는 함수입니다.
Location 구조체는 특정 Timezone 을 의미하는 time 패키지의 구조체입니다.
LoadLocation 의 시그니처는 아래와 같습니다.
Asia/Seoul, UTC 와 같은 Timezone Name 을 인자로 받아 Location 객체의 포인터를 반환합니다.
func LoadLocation(name string) (*Location, error)
LoadLocation 의 활용 예시는 아래와 같습니다.
UTC -> America/Los_Angeles.
아래의 예시는 UTC Timezone 으로부터 LA 의 Timezone 을 변경하는 일련의 과정을 나타낸 예시입니다.
LoadLocation 함수를 통해서 "America/Los_Angeles" 를 상징하는 Location 객체를 생성할 수 있습니다.
그리고 Time 구조체의 In 메소드와 함께 사용됩니다.
package example_time import ( "fmt" "time" ) func TimeExample() { var now time.Time = time.Now() var nowUTC time.Time = now.UTC() LALocation, _ := time.LoadLocation("America/Los_Angeles") var nowLA time.Time = now.In(LALocation) fmt.Printf("now: %v\nnowUTC: %v\nnowLA: %v\n", now, nowUTC, nowLA) // now: 2023-06-28 09:17:59.504817 +0900 KST m=+0.001725626 // nowUTC: 2023-06-28 00:17:59.504817 +0000 UTC // nowLA: 2023-06-27 16:17:59.504817 -0800 PST }
시간 문자열와의 변환.
Go 언어에서 시간을 다룰 때 가장 자주 직면하는 문제 중 하나는 시간 문자열과 time.Time 구조체 간의 변환입니다.
time.Time 구조체는 시간 정보를 표현하는 Go 언어의 기본 데이터 타입으로, 연도, 월, 일, 시, 분, 초, 나노초, 시간대 등 다양한 정보를 담고 있습니다.
이 구조체를 효율적으로 사용하려면 문자열에서 time.Time으로, 또는 그 반대로 변환하는 작업이 필요합니다.
시간 문자열과 time.Time 구조체를 변환할 때, 가장 중요한 것은 시간 문자열의 형식과 time.Time 필드 간의 연결입니다.
( ex. YYYY-MM-DD HH:mm:ss )
Golang time 패키지의 독특한 시간 문자열 형식.
Golang 은 다른 프로그래밍 언어에서 "YYYY-MM-DD HH:mm:ss" 와 같은 형식의 Datetime Format 을 사용하는 것과 달리, 고유한 형식을 사용합니다.
그 예시들은 아래와 같습니다.
2006-01-02 15:04:05
위의 2006년 이라든지 1월 2일과 같은 값들은 큰 의미가 없습니다.
전통적으로 MM 이 Month 인지 Minute 인지 헷갈리거나, 시간을 의미하는 형식 지정자가 H 또는 I 이 케이스가 혼재되어 혼란이 있곤합니다.
Golang 에서는 2006, 01, 02, 15, 04, 05 를 기준으로 Time Format 을 헷갈리지 않게 지정할 수 있습니다.
time.Parse
Parse 함수를 통해서 시간 문자열을 time.Time 구조체로 변환이 가능합니다.
아래의 예시는 한국 시간으로 2024-01-01 00:00:00 인 새해의 자정을 나타내는 시간 문자열입니다.
그리고 2006-01-02 15:04:05 의 시간 형식 지정자와 Timezone 을 나타내는 -07 을 추가합니다.
package example_time import ( "fmt" "time" ) func TimeExample() { var timeStr string = "2024-01-01 00:00:00 +09" var timeValue, _ = time.Parse("2006-01-02 15:04:05 -07", timeStr) var timeValueUTC = timeValue.UTC() fmt.Printf("%v\n", timeValue) // 2024-01-01 00:00:00 +0900 KST fmt.Printf("%v\n", timeValueUTC) // 2023-12-31 15:00:00 +0000 UTC }
그리고 아래와 같이 다양한 변형이 가능합니다.
시간 형식 지정자의 위치를 변경하더라도 시간 문자열과의 형식만 맞으면 정상적인 Parse 가 동작합니다.
timeValue, _ := time.Parse("2006-01-02 15:04:05 -07", "2024-01-01 00:00:00 +09") fmt.Println(timeValue) //2024-01-01 00:00:00 +0900 KST timeValue, _ = time.Parse("-07 2006-01-02 15:04:05", "+09 2024-01-01 00:00:00") fmt.Println(timeValue) //2024-01-01 00:00:00 +0900 KST timeValue, _ = time.Parse("2006 --- -07 -01-02 15:04:05", "2024 --- +09 -01-01 00:00:00") fmt.Println(timeValue) //2024-01-01 00:00:00 +0900 KST
시간 연산하는 함수.
Time 구조체의 Add 와 Sub 메소드를 통해서 시간을 추가하거나 줄이는 연산이 가능합니다.
Add 는 time.Time 구조체에서 사용되는 메서드로, 시간을 더하거나 빼는 작업을 수행합니다.
이 메서드는 새로운 시간을 반환하며, 원래의 time.Time 객체는 변경되지 않습니다.
Add 메소드의 시그니처는 아래와 같습니다.
func (t Time) Add(d Duration) Time
time.Duration
time.Duration 은 Go에서 시간 간격을 나타내는 기본 단위로, 나노초 단위를 사용합니다.
이를 기반으로 초, 분, 시간 등의 단위를 제공하는 상수가 정의되어 있습니다.
- time.Nanosecond: 1 나노초
- time.Microsecond: 1 마이크로초
- time.Millisecond: 1 밀리초
- time.Second: 1 초
- time.Minute: 1 분
- time.Hour: 1 시간
time.Add
time.Time 구조체의 Add 메소드의 예시는 아래와 같습니다.
Duration 을 변형하여 여러가지 연산이 가능하여 Duration 을 음수값으로 변경하면 Sub 처럼 동작하기도 합니다.
package example_time import ( "fmt" "time" ) func TimeExample() { timeValue, _ := time.Parse("2006-01-02 15:04:05 -07", "2024-01-01 00:00:00 +09") fmt.Println(timeValue) //2024-01-01 00:00:00 +0900 KST timeValue = timeValue.Add(10 * time.Hour) fmt.Println(timeValue) //2024-01-01 10:00:00 +0900 KST timeValue = timeValue.Add(+10 * time.Second) fmt.Println(timeValue) //2024-01-01 10:00:10 +0900 KST timeValue = timeValue.Add(-10 * time.Minute) fmt.Println(timeValue) //2024-01-01 09:50:10 +0900 KST }
Truncate 함수 알아보기.
Truncate 함수는 시간과 관련된 여러가지에서 유용한 기능 중의 하나입니다.
StartOfDay, EndOfMonth 와 같이 시간 정보를 Truncate 시키는 기능이 중요할 때가 있습니다.
golang time 패키지의 Truncate 기능에 대해서 알아보도록 하겠습니다.
아래의 코드는 Truncate 를 활용한 다양한 케이스를 정리한 예시들입니다.
package example_time import ( "fmt" "time" ) func TimeExample() { timeValue, _ := time.Parse("2006-01-02 15:04:05 -07", "2024-01-01 12:34:50 +09") fmt.Println(timeValue) //2024-01-01 12:34:50 +0900 KST // 모든 초단위를 Truncate timeValue1 := timeValue.Truncate(time.Minute) fmt.Println(timeValue1) //2024-01-01 12:34:00 +0900 KST // 10분 단위로 Truncate timeValue2 := timeValue.Truncate(10 * time.Minute) fmt.Println(timeValue2) //2024-01-01 12:30:00 +0900 KST // Start Of Day timeValue3 := timeValue.Truncate(time.Hour) startOfDay := time.Date(timeValue3.Year(), timeValue3.Month(), timeValue3.Day(), 0, timeValue3.Minute(), timeValue3.Second(), timeValue3.Nanosecond(), timeValue3.Location()) fmt.Println(startOfDay) //2024-01-01 00:00:00 +0900 KST }
반응형'Golang' 카테고리의 다른 글
[Golang] Go 의 range 와 channel 함께 사용하기 (0) 2024.06.15 [Golang] go install 과 go get 의 차이 알아보기 (0) 2024.06.15 [Golang] encoding/json 패키지 알아보기 (0) 2024.06.12 [Go] regexp 패키지와 정규표현식 알아보기 (0) 2024.06.08 golang package 이해하기 (2) 2023.09.18