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

  • Post author:
  • Post category:칼럼
  • Post comments:0 Comments
  • Post last modified:October 19, 2012

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

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

영어권과 한국은 날짜 표기법이 한국어와 다르다. 영어 듣기 시험 때 잘 알아듣고 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 이다.

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

Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments