Định dạng ngày và giờ trong tập lệnh bó Windows


192

Trong tập lệnh bó của Windows (Windows XP), tôi cần định dạng ngày và giờ hiện tại để sử dụng sau này trong tên tệp, v.v.

Nó tương tự như câu hỏi Stack Overflow Làm thế nào để nối một ngày trong các tệp bó , nhưng cũng có thời gian.

Tôi có cái này cho đến nay:

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%

cung cấp cho:

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

Có cách nào tôi có thể cho phép một giờ chữ số trong% TIME%, để tôi có thể nhận được những điều sau không?

2009_07_28__08_36_01



Bạn có thể thay thế các khoảng trống trên datetimefbiến của mình và thay vào đó là 0. Trên ví dụ của bạn:SET datetimef=%datetimef: =0%
SebaGra

Câu trả lời:


148

Tôi đã kết thúc với kịch bản này:

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%

:: Trên WIN2008R2, ví dụ: Tôi cần phải thực hiện 'set tháng =% ngày: ~ 3,2%' như bên dưới :: nếu không thì 00 xuất hiện cho THÁNG

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%

11
FYI, trên Windows Server 2003 và trên Windows 7, tập lệnh này đã cho tôi "201200Mo_085806" (đúng năm & giờ).
sfuqua

50
Lưu ý cho ai đó sẽ đến đây từ Google (như tôi): Đây là phụ thuộc địa phương, do đó, nó có thể yêu cầu các tinh chỉnh để hoạt động trên Windows không phải tiếng Anh!
PiotrK

tôi đã làm theo cách này: Time / T> Time.dat set / P ftime = <Time.dat set fDate =% date: ~ 6 %% ngày: ~ 3,2 %% ngày: ~ 0,2 %% ftime: ~ 0,2 %% ftime: ~ 3,2% echo% fDate% -> 201310170928
Ice

% Time: ~ 0,2% làm gì ở đâu là một số tài liệu về cấu trúc: ~,%?
user1605665

6
Tất cả điều này có thể được thực hiện chỉ trong 2 dòng bằng cách sử dụng thay thế chuỗi thông thường: 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

2
Trên Windows Server 2003 và trên Windows 7, điều này đã cho tôi chuỗi đúng. Thanh lịch hơn nhiều so với những gì tôi đã xây dựng trong quá khứ, vì vậy cảm ơn bạn!
sfuqua

3
Đây là những gì nó mang lại cho tôi trong Windows 7 với ngôn ngữ Nga. Thời gian hiện tại là 2013-05-03T02: 22: 51, nhưng các bản in kịch bản: "2013-5.-01_02_22_51"
nightcoder

7
% Date% sẽ cung cấp các chuỗi khác nhau với ngôn ngữ khác nhau.
AechoLiu

2
trả lại 20146.0._173502 cho tôi (miền địa phương)
Muflix

2
win7 64 bit cuối cùng, thời gian không chính xác: 20140.01_131612, phải là (2014.10.26_131612)
waza123

66

Đây là cách tôi tạo một tên tệp nhật ký (dựa trên 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
...

5
câu trả lời tốt nhất về SO cho các câu hỏi về việc tạo dấu thời gian độc lập cục bộ theo đợt.
Mike Campbell

2
Tuyệt vời! Cần có một cách để đánh dấu đây là giải pháp
Rado

48

Tôi thường làm theo cách này bất cứ khi nào tôi cần chuỗi ngày / thời gian:

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

Đây là định dạng ngày / giờ của Đức (dd.mm.yyyy hh: mm: ss). Về cơ bản, tôi ghép các chuỗi con và cuối cùng thay thế tất cả các khoảng trống bằng số không.

Giải thích ngắn về cách thức hoạt động của chất nền:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

Vì vậy, để có được chỉ một năm kể từ ngày như "29.03.2018", hãy sử dụng:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 

7
cho đến nay là giải pháp thanh lịch nhất khi bạn chỉ cần một dấu thời gian sạch sẽ (không có dấu cách hoặc ký tự khác)
jvdneste

1
Không thể đồng ý nhiều hơn với @jvdneste cảm ơn vì đã chia sẻ mrt
this.user3272243

1
hoàn toàn tuyệt vời - và hoạt động [cú pháp yêu cầu rất khó hiểu, nhưng đó hầu như không phải là vấn đề của người đăng]
JosephDoggie

38

Nếu PowerShell được cài đặt, thì bạn có thể dễ dàng và đáng tin cậy lấy Ngày / Giờ theo bất kỳ định dạng nào bạn muốn, ví dụ:

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

Tất nhiên hiện nay PowerShell luôn được cài đặt, nhưng trên Windows XP, bạn có thể chỉ muốn sử dụng kỹ thuật này nếu tập lệnh bó của bạn đang được sử dụng trong môi trường đã biết nơi bạn biết PS có sẵn (hoặc kiểm tra tệp bó của bạn nếu PowerShell có sẵn ...)

Bạn có thể hỏi một cách hợp lý: tại sao hoàn toàn sử dụng một tệp bó nếu bạn có thể sử dụng PowerShell để lấy ngày / giờ, nhưng tôi nghĩ một số lý do rõ ràng là: (a) bạn không quen thuộc với PowerShell và vẫn thích làm nhất mọi thứ theo cách lỗi thời với các tệp bó hoặc (b) bạn đang cập nhật một tập lệnh cũ và không muốn chuyển toàn bộ sang PS.


(a) trong trường hợp của tôi, và điều này hoạt động hoàn hảo (dơi chỉ dành cho môi trường của tôi nhưng tôi có các địa điểm hỗn hợp trên các chiếc khác nhau). Cảm ơn bạn!
ccalboni

30

Tôi đã gặp vấn đề này ngày hôm nay và giải quyết nó bằng:

SET LOGTIME=%TIME: =0%

Nó thay thế khoảng trắng bằng 0 và về cơ bản là không có giờ.

Sau một số tìm kiếm nhanh, tôi đã không tìm hiểu xem nó có yêu cầu các phần mở rộng lệnh không (vẫn hoạt động với SETLOCAL DISABLEEXTENSION).


OK, thay thế trong các biến. Bây giờ - làm thế nào để thay thế một dấu hai chấm ( :)?
Tomasz Gandor

@TomaszGandor Điều này hiệu quả với tôi: echo %TIME: =:%nhưng nếu nó không có thể hãy thử thoát :với một lượt ^thích echo %TIME: =^:%(cũng phù hợp với tôi).
opello

1
+1 cho đơn giản. Dấu hai chấm không hợp lệ trong tên tệp. đặt theTime =% Time :: =% xóa chúng. Bạn có thể thay thế 0 cho không gian, xóa dấu hai chấm và cắt ngắn thành 6 ký tự (do đó xóa phần thập phân) trong một câu lệnh không? Nó không phải là vấn đề lớn nếu phải mất hai hoặc ba dòng. Tôi chỉ tò mò thôi.
riderBill 26/03/18

Không phải tôi biết. Vui lòng theo dõi nếu bạn tìm thấy một!
opello

21

Như đã lưu ý, phân tích ngày và thời gian chỉ hữu ích nếu bạn biết định dạng đang được sử dụng bởi người dùng hiện tại (ví dụ: MM / dd / yy hoặc dd-MM-yyyy chỉ để đặt tên hai). Điều này có thể được xác định, nhưng khi bạn thực hiện tất cả các thao tác nhấn mạnh và phân tích cú pháp, bạn vẫn sẽ gặp phải một số tình huống có định dạng không mong muốn được sử dụng và sẽ cần thêm nhiều điều chỉnh.

Bạn cũng có thể sử dụng một số chương trình bên ngoài sẽ trả về sên ngày ở định dạng ưa thích của bạn, nhưng điều đó có nhược điểm là cần phân phối chương trình tiện ích với tập lệnh / lô của bạn.

Ngoài ra còn có các thủ thuật hàng loạt sử dụng đồng hồ CMOS theo cách khá thô, nhưng đó là gần với dây trần đối với hầu hết mọi người, và cũng không phải lúc nào cũng là nơi ưa thích để lấy ngày / giờ.

Dưới đây là một giải pháp tránh các vấn đề trên. Vâng, nó giới thiệu một số vấn đề khác, nhưng với mục đích của tôi, tôi thấy đây là giải pháp dễ dàng nhất, rõ ràng nhất, dễ mang theo nhất để tạo một dấu thời gian trong các tệp .bat cho các hệ thống Windows hiện đại. Đây chỉ là một ví dụ, nhưng tôi nghĩ bạn sẽ thấy cách sửa đổi cho các định dạng ngày và / hoặc thời gian khác, v.v.

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

3
Chỉ cần những gì tôi đang tìm kiếm. Một cái gì đó hoạt động trên mọi thiết lập địa phương. Cảm ơn!
Lost_DM

+1 cho "các hệ thống Windows hiện đại" mà chúng ta có thể giải quyết :) Đùa sang một bên, đây là một cách rất khéo léo, và như bạn đã nói, di động, cách xử lý vấn đề.
Zach Young

9
Đây là một giải pháp khủng khiếp. Nếu thất bại thì cài đặt toàn cục sẽ thay đổi vĩnh viễn. Nó cũng giới thiệu điều kiện cuộc đua với các ứng dụng khác.
MikeKulls

Bạn có thể sử dụng reg query "HKCU\Control Panel\International" /v sShortDatephần mà không thay đổi cài đặt đăng ký (bài tập để lại cho người đọc!).
tricasse

9

Sau đây có thể không phải là một câu trả lời trực tiếp mà là một câu trả lời gần gũi?

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%

Ít nhất nó có thể được truyền cảm hứng.


9

Nếu bạn không chính xác cần định dạng này:

2009_07_28__08_36_01

Sau đó, bạn có thể sử dụng 3 dòng mã sau sử dụng% date% và% time%:

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

Lưu ý: Các ký tự /:được loại bỏ và ký tự .và khoảng trắng được thay thế bằng dấu gạch dưới.

Kết quả đầu ra (lấy thứ Tư ngày 8/5/15 lúc 12:49 PM với 50 giây và 93 mili giây):

echo %mytimestamp%
Wed_08052015_124950_93

khi giờ nhỏ hơn 12, hãy đặt mydate =% date: / =% set mytime =% time :: =% set mytime =% mytime: = 0% set 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%

6

Định offset:lengthdạng được hỗ trợ với SETlệnh trong Windows sẽ không cho phép bạn đệm 0như bạn có vẻ quan tâm.

Tuy nhiên, bạn có thể mã một tập lệnh BATCH để kiểm tra số giờ nhỏ hơn 10
đệm theo một echochuỗi khác .

Bạn sẽ tìm thấy một số thông tin về SETlệnh trên liên kết này .


Bạn cũng có thể thay đổi các phương pháp lập trình khác để đến đây.

Nó khá đơn giản trong unix bash (có sẵn với Cygwin trên Windows) để chỉ nói,

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

Và, nó luôn luôn đệm chính xác.


6

Tôi đã làm theo cách này:

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


Nó chạy trên máy chủ tiếng Anh (Tên hệ điều hành: Microsoft (R) Windows (R) Server 2003 Phiên bản x64 tiêu chuẩn, Phiên bản hệ điều hành: 5.2.3790 Gói dịch vụ 2 Build 3790)
Ice

1
và cũng đã thử nghiệm trên máy chủ Đức (Betriebssystemname: Microsoft® Windows Server® 2008 Enterprise, Betriebssystemversion: 6.0.6002 Gói dịch vụ 2 Build 6002)
Ice

1
Ngay cả điều này cũng ổn: (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%  

Dòng đầu tiên luôn xuất ra theo định dạng này theo múi giờ:
20150515150941.077000 + 120
Điều này khiến bạn chỉ cần định dạng đầu ra để phù hợp với mong muốn của bạn.


4

Tệp bat này (lưu dưới dạng datetimestr.bat) tạo ra chuỗi datetime 3 lần: (1) chuỗi datetime dài với ngày trong tuần và giây, (2) chuỗi datetime ngắn không có chúng và (3) phiên bản ngắn của mã.

@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

Để cung cấp tín dụng phù hợp, tôi đã hợp nhất các khái niệm từ Peter Mortensen (ngày 18 tháng 6 năm 14 lúc 21:02) và opello (ngày 25 tháng 8 năm 11 lúc 14:27).

Bạn có thể viết cái này ngắn hơn nhiều, nhưng phiên bản dài này giúp cho việc đọc và hiểu mã dễ dàng.


4

Tôi thực sự mới đối với các tệp bó và đây là mã của tôi !! (Tôi không chắc tại sao, nhưng tôi không thể kết hợp ngày / tthời gian / t với nhau và tôi không thể sử dụng trực tiếp % date%% time% mà không có biến ...)

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

Nó là loại được sử dụng lại từ những người khác (câu hỏi là lấy một định thời gian được định dạng để sử dụng làm tên tệp).


4

Có một cách dễ dàng khác để làm điều đó:

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

3

Để tạo YYYY-MM-DD hh:mm:ssdấu thời gian (24 giờ) tôi sử dụng:

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

Nó có giả định một thiết lập khu vực cụ thể?
Peter Mortensen

1
Theo ss64.com/nt/syntax-variables.html sự %TIME%%DATE%các biến sử dụng định dạng giống như TIMEDATEcác lệnh tương ứng. Trên hệ thống của tôi, các biến không khớp với cài đặt khu vực của tôi.
M. Dudley

3

Tập lệnh bó này sẽ thực hiện chính xác những gì OP muốn (đã thử nghiệm trên Windows XP SP3).

Tôi cũng đã sử dụng thủ thuật đăng ký thông minh được mô tả bởi "jph" trước đây mà IMHO là cách đơn giản nhất để có được định dạng nhất quán 100% của ngày "yyyy_MM_dd"trên bất kỳ hệ thống Windows mới hay cũ. Thay đổi thành một giá trị Registry để thực hiện điều này là tạm thời và tầm thường; nó chỉ tồn tại trong một vài phần nghìn giây trước khi nó được hoàn nguyên ngay lập tức.

Bấm đúp vào tệp bó này để xem bản demo tức thì, cửa sổ Dấu nhắc Lệnh sẽ bật lên và hiển thị dấu thời gian của bạn. . . . .

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 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

Hoạt động trên Windows 2019 cũng vậy. Tôi sẽ giữ giải pháp của bạn xung quanh, tôi thích nó :)
user225479

Câu hỏi, tôi mới phát hiện ra rằng sau nửa đêm, dấu "0" bị mất trong đầu ra. Bất cứ ý tưởng như tại sao? Đầu ra của tôi với tập lệnh của bạn cung cấp: Dấu thời gian của bạn là: 2019_09_16__0_58_07 Thay vì ..00_58_07. Nhưng sau 1 giờ, nó hoạt động như mong đợi (và nó sẽ cho đầu ra: ..01_01_56).
dùng225479

Tôi đã thêm IF% HOUR% == 0 (SET HOUR = 00) vào câu lệnh ELSE. Điều đó sẽ khắc phục nó, tôi hy vọng :)
user225479

Cảm ơn phản hồi @ user225479. Tôi đã sửa mã. Tất cả các hoán vị có thể có của biến HOUR được chuyển đổi sang định dạng 24 GIỜ sẽ hoạt động chính xác. Tôi cũng đã sửa đổi bố cục để dễ đọc hơn.
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%

2

Tạo một tệp có tên "search_files.bat" và đặt nội dung bên dưới vào tệp. Sau đó nhấp đúp chuột vào nó. Biến% THH% tạm thời được đưa ra để xử lý AM một cách thích hợp. Nếu có 0 trong 2 chữ số đầu tiên của thời gian, Windows sẽ bỏ qua phần còn lại của tên tệp của tệp 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

2

Tôi thích phiên bản ngắn ở đầu @ The lorax, nhưng đối với các cài đặt ngôn ngữ khác, nó có thể hơi khác một chút.

Ví dụ: trong cài đặt ngôn ngữ tiếng Đức (với định dạng ngày tự nhiên: dd.mm.yyyy), truy vấn tháng phải được thay đổi từ 4.2 thành 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

1

Đây là 2 xu của tôi cho a datetime string. Trên MM DD YYYYhệ thống chuyển các mục đầu tiên và thứ hai %DATE:~.

    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%

1

Tôi đã thử câu trả lời được chấp nhận và nó hoạt động khá tốt. Thật không may, Định dạng Thời gian của Hoa Kỳ dường như là H: MM: SS.CS và số 0 bị thiếu ở mặt trước đã gây ra sự cố phân tích cú pháp trước 10 giờ sáng. Để vượt qua rào cản này và cũng cho phép phân tích hầu hết các định dạng thời gian trên thế giới, tôi đã nghĩ ra thói quen đơn giản này có vẻ hoạt động khá tốt.

: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

Điều thú vị với thói quen này là bạn truyền vào chuỗi thời gian dưới dạng tham số đầu tiên và tên của biến môi trường bạn muốn chứa thời gian (tính bằng centis giây) làm tham số thứ hai. Ví dụ:

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

(* Chris *)


1

Có lẽ một cái gì đó như thế này:

@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

1

Trong các tình huống như thế này, hãy sử dụng một phương pháp lập trình tiêu chuẩn, đơn giản: Thay vì tốn một nỗ lực lớn để phân tích một thực thể không xác định, chỉ cần lưu cấu hình hiện tại, đặt lại về trạng thái đã biết, trích xuất thông tin và sau đó khôi phục trạng thái ban đầu. Chỉ sử dụng tài nguyên Windows tiêu chuẩn.

Cụ thể, các định dạng ngày và giờ được lưu trữ dưới khóa đăng ký HKCU \ Control Panel \ International \ in [định nghĩa MS] "giá trị": "sTimeFormat" và "sShortDate". Reg là trình chỉnh sửa sổ đăng ký giao diện điều khiển có trong tất cả các phiên bản Windows. Đặc quyền nâng cao không bắt buộc phải sửa đổi khóa 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

Đơn giản, dễ hiểu và nên làm việc cho tất cả các vùng.

Vì những lý do tôi không hiểu, việc đặt lại giá trị "sShortDate" sẽ có hiệu lực ngay lập tức trong cửa sổ bảng điều khiển nhưng đặt lại giá trị "sTimeFormat" tương tự KHÔNG có hiệu lực cho đến khi cửa sổ bảng điều khiển mới được mở. Tuy nhiên, điều duy nhất có thể thay đổi là dấu phân cách - các vị trí chữ số được cố định. Tương tự, mã thông báo thời gian "HH" được cho là để trả trước các số 0 đứng đầu nhưng không. May mắn thay, cách giải quyết là dễ dàng.


-1 "Thay vì thêm số 0 đứng đầu, tại sao bạn không phá vỡ cấu hình máy, thay đổi nó thành nhu cầu ngẫu nhiên của bạn và sau đó làm việc của bạn?" Cách tiếp cận này nằm ngoài thế giới này, đòi hỏi một nỗ lực đáng kể và có thể dẫn đến một số lượng vô hạn các hậu quả không mong muốn. Và tôi thậm chí không muốn bắt đầu cuộc thảo luận về khả năng đọc và hành vi mã dự kiến ​​tiêu chuẩn. thanh danh.
vaitrafra

Đặt lại sTimeFormatđịnh dạng thời gian là vô ích . Không. Vì nó ảnh hưởng đến lời nhắc bàn điều khiển tiếp theo, hãy áp dụng nó bằng cách sử dụngfor /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
JosefZ

1

Tập lệnh này sử dụng giao diện WMI được truy cập chính thông qua công cụ WMIC, đây là một phần không thể thiếu của Windows kể từ Windows XP Professional (Phiên bản gia đình cũng được hỗ trợ, nhưng công cụ này không được cài đặt theo mặc định). Kịch bản cũng thực hiện một cách giải quyết của công cụ WMIC bị thiếu bằng cách tạo và gọi một vbscript WSH để truy cập vào giao diện WMI và ghi vào bảng điều khiển xuất thời gian với định dạng giống như công cụ WMIC cung cấp.

@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

1

Một mẹo đơn dòng đẹp để tránh mở rộng biến sớm là sử dụng cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%

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
:: =============================================================

0

Đối với một giải pháp rất đơn giản cho ngày số để sử dụng trong tên tệp, hãy sử dụng mã sau đây:

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

0

Chia kết quả của lệnh date bằng dấu gạch chéo, sau đó bạn có thể di chuyển từng mã thông báo thành các biến thích hợp.

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%
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.