배치 파일에서 로케일을 모르는 % DATE % 및 % TIME %?

%DATE%%TIME%환경 변수는 명령 행 및 배치 파일 내부 Windows 시스템에 현재 날짜와 시간을 제공합니다.

안타깝게도 그 값은 로케일을 인식합니다! 즉, 독일 기계에서는

26.1.2011

대신에

2011-26-01

파일 이름 에이 변수를 사용하려는 경우 정렬이 방해됩니다.

YYYY-MM-DDWindows 배치 파일에서 로캘 인식 날짜 문자열을 쉽게 얻을 수있는 방법이 있습니까?

현재로서는 다소 번거로운 해결 방법으로 작업하고 있습니다.

for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set date=%%k-%%j-%%i
echo %date%

그러나 이것은 이제 독일어 로케일에 따라 다릅니다. 분명히 완전히 독립적 인 솔루션이 훨씬 좋습니다.

문제의 OS는 Server 2008입니다. 가능한 경우 타사 도구를 사용하지 않는 것이 좋습니다.



답변

몇 번의 시도가 있었지만 ( Rob van der Woude 는 무언가를 가졌지 만) 실제로 모든 로케일에서 작동하는 것은 없습니다. 그러나 현재 시간을 쉽게 파싱 가능한 형식으로 얻을 수 있습니다.

wmic os get LocalDateTime

다음은 적어도 UTC를 이미 얻습니다.

@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%

그러나 시간대 오프셋을 고려해야 할 수도 있습니다 (로그 파일이 아니라면 항상 UTC를 사용하지 않는 한) 약간의 계산으로는 할 수 없습니다 🙂


답변

다음은 Windows 버전이나 현지 시간 설정에 관계없이 작동하는 두 개의 라이너입니다.

FOR /f %%a in ('WMIC OS GET LocalDateTime ^| find "."') DO set DTS=%%a
set CUR_DATE=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%

그러면 다음 ISO 표준 형식으로 % CUR_DATE %라는 변수가 설정됩니다.

yyyy-mm-dd

나는 &&로 한 줄짜리로 만들려고했지만 가져 가지 않는 것처럼 보였으므로 2 줄 버전을 사용했습니다. 도움이 되었기를 바랍니다.


답변

이 트릭을 사용하여 UTC를 얻습니다.

for /f "tokens=*" %%i in ('tzutil /g') do set CTZ=%%i
tzutil /s UTC
set UTC=
for /f  "skip=1 delims=" %%i in ('WMIC OS GET LocalDateTime') do if not defined UTC set UTC=%%i
tzutil /s "%CTZ%"
set UTC=%UTC:~0,4%-%UTC:~4,2%-%UTC:~6,3%T%UTC:~8,13%
echo %UTC%

그러나 전체 시스템을 UTC로 간단히 변경하면 부작용이 있습니다. 개인용 워크 스테이션에서는 문제가 없지만 어쨌든 UTC로 설정해야하는 대규모 프로덕션 서버에 미치는 영향은 확실하지 않습니다.


답변