본문 바로가기
프로그래밍/Golang

Golang Date(날짜, 시간) 계산, 포맷팅

by slowin 2024. 9. 10.

Golang에서 날짜와 시간 처리

Golang `time` 패키지를 사용하여 날짜와 시간을 처리하는 방법들을 알아보겠습니다.

1. 날짜와 시간 생성

// 현재 시간
now := time.Now()

// 사용자 지정 시간 (UTC 사용)
customTime := time.Date(2023, 7, 26, 15, 30, 0, 0, time.UTC)

 

2. 날짜 계산

// 24시간 후
futureTime := now.Add(24 * time.Hour)

// 1달 전
pastTime := now.AddDate(0, -1, 0)

3. 날짜 포맷팅

Go의 시간 포맷팅은 2006년 1월 2일 오후 3시 4분 5초(15:04:05)를 레이아웃으로 사용합니다.

// YYYY-MM-DD HH:MM:SS
formatted := now.Format("2006-01-02 15:04:05")

// YYYY.MM.DD
formattedDate := now.Format("2006.01.02")

// YYYY/MM/DD
formattedDateSlash := now.Format("2006/01/02")

// 12시간 형식
formatted12Hour := now.Format("2006/01/02 03:04:05 PM")

 

4. 문자열을 시간으로 파싱

t, err := time.Parse("2006-01-02", "2023-07-26")
if err != nil {
    // 에러 처리
}

5. 시간대 처리

loc, _ := time.LoadLocation("Asia/Seoul")
seoulTime := now.In(loc)

 

6. 날짜 비교

referenceDate := time.Date(2023, 7, 26, 0, 0, 0, 0, time.UTC)

// 이전 날짜 비교
if now.Before(referenceDate) {
    fmt.Println("현재 시간은 기준 날짜보다 이전입니다.")
}

// 이후 날짜 비교
if now.After(referenceDate) {
    fmt.Println("현재 시간은 기준 날짜보다 이후입니다.")
}

// 같은 날짜 비교
if now.Year() == referenceDate.Year() && now.YearDay() == referenceDate.YearDay() {
    fmt.Println("현재 날짜는 기준 날짜와 같은 날입니다.")
}

// 시간 차이 계산
duration := now.Sub(referenceDate)
fmt.Printf("기준 날짜로부터 %v가 지났습니다.\n", duration)

// 특정 기간 내 확인
oneWeekAgo := now.AddDate(0, 0, -7)
if referenceDate.After(oneWeekAgo) && referenceDate.Before(now) {
    fmt.Println("기준 날짜는 지난 1주일 내에 있습니다.")
}

7. UTC (Coordinated Universal Time) 사용의 중요성

`time.UTC`를 사용하는 것은 시간 처리에 있어 매우 중요합니다. UTC를 사용하는 주요 이유는 다음과 같습니다

1. 표준화된 기준 시간: UTC는 전 세계적으로 사용되는 표준 시간입니다.
2. 일광 절약 시간 문제 해결: UTC는 일광 절약 시간(서머타임)의 영향을 받지 않습니다.
3. 시간대 변환 용이: UTC를 기준으로 다른 시간대로의 변환이 쉽습니다.
4. 일관성 유지: 특히 분산 시스템이나 국제적인 애플리케이션에서 시간 데이터의 일관성을 유지합니다.

 

예시

// UTC 시간 생성
utcTime := time.Date(2023, 7, 26, 15, 30, 0, 0, time.UTC)
fmt.Println("UTC 시간:", utcTime)

// 로컬 시간대로 변환
localTime := utcTime.Local()
fmt.Println("로컬 시간:", localTime)

// 특정 시간대(예: 서울)로 변환
loc, _ := time.LoadLocation("Asia/Seoul")
seoulTime := utcTime.In(loc)
fmt.Println("서울 시간:", seoulTime)

 

시간대를 명시적으로 지정하지 않으면, Go는 기본적으로 시스템의 로컬 시간대를 사용합니다. 하지만 시스템 설정에 따라 달라질 수 있어 예측 불가능한 결과를 초래할 수 있습니다. 따라서 `time.UTC`를 사용하여 명확하고 일관된 시간 표현을 보장하는 것이 좋을것 같습니다.

정리

  1. 시간 생성: time.Now()로 현재 시간, time.Date()로 사용자 지정 시간 생성
  2. 날짜 계산: Add(), AddDate() 메서드로 시간 더하기/빼기
  3. 포맷팅: "2006-01-02 15:04:05" 형식의 레이아웃 사용
  4. 파싱: time.Parse()로 문자열을 시간으로 변환
  5. 시간대: time.LoadLocation()으로 시간대 설정, In() 메서드로 변환
  6. 비교: Before(), After(), Equal() 메서드로 시간 비교
  7. UTC 사용: 일관성과 정확성을 위해 UTC 사용 권장