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


16

%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입니다. 가능한 경우 타사 도구를 사용하지 않는 것이 좋습니다.

답변:


22

몇 번의 시도가 있었지만 ( 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를 사용하지 않는 한) 약간의 계산으로는 할 수 없습니다 :-)


1
훌륭합니다. 이것은 내가 필요한 것과 정확히 같습니다! 감사합니다.
Pekka

2
기록을 위해 : for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%x조금 더 멋지다. 여기에 더 컴팩트 한 버전이 있습니다 . 즉, 그 의견 입니다.
Tomalak

당신이 무언가를 쓴 모든 오래된 인스턴스를 찾아서 업데이트하는 것은 약간 어렵습니다. :). 아마도 지금까지 Win32_UTCTime 및 Win32_LocalTime을 사용했을 것입니다.
Joey

정말 환상적입니다!
jeromerg

@ Tomalak이 말했듯이 findstr솔루션은 훨씬 좋았습니다. 제 경우에는 원래 for( skip)가 3 번 반복됩니다. 단어 "LocalDateTime"에 대해 한 번, 실제 날짜에 대해 두 번째, 빈 값에 대해 세 번째 (줄 바꿈) 일 수 있습니다.
cavpollo

9

다음은 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 줄 버전을 사용했습니다. 도움이 되었기를 바랍니다.


0

이 트릭을 사용하여 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로 설정해야하는 대규모 프로덕션 서버에 미치는 영향은 확실하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.