time.LocationKST, PST, UTC 같은 시간대 데이터를 표현하는 타입. time.Time 타입의 In 메서드처럼 시간값을 다른 시간대로 변환할 때 또는 time.ParseInLocation() 에서 시간을 표현하는 문자열을 특정 시간대로 파싱할 때에도 사용된다.
time.Location의 생성time.FixedZone()을 이용해 직접 UTC 기준 오프셋 시간을 설정해 사용할 수도 있지만, 주된 사용법은 Asia/Seoul과 같은 형태의 IANA 시간대 이름을 time.LoadLocation()을 통해 파싱하는 것이다.
단, IANA 시간대 이름을 파싱할 때의 주의점은 실행 환경에 시간대 정보가 설치되어 있지 않을 수도 있다는 것이다. 일반적인 개발 환경의 경우 OS가 기본적으로 정보를 갖고 있어 신경 쓸 일이 없지만, 일부 docker 환경, 특히 scratch를 베이스로 한 이미지에서 프로그램이 실행되는 경우 시간대 정보를 찾지 못해 에러가 발생할 수 있다.
time.LoadLocation()의 문서를 보면 시간대 정보를 찾는 순서가 아래와 같이 나열되어 있다.
- the directory or uncompressed zip file named by the ZONEINFO environment variable
- on a Unix system, the system standard installation location
- $GOROOT/lib/time/zoneinfo.zip
- the time/tzdata package, if it was imported
만약 scratch 이미지에서 time.LoadLocation()을 사용하고 싶다고 한다면:
- 시간대 정보가 담긴 파일을 이미지에 담고 그 경로를
ZONEINFO환경 변수로 설정- 이미지에 시간대 정보를 설치
- 이미지에 go를 설치(...)
time/tzdata패키지를 코드에서 import
위와 같은 방법들이 있는 것인데, scratch 이미지를 사용하는 이유를 생각해보면 4번이 가장 간편하면서도 적은 용량을 차지하는 옵션으로 보인다.
다만 time/tzdata 패키지의 문서를 보면 해당 패키지를 import시 실행 파일의 크기가 약 450KB정도 늘어난다고 하니, 다양한 시간대에 대응해야 하는 경우가 아니라면 time.FixedZone()을 이용해 직접 시간대 정보를 정의하고 사용하는 쪽이 더 괜찮아 보인다.