Memformat tanggal dan waktu dalam skrip batch Windows

192

Dalam skrip batch Windows (Windows XP) saya perlu memformat tanggal dan waktu saat ini untuk digunakan nanti dalam nama file, dll.

Ini mirip dengan pertanyaan Stack Overflow. Bagaimana cara menambahkan tanggal dalam file batch , tetapi dengan waktu juga.

Saya punya ini sejauh ini:

echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%

pemberian yang mana:

28/07/2009
 8:35:31.01
2009_07_28__ 8_36_01

Apakah ada cara saya bisa mengizinkan satu digit jam dalam% TIME%, jadi saya bisa mendapatkan yang berikut?

2009_07_28__08_36_01
laurie
sumber
Anda dapat mengganti ruang kosong pada datetimefvariabel Anda , dan menempatkan 0 sebagai gantinya. Pada contoh Anda:SET datetimef=%datetimef: =0%
SebaGra

Jawaban:

148

Saya berakhir dengan skrip ini:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%

set year=%date:~-4%
echo year=%year%

:: Pada WIN2008R2 misalnya saya harus membuat 'set bulan =% tanggal: ~ 3,2%' seperti di bawah ini :: jika tidak, 00 muncul untuk MONTH

set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%

set datetimef=%year%%month%%day%_%hour%%min%%secs%

echo datetimef=%datetimef%
laurie
sumber
11
FYI, pada Windows Server 2003 dan Windows 7, skrip ini memberi saya "201200Mo_085806" (tahun & waktu yang tepat).
sfuqua
50
Sebagai catatan untuk seseorang yang akan datang ke sini dari Google (seperti saya): Ini tergantung pada lokal, jadi mungkin diperlukan penyesuaian untuk bekerja pada Windows non-Inggris!
PiotrK
saya melakukannya dengan cara ini: Waktu / T> Set time.dat / P ftime = <Time.dat set fDate =% date: ~ 6 %% date: ~ 3,2 %% date: ~ 0,2 %% ftime: ~ 0,2%% ftime: ~ 3,2% echo% fDate% -> 201310170928
Ice
Apa yang dilakukan% waktu: ~ 0,2% di mana ada beberapa dokumentasi pada: ~,% ​​structure?
user1605665
6
Semua ini dapat dilakukan hanya dalam 2 baris menggunakan penggantian string biasa: stackoverflow.com/a/23558738/1879699
Andreas
71
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%

PAUSE
sth
sumber
2
Pada Windows Server 2003 dan Windows 7, ini memberi saya string yang benar. Jauh lebih elegan dari apa yang saya buat di masa lalu, jadi terima kasih!
sfuqua
3
Inilah yang memberi saya di Windows 7 dengan bahasa Rusia. Waktu sekarang adalah 2013-05-03T02: 22: 51, tetapi skrip mencetak: "2013-5.-01_02_22_51"
nightcoder
7
% Date% akan memberikan string berbeda dengan lokal berbeda.
AechoLiu
2
mengembalikan 20146.0._173502 kepada saya (ceko locale)
Muflix
2
win7 64bit ultimate, waktu salah: 20140.01_131612, harus (2014.10.26_131612)
waza123
66

Inilah cara saya menghasilkan nama file log (berdasarkan http://ss64.com/nt/syntax-getdate.html ):

@ECHO OFF
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
      SET _second=00%%K
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%
      Set _second=%_second:~-2%

Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second%
goto make_dump

:s_error
echo WMIC is not available, using default log filename
Set logtimestamp=_

:make_dump
set FILENAME=database_dump_%logtimestamp%.sql
...
nightcoder
sumber
5
jawaban terbaik pada SO untuk pertanyaan tentang pembuatan timestamp lokal-independen dalam batch.
Mike Campbell
2
Luar biasa! Seharusnya ada cara untuk menandai ini sebagai solusinya
Rado
48

Saya biasanya melakukannya dengan cara ini setiap kali saya membutuhkan string tanggal / waktu:

set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%

Ini untuk format tanggal / waktu Jerman (dd.mm.yyyy jj: mm: dd). Pada dasarnya saya menggabungkan substring dan akhirnya mengganti semua spasi dengan nol.

Penjelasan singkat tentang cara kerja substring:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

Jadi untuk mendapatkan tahun dari tanggal seperti "29.03.2018" gunakan:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 
Andreas
sumber
7
sejauh ini solusi paling elegan ketika Anda hanya perlu cap waktu bersih (tanpa spasi atau karakter lainnya)
jvdneste
1
Tidak bisa setuju dengan @jvdneste terima kasih telah berbagi mrt
this.user3272243
1
benar-benar hebat - dan bekerja [sintaks yang diperlukan sangat membingungkan, tapi itu bukan masalah poster]
JosephDoggie
38

Jika PowerShell diinstal, maka Anda dapat dengan mudah dan andal mendapatkan Tanggal / Waktu dalam format apa pun yang Anda inginkan, misalnya:

for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
move "%oldfile%" "backup-%datetime%"

Tentu saja saat ini PowerShell selalu diinstal, tetapi pada Windows XP Anda mungkin hanya ingin menggunakan teknik ini jika skrip batch Anda digunakan di lingkungan yang dikenal di mana Anda tahu PS tersedia (atau periksa file batch Anda jika PowerShell tersedia ...)

Anda mungkin bertanya: mengapa menggunakan file batch sama sekali jika Anda dapat menggunakan PowerShell untuk mendapatkan tanggal / waktu, tapi saya pikir beberapa alasan yang jelas adalah: (a) Anda tidak terlalu terbiasa dengan PowerShell dan masih lebih suka melakukan sebagian besar melakukan hal-hal kuno dengan file batch atau (b) Anda memperbarui skrip lama dan tidak ingin port semuanya untuk PS.

G. Lombard
sumber
(A) dalam kasus saya, dan ini berfungsi dengan baik (kelelawar hanya untuk lingkungan saya tetapi saya telah mencampur lokal pada PC yang berbeda). Terima kasih!
ccalboni
30

Saya menemukan masalah ini hari ini dan menyelesaikannya dengan:

SET LOGTIME=%TIME: =0%

Ini menggantikan spasi dengan 0s dan pada dasarnya nol-pad jam.

Setelah beberapa pencarian cepat saya tidak mengetahui apakah diperlukan ekstensi perintah (masih bekerja dengan SETLOCAL DISABLEEXTENSIONS).

opello
sumber
OK, subtitusi dalam variabel. Sekarang - bagaimana cara mengganti titik dua ( :)?
Tomasz Gandor
@TomaszGandor Ini bekerja untuk saya: echo %TIME: =:%tetapi jika tidak mungkin mencoba melarikan diri :dengan ^sejenisnya echo %TIME: =^:%(yang juga berfungsi untuk saya).
opello
1
+1 untuk kesederhanaan. Titik dua tidak valid dalam nama file. atur theTime =% Time :: =% menghapusnya. Bisakah Anda mengganti 0 untuk spasi, menghapus titik dua, dan memotong menjadi 6 karakter (sehingga menghapus bagian desimal) dalam satu pernyataan? Bukan masalah besar jika dibutuhkan dua atau tiga baris. Saya hanya penasaran.
riderBill
Bukannya aku tahu. Silakan tindak lanjuti jika Anda menemukannya!
opello
21

Seperti yang telah dicatat, penguraian tanggal dan waktu hanya berguna jika Anda tahu format yang digunakan oleh pengguna saat ini (misalnya, MM / hh / tttt atau hh-MM-tttt hanya untuk menyebutkan dua). Ini bisa ditentukan, tetapi pada saat Anda melakukan semua stres dan parsing, Anda masih akan berakhir dengan beberapa situasi di mana ada format tak terduga yang digunakan, dan diperlukan lebih banyak tweak.

Anda juga dapat menggunakan beberapa program eksternal yang akan mengembalikan slug tanggal dalam format pilihan Anda, tetapi itu memiliki kekurangan karena perlu mendistribusikan program utilitas dengan skrip / batch Anda.

Ada juga trik batch menggunakan jam CMOS dengan cara yang cukup mentah, tapi itu terlalu dekat dengan kabel telanjang bagi kebanyakan orang, dan juga tidak selalu tempat yang disukai untuk mengambil tanggal / waktu.

Di bawah ini adalah solusi yang menghindari masalah di atas. Ya, ini memperkenalkan beberapa masalah lain, tetapi untuk tujuan saya, saya menemukan ini sebagai solusi termudah, paling jelas, paling portabel untuk membuat datestamp di file .bat untuk sistem Windows modern. Ini hanya sebuah contoh, tetapi saya pikir Anda akan melihat bagaimana mengubah format tanggal dan / atau waktu lainnya, dll.

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f
jph
sumber
3
Apa yang saya cari. Sesuatu yang bekerja di setiap pengaturan lokal. Terima kasih!
Lost_DM
+1 untuk "sistem Windows modern" yang bisa kami tangani :) Sambil bercanda, ini sangat cerdik, dan seperti yang Anda katakan, portabel, cara menangani masalah ini.
Zach Young
9
Ini solusi yang mengerikan. Jika gagal maka pengaturan global diubah secara permanen. Ini juga memperkenalkan kondisi balapan dengan aplikasi lain.
MikeKulls
Anda dapat menggunakan reg query "HKCU\Control Panel\International" /v sShortDatebagian tersebut tanpa mengubah pengaturan registri (latihan tersisa untuk pembaca!).
tricasse
9

Berikut ini mungkin bukan jawaban langsung tetapi jawaban yang dekat?

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%

Setidaknya itu mungkin menginspirasi.

ufukgun
sumber
9

Jika Anda tidak benar-benar membutuhkan format ini:

2009_07_28__08_36_01

Kemudian Anda dapat menggunakan 3 baris kode berikut yang menggunakan% date% dan% time%:

set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%

Catatan: Karakter /dan :dihapus dan karakter .dan ruang diganti dengan garis bawah.

Contoh output (diambil Rabu 8/5/15 pada 12:49 PM dengan 50 detik dan 93 milidetik):

echo %mytimestamp%
Wed_08052015_124950_93
Jesse
sumber
ketika jam kurang dari 12, atur mydate =% date: / =% set mytime =% time :: =% atur mytime =% mytime: = 0% atur mytimestamp =% mydate: = _% _% mytime:. = _ %
ragche
8
REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
REM If first character of time is a space (less than 1) then set DATETIME to:
REM YYYY-MM-DD-0h-mm-ss
REM Otherwise, set DATETIME to:
REM YYYY-MM-DD-HH-mm-ss
REM Year, month, day format provides better filename sorting (otherwise, days grouped
REM together when sorted alphabetically).

IF "%time:~0,1%" LSS "1" (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
) ELSE (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
)

ECHO %DATETIME%
Mike Raynham
sumber
6

Itu offset:length pemformatan didukung dengan SETperintah pada Windows tidak akan memungkinkan Anda untuk pad 0seperti yang Anda tampaknya tertarik.

Namun, Anda dapat mengkodekan skrip BATCH untuk memeriksa apakah waktunya kurang dari 10dan
sesuai dengan echostring yang berbeda .

Anda akan menemukan beberapa informasi di InternetSET perintah pada tautan ini .


Anda juga dapat mengubah metode pemrograman lain untuk sampai ke sini.

Cukup sederhana di unix bash (tersedia dengan Cygwin di Windows) untuk hanya mengatakan,

date +%Y_%m_%d__%H_%M_%S

Dan, selalu bantalan dengan benar.

nik
sumber
6

Saya melakukannya dengan cara ini:

REM Generate FileName from date and time in format YYYYMMTTHHMM

Time /T > Time.dat
set /P ftime= < Time.dat

set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log

echo %FileName%

LogFile201310170928.log

Es
sumber
Ini berjalan di server bahasa inggris (Nama OS: Microsoft (R) Windows (R) Server 2003 Edisi Standar x64, Versi OS: 5.2.3790 Paket Layanan 2 Build 3790)
Ice
1
dan juga diuji pada server Jerman (Betriebssystemname: Microsoft® Windows Server® 2008 Enterprise, versi Betriebssystem: 6.0.6002 Paket Layanan 2 Build 6002)
Ice
1
Bahkan yang satu ini ok: (Betriebssystemname: Microsoft Windows Server 2012 Standard, Betriebssystemversion: 6.2.9200 Nicht zutreffend Build 9200)
Ice
4
::========================================================================  
::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS   
::======= ================================================================  
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a  
SET DATETIME=%DTS:~0,8%-%DTS:~8,6%  

Baris pertama selalu menampilkan output dalam format ini dalam zona waktu:
20150515150941.077000 + 120
Ini membuat Anda hanya memformat output sesuai keinginan Anda.

Kees
sumber
4

File bat ini (save as datetimestr.bat) menghasilkan string datetime 3 kali: (1) string datetime panjang dengan hari dalam seminggu dan detik, (2) string datetime pendek tanpa mereka dan (3) versi pendek dari kode.

@echo off
REM "%date: =0%" replaces spaces with zeros
set d=%date: =0%
REM "set yyyy=%d:~-4%" pulls the last 4 characters
set yyyy=%d:~-4%
set mm=%d:~4,2%
set dd=%d:~7,2%
set dow=%d:~0,3%
set d=%yyyy%-%mm%-%dd%_%dow%

set t=%TIME: =0%
REM "%t::=%" removes semi-colons
REM Instead of above, you could use "%t::=-%" to 
REM replace semi-colons with hyphens (or any 
REM non-special character)
set t=%t::=%
set t=%t:.=%

set datetimestr=%d%_%t%
@echo  Long date time str = %datetimestr%

set d=%d:~0,10%
set t=%t:~0,4%
set datetimestr=%d%_%t%
@echo Short date time str = %datetimestr%


@REM Short version of the code above
set d=%date: =0%
set t=%TIME: =0%
set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2%
@echo Datetimestr = %datetimestr%

pause

Untuk memberikan penghargaan yang tepat, saya menggabungkan konsep-konsep dari Peter Mortensen (18 Juni '14 pada 21:02) dan opello (25 Agustus '11 pada 14:27).

Anda dapat menulis ini jauh lebih pendek, tetapi versi panjang ini memudahkan membaca dan memahami kode.

Cadvena
sumber
4

Saya benar-benar baru dalam file batch dan ini adalah kode saya !! (Saya tidak yakin mengapa, tapi saya tidak bisa menggabungkan tanggal / t dan waktu / t bersama-sama dan saya tidak bisa menggunakan % date% dan % time% secara langsung tanpa variabel ...)

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT

Ini semacam digunakan kembali dari orang lain (pertanyaannya adalah untuk mendapatkan batas waktu yang diformat untuk digunakan sebagai nama file).

Kelly
sumber
4

Ada cara mudah lain untuk melakukannya:

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)
vijay
sumber
3

Untuk menghasilkan YYYY-MM-DD hh:mm:sscap waktu (24 jam) yang saya gunakan:

SET CURRENTTIME=%TIME%
IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%)
FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)
M. Dudley
sumber
Apakah itu mengasumsikan pengaturan regional tertentu?
Peter Mortensen
1
Menurut ss64.com/nt/syntax-variables.html yang %TIME%dan %DATE%variabel menggunakan format yang sama seperti TIMEdan DATEperintah, masing-masing. Pada sistem saya, variabel tidak cocok dengan pengaturan regional saya.
M. Dudley
3

Script batch ini akan melakukan persis apa yang diinginkan OP (diuji pada Windows XP SP3).

Saya juga menggunakan trik registri pintar yang dijelaskan oleh "jph" sebelumnya yang IMHO adalah cara paling sederhana untuk mendapatkan 100% format konsisten tanggal "yyyy_MM_dd"pada sistem Windows baru atau lama. Perubahan ke satu nilai Registry untuk melakukan ini bersifat sementara sementara dan sepele; itu hanya berlangsung beberapa milidetik sebelum segera dikembalikan kembali.

Klik dua kali file batch ini untuk demo instan, jendela Command Prompt akan muncul dan menampilkan stempel waktu Anda. . . . .

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: generates a custom formatted timestamp string using date and time.
:: run this batch file for an instant demo.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A

:: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd",
REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul
REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul

SET MYDATE=%date%

:: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE
REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul
REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul

:: --- SPLIT THE TIME [HH:MM:SS.SS] TO THREE SEPARATE VARIABLES [HH] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO (
SET HOUR=%%A
SET MINUTES=%%B
SET SECONDS=%%C
)

:: --- CHOOSE ONE OF THESE TWO OPTIONS :
:: --- FOR 4 DIGIT SECONDS        //REMOVES THE DOT FROM THE SECONDS VARIABLE [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- FOR 2 DIGIT SECONDS        //GETS THE FIRST TWO DIGITS FROM THE SECONDS VARIABLE [SS.SS]
SET SECONDS=%SECONDS:~0,2% 

:: --- FROM 12 AM TO 9 AM, THE HOUR VARIABLE WE EXTRACTED FROM %TIME% RETURNS A SINGLE DIGIT, 
:: --- WE PREFIX A ZERO CHARACTER TO THOSE CASES, SO THAT OUR WANTED TIMESTAMP
:: --- ALWAYS GENERATES DOUBLE-DIGIT HOURS (24-HOUR CLOCK TIME SYSTEM).
IF %HOUR%==0 (SET HOUR=00)
IF %HOUR%==1 (SET HOUR=01)
IF %HOUR%==2 (SET HOUR=02)
IF %HOUR%==3 (SET HOUR=03)
IF %HOUR%==4 (SET HOUR=04)
IF %HOUR%==5 (SET HOUR=05)
IF %HOUR%==6 (SET HOUR=06)
IF %HOUR%==7 (SET HOUR=07)
IF %HOUR%==8 (SET HOUR=08)
IF %HOUR%==9 (SET HOUR=09)

:: --- GENERATE OUR WANTED TIMESTAMP
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%

:: --- VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO.
ECHO    Generate a custom formatted timestamp string using date and time.
ECHO.
ECHO    Your timestamp is:    %TIMESTAMP%
ECHO.
ECHO.
ECHO    Job is done. Press any key to exit . . .
PAUSE > NUL

EXIT
derty2
sumber
Bekerja pada Windows 2019 juga. Saya akan menyimpan solusinya, saya menyukainya :)
user225479
Pertanyaan, saya baru tahu bahwa setelah tengah malam, tanda "0" tertinggal di output. Adakah yang tahu mengapa? Hasil saya dengan skrip Anda memberikan: Stempel waktu Anda adalah: 2019_09_16__0_58_07 Alih-alih ..00_58_07. Tetapi setelah 1 jam berfungsi seperti yang diharapkan (dan itu akan memberikan output: ..01_01_56).
user225479
Saya menambahkan JIKA% JAM% == 0 (SET JAM = 00) ke pernyataan ELSE. Itu harus memperbaikinya, saya harap :)
user225479
Terima kasih atas umpan baliknya @ user225479. Saya telah memperbaiki kodenya. Semua permutasi yang mungkin dari variabel HOUR yang dikonversi ke format 24 jam sekarang akan berfungsi dengan benar. Saya juga memodifikasi tata letak sehingga lebih mudah dibaca.
derty2
2
set hourstr = %time:~0,2%
if "%time:~0,1%"==" " (set hourstr=0%time:~1,1%)
set datetimestr=%date:~0,4%%date:~5,2%%date:~8,2%-%hourstr%%time:~3,2%%time:~6,2%
Will Wu
sumber
2

Buat file yang disebut "search_files.bat" dan tempatkan konten di bawah ini ke dalam file. Kemudian klik dua kali. Variabel% THH% sementara dibuat untuk menangani AM dengan tepat. Jika ada 0 dalam 2 digit pertama waktu, Windows mengabaikan sisa nama file dari file LOG.

CD .
SET THH=%time:~0,2%
SET THH=%THH: =0%
dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG
MacGyver
sumber
2

Saya suka versi pendek di atas @The lorax, tetapi untuk pengaturan bahasa lain mungkin sedikit berbeda.

Misalnya, dalam pengaturan bahasa Jerman (dengan format tanggal alami: dd.mm.yyyy) kueri bulan harus diubah dari 4,2 menjadi 3,2:

@ECHO OFF
: Sets the proper date and time stamp with 24h time for log file naming convention i.e.

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%
: Outputs= 20160727_081040
: (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp)

PAUSE
webMac
sumber
1

Ini adalah 2 sen saya untuk datetime string. Pada MM DD YYYYsistem beralih %DATE:~entri pertama dan kedua .

    REM ====================================================================================
    REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME
    REM ====================================================================================
    REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character)
    REM ====================================================================================
    REM CHECK for SHORTDATE dd DDxMMxYYYY 
    IF "%DATE:~0,1%" GTR "3" (
        SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    ) ELSE (
    REM ASSUMES SHORTDATE DDxMMxYYYY
        SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
        )
    REM CORRECT FOR HOURS BELOW 10
    IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5%
    ECHO %DATETIME%
Kasus
sumber
1

Saya mencoba jawaban yang diterima dan itu bekerja dengan cukup baik. Sayangnya Format Waktu AS tampaknya H: MM: SS.CS, dan 0 yang hilang di bagian depan menyebabkan masalah penguraian sebelum jam 10 pagi. Untuk mengatasi rintangan ini dan juga memungkinkan parsing sebagian besar format waktu dunia, saya datang dengan rutin sederhana ini yang tampaknya bekerja dengan sangat baik.

:ParseTime
rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99
FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d"
GOTO :EOF

Yang menyenangkan dengan rutin ini adalah Anda melewatkan string waktu sebagai parameter pertama dan nama variabel lingkungan yang Anda inginkan untuk memuat waktu (dalam centidetik) sebagai parameter kedua. Sebagai contoh:

CALL :ParseTime %START_TIME% START_CS
CALL :ParseTime %TIME% END_CS
SET /A DURATION=%END_CS% - %START_CS%

(* Chris *)

TheChrisPratt
sumber
1

Mungkin kira-kira seperti ini:

@call:DateTime

@for %%? in (
    "Year   :Y"
    "Month  :M"
    "Day    :D"
    "Hour   :H"
    "Minutes:I"
    "Seconds:S"
) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_

:: OUTPUT
:: Year    : _DT_Y_ : 2014
:: Month   : _DT_M_ : 12
:: Day     : _DT_D_ : 17
:: Hour    : _DT_H_ : 09
:: Minutes : _DT_I_ : 04
:: Seconds : _DT_S_ : 35

@pause>nul

@goto:eof

:DateTime
    @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1
    @if not errorlevel 1 (
        @for /f "skip=1 tokens=1-6" %%a in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" )
    ) else (
        @set "_DT_T_=1234567890 "
    )
    @if errorlevel 1 (
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?"
        @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c"
    )
    @if errorlevel 1 (
        @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_")
        @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c"
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_="
    )
    @for %%i in ("Y"                ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=  0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k"
    @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k"
@exit/b
SerGeeK Kasimov
sumber
1

Dalam situasi seperti ini, gunakan pendekatan pemrograman standar yang sederhana: Alih-alih mengeluarkan upaya besar untuk mem-parsing entitas yang tidak dikenal, cukup simpan konfigurasi saat ini, setel ulang ke status yang diketahui, ekstrak info dan kemudian kembalikan ke kondisi semula. Gunakan hanya sumber daya Windows standar.

Secara khusus, format tanggal dan waktu disimpan di bawah kunci registri HKCU \ Control Panel \ International \ dalam [definisi MS] "nilai": "sTimeFormat" dan "sShortDate". Reg adalah editor registri konsol yang disertakan dengan semua versi Windows. Hak istimewa yang ditingkatkan tidak diperlukan untuk memodifikasi kunci HKCU

Prompt $N:$D $T$G

::Save current config to a temporary (unique name) subkey, Exit if copy fails
Set DateTime=
Set ran=%Random%
Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f
If ErrorLevel 1 GoTO :EOF

::Reset the date format to your desired output format (take effect immediately)
::Resetting the time format is useless as it only affect subsequent console windows
::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss"   /f
Reg add "HKCU\Control Panel\International" /v sShortDate  /d "yyyy_MM_dd" /f

::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros
Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2%
Set DateTime=%DateTime: =0%

::Restore the original config and delete the temp subkey, Exit if restore fails
Reg copy   "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f
If ErrorLevel 1 GoTO :EOF
Reg delete "HKCU\Control Panel\International-Temp%ran%" /f

Sederhana, mudah dan harus bekerja untuk semua wilayah.

Untuk alasan yang saya tidak mengerti, mengatur ulang nilai "sShortDate" segera berlaku di jendela konsol tetapi mengatur ulang nilai "sTimeFormat" yang sangat mirip TIDAK berlaku sebelum jendela konsol baru dibuka. Namun, satu-satunya hal yang dapat diubah adalah pembatas - posisi digitnya tetap. Demikian pula token waktu "HH" seharusnya menambah nol di awal tetapi tidak. Untungnya, penyelesaiannya mudah.

ArtK
sumber
-1 "Alih-alih menambahkan nol di depan, mengapa Anda tidak mengganggu konfigurasi mesin, ubah ke kebutuhan acak Anda dan kemudian lakukan hal Anda?" Pendekatan ini keluar dari dunia ini, membutuhkan upaya yang cukup besar dan dapat menyebabkan angka yang tak terbatas dari konsekuensi yang tidak diinginkan. Dan saya bahkan tidak ingin memulai diskusi tentang keterbacaan dan perilaku kode standar yang diharapkan. pujian.
vaitrafra
Menyetel ulang sTimeFormatformat waktu tidak berguna . Nggak. Karena memengaruhi prompt konsol berikutnya, terapkan menggunakanfor /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
JosefZ
1

Skrip ini menggunakan antarmuka WMI yang diakses primer melalui alat WMIC, yang merupakan bagian integral dari Windows sejak Windows XP Professional (edisi Home juga didukung, tetapi alat ini tidak diinstal secara default). Script juga mengimplementasikan solusi alat WMIC yang hilang dengan membuat dan memanggil vbscript WSH untuk mengakses antarmuka WMI dan menulis ke konsol output waktu dengan format yang sama seperti alat WMIC menyediakan.

@ECHO OFF
REM Returns: RETURN
REM Modify:  RETURN, StdOut
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond

CALL :getTime %*
ECHO %RETURN%
GOTO :EOF


REM SUBROUTINE
REM Returns: RETURN
REM Modify:  RETURN
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond
:getTime
  SETLOCAL EnableDelayedExpansion
    SET DELIM=-
    WHERE /Q wmic.exe
    IF NOT ERRORLEVEL 1 FOR /F "usebackq skip=1 tokens=*" %%x IN (`wmic.exe os get LocalDateTime`) DO (SET DT=%%x & GOTO getTime_Parse)
    SET _TMP=%TEMP:"=%
    ECHO Wscript.StdOut.WriteLine (GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").LocalDateTime)>"%_TMP%\get_time_local-helper.vbs"
    FOR /F "usebackq tokens=*" %%x IN (`cscript //B //NoLogo "%_TMP%\get_time_local-helper.vbs"`) DO (SET DT=%%x & GOTO getTime_Parse)
    :getTime_Parse
      SET _RET=
      IF "%1" EQU "" (
        SET _RET=%DT:~0,4%%DELIM%%DT:~4,2%%DELIM%%DT:~6,2%%DELIM%%DT:~8,2%%DELIM%%DT:~10,2%%DELIM%%DT:~12,2%%DELIM%%DT:~15,3%
      ) ELSE (
        REM Not recognized format strings are ignored during parsing - no error is reported.
       :getTime_ParseLoop
         SET _VAL=
         IF "%1" EQU "YYYY" SET _VAL=%DT:~0,4%
         IF "%1" EQU "MM"   SET _VAL=%DT:~4,2%
         IF "%1" EQU "DD"   SET _VAL=%DT:~6,2%
         IF "%1" EQU "hh"   SET _VAL=%DT:~8,2%
         IF "%1" EQU "mm"   SET _VAL=%DT:~10,2%
         IF "%1" EQU "ss"   SET _VAL=%DT:~12,2%
         IF "%1" EQU "ms"   SET _VAL=%DT:~15,3%
         IF DEFINED _VAL (
           IF DEFINED _RET (
             SET _RET=!_RET!%DELIM%!_VAL!
           ) ELSE (
             SET _RET=!_VAL!
           )
         )
         SHIFT
         IF "%1" NEQ "" GOTO getTime_ParseLoop
      )
  ENDLOCAL & SET RETURN=%_RET%
GOTO :EOF
Petr Matlas
sumber
1

Trik single-line yang bagus untuk menghindari ekspansi variabel awal adalah menggunakan cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%
tresf
sumber
0
:: =============================================================
:: Batch file to display Date and Time seprated by undescore.
:: =============================================================
:: Read the system date.
:: =============================================================
@SET MyDate=%DATE%
@SET MyDate=%MyDate:/=:%
@SET MyDate=%MyDate:-=:%
@SET MyDate=%MyDate: =:%
@SET MyDate=%MyDate:\=:%
@SET MyDate=%MyDate::=_%
:: =============================================================
:: Read the system time.
:: =============================================================
@SET MyTime=%TIME%
@SET MyTime=%MyTime: =0%
@SET MyTime=%MyTime:.=:%
@SET MyTime=%MyTime::=_%
:: =============================================================
:: Build the DateTime string.
:: =============================================================
@SET DateTime=%MyDate%_%MyTime%
:: =============================================================
:: Display the Date and Time as it is now.
:: =============================================================
@ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%"
:: =============================================================
:: Wait before close.
:: =============================================================
@PAUSE
:: =============================================================
Christo
sumber
0

Untuk solusi yang sangat sederhana untuk tanggal numerik untuk digunakan dalam nama file, gunakan kode berikut:

set month=%date:~4,2%
set day=%date:~7,2%
set curTimestamp=%month%%day%%year%

rem then the you can add a prefix and a file extension easily like this
echo updates%curTimestamp%.txt
Thomas Boomer
sumber
0

Bagi hasil perintah tanggal dengan garis miring, lalu Anda dapat memindahkan setiap token ke dalam variabel yang sesuai.

FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO (
SET _Month=%%a
SET _Day=%%b
SET _Year=%%c
)
ECHO Month %_Month%
ECHO Day %_Day%
ECHO Year %_Year%
Casey
sumber