Lokal-tidak menyadari% DATE% dan% TIME% dalam file batch?

16

The %DATE%dan %TIME%variabel lingkungan memberikan tanggal dan waktu pada mesin Windows pada baris perintah dan di dalam sebuah file batch.

Sayangnya, nilai-nilai itu sadar akan lokal! Artinya, katakanlah, pada mesin Jerman, Anda akan mendapatkannya

26.1.2011

dari pada

2011-26-01

ini mengacaukan penyortiran jika Anda ingin menggunakan variabel ini dalam nama file.

Apakah ada cara mudah untuk mendapatkan YYYY-MM-DDstring tanggal lokal-tidak sadar dalam file batch Windows?

Untuk saat ini, saya bekerja dengan solusi yang agak kusam ini:

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

tetapi sekarang ini adalah spesifik lokal Jerman - jelas, solusi yang sepenuhnya independen akan jauh lebih baik.

OS yang dimaksud adalah Server 2008. Saya lebih suka tidak menggunakan alat pihak ketiga, jika memungkinkan.

Pekka
sumber

Jawaban:

22

Ada beberapa upaya ( Rob van der Woude punya sesuatu), tetapi tidak ada yang benar-benar berhasil di semua tempat. Namun, Anda bisa mendapatkan waktu saat ini dalam format yang mudah diurai melalui

wmic os get LocalDateTime

Yang berikut memberi Anda setidaknya 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%

Namun, Anda mungkin perlu memperhitungkan offset zona waktu (kecuali jika itu untuk file log, maka saya akan selalu menggunakan UTC) tapi itu tidak bisa dilakukan dengan sedikit perhitungan :-)

Joey
sumber
1
Luar biasa, ini persis seperti yang saya butuhkan! Terima kasih.
Pekka
2
Sebagai catatan: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xsedikit lebih bagus. Ada juga versi yang lebih ringkas yang tersedia di sini , yaitu di komentar itu .
Tomalak
Agak sulit menemukan dan memperbarui semua contoh lama di mana Anda menulis sesuatu :). Saya mungkin akan menggunakan Win32_UTCTime dan Win32_LocalTime sekarang.
Joey
sangat fantastis!
jeromerg
Seperti @Tomalak mengatakan, findstrsolusinya jauh lebih baik, seperti untuk kasus saya, yang asli for(tanpa skip) berulang 3 kali. Satu kali untuk kata "LocalDateTime", kedua kalinya untuk tanggal aktual, dan ketiga kalinya untuk nilai kosong (mungkin satu baris?).
cavpollo
9

Berikut adalah dua baris yang telah saya gunakan, yang tampaknya berfungsi terlepas dari versi Windows atau pengaturan waktu lokal:

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%

Ini akan menetapkan variabel yang disebut% CUR_DATE% dalam format standar ISO berikut:

yyyy-mm-dd

Saya mencoba membuatnya satu garis dengan &&, tetapi sepertinya tidak perlu, jadi saya beralih ke versi dua baris. Semoga ini membantu.

Gerbang Vocatus
sumber
0

Saya menggunakan trik ini untuk mendapatkan 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%

Namun itu memang memiliki efek samping mengubah sebentar seluruh sistem ke UTC. Ini mungkin OK di workstation pribadi, tetapi tidak yakin apa dampaknya akan menjadi server produksi besar, yang mungkin harus diatur ke UTC.

tandai d drake
sumber