서비스 운영 중에는 이런저런 목적에 쓸 명령 줄 스크립트를 짤 일이 생긴다. 자동화를 적극적으로 도입할수록 배치 스크립트, 빌드 스크립트 등이 쌓여 가기 때문에 이는 좋은 징조라 봐도 무방하다.
그런데 팀 내부에서 문제가 안 생기던 명령 줄 스크립트이더라도 해외 퍼블리셔에게 전달해주고 나면 제대로 작동 안 한다는 피드백을 받곤 한다. 이런 문제가 발생하면 열의 아홉은 로케일 문제이다. 로케일이라 하면 문화권과 경제 또는 정치 단일체마다 통화, 시간 등의 기준과 표기법이 다른 것을 말한다. 이 중에서 날짜와 시간은 프로그래머를 자주 괴롭히는 녀석이다.
영어권과 한국은 날짜 표기법이 한국어와 다르다. 영어 듣기 시험 때 잘 알아듣고 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 이다.
이렇게 하여 서비스를 운영하는 곳이 어디든 상관 없이 날짜 기반의 스크립트 코드가 실행가능하게 된다.