로케일을 고려해 윈도우 명령줄에서 날짜/시간 구하기

서비스 운영 중에는 이런저런 목적에 쓸 명령 줄 스크립트를 짤 일이 생긴다. 자동화를 적극적으로 도입할수록 배치 스크립트, 빌드 스크립트 등이 쌓여 가기 때문에 이는 좋은 징조라 봐도 무방하다.

그런데 팀 내부에서 문제가 안 생기던 명령 줄 스크립트이더라도 해외 퍼블리셔에게 전달해주고 나면 제대로 작동 안 한다는 피드백을 받곤 한다. 이런 문제가 발생하면 열의 아홉은 로케일 문제이다. 로케일이라 하면 문화권과 경제 또는 정치 단일체마다 통화, 시간 등의 기준과 표기법이 다른 것을 말한다. 이 중에서 날짜와 시간은 프로그래머를 자주 괴롭히는 녀석이다.

영어권과 한국은 날짜 표기법이 한국어와 다르다. 영어 듣기 시험 때 잘 알아듣고 2012/07/01 로 적었다가 틀린 경험이 있다. 이는 순전히 프로그래머 사이에서나 통할까 말까 하는 표기법이다. 지역에 따라서는 07/01/2012 라 하기도 하고 여러 표기법이 있다.

이런 연유로 배치 스크립트를 짤 때 로케일 생각 없이 함부로 코드를 짜면 낭패를 본다. 예를 들어,

c:> echo %date%

라고 명령 줄에 치면 어떤 결과가 나올까?

정답은 “로케일마다 다르다!”이다. 어떤 곳에선 2012-07-09 가 나오지만 다른 곳에선 09.07.2012 가 나온다. 그러므로 이식성을 생각하면 %date% 로 날짜를 구해선 안 된다.

그럼 이제는 각설하고 이식성 있게 날짜와 시간을 구하는 법을 알아보자.

@echo off
rem Get the time from WMI - at least that's a format we can work with
set X=
for /f "skip=1 delims=" %%x in ('wmic os get localdatetime') do if not defined X set X=%%x
echo.%X%

rem dissect into parts
set DATE.YEAR=%X:~0,4%
set DATE.MONTH=%X:~4,2%
set DATE.DAY=%X:~6,2%
set DATE.HOUR=%X:~8,2%
set DATE.MINUTE=%X:~10,2%
set DATE.SECOND=%X:~12,2%
set DATE.FRACTIONS=%X:~15,6%
set DATE.OFFSET=%X:~21,4%

echo %DATE.YEAR%-%DATE.MONTH%-%DATE.DAY% %DATE.HOUR%:%DATE.MINUTE%:%DATE.SECOND%.%DATE.FRACTIONS%

이 코드는 StackOverflow에서 가져왔는데 핵심은 WMI 를 호출해 2012.0709091147.621000+240 이라는 동일한 형식으로 날짜와 시간을 확인하는 코드 wmic os get localdatetime 이다.

이렇게 하여 서비스를 운영하는 곳이 어디든 상관 없이 날짜 기반의 스크립트 코드가 실행가능하게 된다.

Advertisements

최 재훈

블로그, 페이스북, 트위터 고성능 서버 엔진, 데이터베이스, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu