Відформатуйте дату та час у пакетному сценарії Windows


193

У пакетному сценарії Windows (Windows XP) мені потрібно відформатувати поточну дату та час для подальшого використання у назвах файлів тощо.

Це схоже на питання щодо переповнення стека Як додати дату в пакетні файли , але з часом також.

У мене це є поки:

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%

що дає:

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

Чи можна дозволити однозначну годину в% TIME%, тож я можу отримати наступне?

2009_07_28__08_36_01



Ви можете замінити порожні пробіли у своїй datetimefзмінній, а замість них поставити 0. На вашому прикладі:SET datetimef=%datetimef: =0%
SebaGra

Відповіді:


148

Я закінчив цей сценарій:

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%

:: На WIN2008R2, наприклад, мені потрібно було зробити ваш "встановлений місяць =% дата: ~ 3,2%", як показано нижче: інакше 00 з'являється для місяця

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, на Windows Server 2003 та Windows 7, цей сценарій дав мені "201200Mo_085806" (правильний рік та час).
sfuqua

50
Як зауваження для когось, хто приїде сюди з Google (як я): Це залежить від локальності, тому може знадобитися налаштування для роботи в не-англійських Windows!
PiotrK

я зробив це так: Time / T> Time.dat set / P ftime = <Time.dat set fDate =% дата: ~ 6 %% дата: ~ 3,2 %% дата: ~ 0,2 %% ftime: ~ 0,2 %% ftime: ~ 3,2% echo% fDate% -> 201310170928
Ice

Що означає% time: ~ 0,2%, де є якась документація про структуру: ~,%?
user1605665

6
Все це можна зробити всього за два рядки, використовуючи звичайну заміну рядків: stackoverflow.com/a/23558738/1879699
Андреас

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
У Windows Server 2003 та Windows 7 це дало мені правильну рядок. Набагато елегантніше, ніж те, що я будував у минулому, тож дякую!
sfuqua

3
Ось що він дає мені в Windows 7 з російською мовою. Поточний час - 2013-05-03T02: 22: 51, але сценарій друкує: "2013-5.-01_02_22_51"
нічний кодер

7
% Date% дасть різний рядок з різною локаллю.
AechoLiu

2
повертає 20146.0._173502 для мене (чеська мова)
Muflix

2
win7 64bit ultimate, неправильний час: 20140.01_131612, must be (2014.10.26_131612)
waza123

66

Ось як я генерую ім’я файлу журналу (на основі 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
найкраща відповідь на SO на запитання про незалежне від локалі генерування часових міток у пакетному режимі.
Майк Кемпбелл

2
Дивовижно! Має бути спосіб позначити це як рішення
Радо

49

Я зазвичай роблю це так, коли мені потрібна рядок дати / часу:

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

Це для німецького формату дати / часу (dd.mm.yyyy hh: mm: ss). В основному я об'єдную підрядки і, нарешті, замінюю всі пробіли нулями.

Коротке пояснення того, як працюють підрядки:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

Тож, щоб отримати лише рік із дати, наприклад "29.03.2018", використовуйте:

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

7
на сьогодні найвишуканіше рішення, коли вам просто потрібна чиста мітка часу (без пробілів та інших символів)
jvdneste

1
Не можу більше погодитися з @jvdneste дякую за те, що поділився
мерт

1
абсолютно чудово - і працює [потрібний синтаксис дуже заплутаний, але це навряд чи проблема плаката]
JosephDoggie

38

Якщо PowerShell встановлений, ви можете легко та надійно отримати дату / час у будь-якому бажаному вам форматі, наприклад:

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

Звичайно, в наш час PowerShell завжди встановлюється, але на Windows XP, ймовірно, ви хочете використовувати цю техніку лише в тому випадку, якщо ваш пакетний сценарій використовується у відомій середовищі, де ви знаєте, що PS доступний (або перевірте у своєму пакетному файлі, чи PowerShell доступний ...)

Ви можете з розумом запитати: навіщо взагалі використовувати пакетний файл, якщо ви можете використовувати PowerShell для отримання дати / часу, але я думаю, що деякі очевидні причини: (а) ви не все так добре знайомі з PowerShell і все ще вважаєте за краще робити більшість речі старомодним способом за допомогою пакетних файлів або (b) ви оновлюєте старий сценарій і не хочете переносити всю річ на PS.


(а) в моєму випадку це працює чудово (bat є лише для мого середовища, але у мене змішані локалі на різних ПК). Дякую!
ccalboni

30

Я сьогодні зіткнувся з цією проблемою і вирішив її:

SET LOGTIME=%TIME: =0%

Він замінює пробіли 0 і в основному нульовими прокладками годину.

Після швидкого пошуку я не з’ясував, чи потрібні розширення команд (все ще працював із SETLOCAL DISABLEEXTENSIONS).


Гаразд, заміщення змінних. Тепер - як замінити двокрапку ( :)?
Томаш Гандор

@TomaszGandor Це працює для мене: echo %TIME: =:%але якщо це не можливо , спробувати Вислизаючий :з ^як echo %TIME: =^:%(який також працює для мене).
opello

1
+1 для простоти. Кольори не відповідають дійсності в іменах. встановити theTime =% Time :: =% видаляє їх. Чи можете ви замінити 0 на пробіл, видалити колонки та скоротити до 6 символів (таким чином видаливши десяткову частину) в одному операторі? Це не так вже й багато, якщо це займе два-три рядки. Мені просто цікаво.
вершникBill

Не те, що я знаю. Будь ласка, слідкуйте, якщо ви знайдете його!
opello

21

Як уже зазначалося, аналіз дати та часу корисний лише у тому випадку, якщо ви знаєте формат, який використовується поточним користувачем (наприклад, MM / dd / yy або dd-MM-yyyy, щоб назвати два). Це може бути визначено, але до того моменту, коли ви зробите всі напруження та синтаксичний аналіз, ви все одно опинитесь до ситуації, коли використовується несподіваний формат, і буде потрібно більше налаштувань.

Ви також можете скористатися деякою зовнішньою програмою, яка поверне кулю дати у бажаному форматі, але у неї є недоліки необхідності розповсюдження утиліти з вашим сценарієм / партією.

Існують також пакетні трюки, що використовують годинник CMOS досить сирим способом, але це занадто близько до голих проводів для більшості людей, а також не завжди є бажаним місцем для пошуку дати / часу.

Нижче наведено рішення, яке дозволяє уникнути перерахованих вище проблем. Так, це вносить деякі інші проблеми, але для моїх цілей я виявив це найпростішим, найяснішим, найпотужнішим рішенням для створення позначки дати у .bat файлах для сучасних систем Windows. Це лише приклад, але я думаю, ви побачите, як змінити інші формати дати та / або часу тощо.

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
Тільки те, що я шукав. Щось, що працює в усіх локальних налаштуваннях. Дякую!
Lost_DM

+1 для "сучасних систем Windows", з якими ми маємо мати справу :) Жартуючи вбік, це дуже геніальний і, як ви сказали, портативний спосіб вирішення проблеми.
Зак Янг

9
Це жахливе рішення. Якщо це не вдалося, глобальна настройка буде постійно змінена. Він також знайомить умови гонки з іншими програмами.
MikeKulls

Ви можете використовувати цю reg query "HKCU\Control Panel\International" /v sShortDateчастину, не змінюючи налаштування реєстру (вправа залишається читачеві!).
tricasse

9

Наступне може бути не прямою відповіддю, а близькою?

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%

Принаймні, це може бути надихаючим.


9

Якщо вам точно не потрібен цей формат:

2009_07_28__08_36_01

Тоді ви можете використовувати наступні 3 рядки коду, який використовує% date% та% time%:

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

Примітка: символи /та :видаляються, а символ .та пробіл замінюються підкресленням.

Приклад виводу (зроблений у середу 8/5/15 о 12:49 за 50 секунд та 93 мілісекунди):

echo %mytimestamp%
Wed_08052015_124950_93

коли година менше 12, встановіть 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

offset:lengthФорматування підтримується з SETкомандою в Windows , не дозволить вам з планшетом , 0як вам здається, бути зацікавлені в.

Однак ви можете зашифрувати сценарій BATCH, щоб перевірити, чи година менше, 10і
прокладіть відповідно іншим echoрядком.

Ви знайдете інформацію про SETкоманду за цим посиланням .


Ви також можете перейти на інші методи програмування, щоб потрапити сюди.

У Unix bash досить просто (доступно з Cygwin в Windows), просто сказати:

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

І, це завжди колодки правильно.


6

Я зробив це так:

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


Він працює на англійському сервері (Назва ОС: Microsoft (R) Windows (R) Server 2003 Standard x64 Edition, версія версії ОС: 5.2.3790 Service Pack 2 Build 3790)
Ice

1
а також протестована на німецькому сервері (Betriebssystemname: Microsoft® Windows Server® 2008 Enterprise Betriebssystemversion: 6.0.6002 Service Pack 2 Додавання 6002) Наявні
Ice

1
Навіть це правда: (Betriebssystemname: Microsoft Windows Server 2012 Standard, Betriebssystemversion: 6.2.9200 Nicht zutreffend Build 9200)
льоду

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%  

Перший рядок завжди виводить у такому форматі
залежність від часового поясу: 20150515150941.077000 + 120
Це дозволяє лише форматувати висновок відповідно до ваших побажань.


4

Цей файл bat (крім збереження як datetimestr.bat) створює рядок datetime 3 рази: (1) довгий рядок datetime з днем ​​тижня та секундами, (2) короткий рядок datetime без них та (3) коротка версія коду.

@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

Щоб надати належний кредит, я з’єднав концепції Петра Мортенсена (18 червня 14 червня о 21:02) та opello (25 серпня 1111 року о 14:27).

Можна написати це набагато коротше, але ця довга версія полегшує читання та розуміння коду.


4

Я дійсно новачок у пакетних файлах, і це мій код !! (Я не впевнений, чому, але я не зміг поєднати дату / t і час / t разом, і я не міг безпосередньо використовувати % date% і % time%% без змінної ...)

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

Це на зразок повторного використання від інших (питання полягало в тому, щоб отримати відформатований тимчасовий термін, який буде використаний як ім'я файлу).


4

Є ще один простий спосіб зробити це:

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

3

Для створення YYYY-MM-DD hh:mm:ss(цілодобової) позначки часу я використовую:

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

Чи передбачає це конкретна регіональна обстановка?
Пітер Мортенсен

1
У відповідності з ss64.com/nt/syntax-variables.html%TIME% і %DATE%змінні використовують один і той же формат , як TIMEі DATEкоманди, відповідно. У моїй системі змінні не відповідають моїм регіональним налаштуванням.
М. Дадлі

3

Цей пакетний сценарій буде робити саме те, що хоче ОП (тестується на Windows XP SP3).

Я також використовував той розумний трюк реєстру, описаний раніше "jph", який IMHO - це найпростіший спосіб отримати 100% послідовне форматування дати до "yyyy_MM_dd"будь-якої нової або старої системи Windows. Зміна одного значення для Реєстру для цього є миттєвою тимчасовою та тривіальною; це триває лише кілька мілісекунд, перш ніж його негайно повернути назад.

Двічі клацніть цей пакетний файл, щоб миттєво демонструвати, вікно командного рядка спливе та відобразить вашу часову позначку. . . . .

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

Працює і в Windows 2019. Я буду тримати ваше рішення навколо, мені це подобається :)
user225479

Питання, я щойно виявив, що після опівночі на виході падає кінцевий "0". Будь-яка ідея, чому? Мій висновок із вашим сценарієм дає: Ваша часова марка: 2019_09_16__0_58_07 замість ..00_58_07. Але після 1 години він працює як очікувалося (і дасть вихід: ..01_01_56).
користувач225479

Я додав IF% HOUR% == 0 (SET HOUR = 00) до заяви ELSE. Це має виправити, я сподіваюся :)
user225479

Дякуємо за відгук @ user225479. Я виправив код. Усі можливі перестановки змінної HOUR, перетвореної у формат 24 HOUR, тепер працюватимуть коректно. Я також змінив макет, щоб його було легше читати.
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

Створіть файл під назвою "search_files.bat" і помістіть вміст нижче у файл. Потім двічі клацніть по ньому. Була введена тимчасова змінна% THH% для належного поводження з AM. Якщо в перших двох цифрах часу є 0, Windows ігнорує решту імен файлу файлу 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

Мені подобається коротка версія поверх @The lorax, але для інших мовних налаштувань вона може бути дещо іншою.

Наприклад, у налаштуваннях німецької мови (з натуральним форматом дати: dd.mm.yyyy) запит місяця має бути змінено з 4,2 на 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

Це мої 2 копійки за datetime string. У MM DD YYYYсистемах перемикають перший і другий %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

Я спробував прийняту відповідь, і це працює досить добре. На жаль, американський формат часу виглядає як H: MM: SS.CS, і відсутні 0 на передній панелі викликали проблеми розбору до 10 ранку. Щоб подолати цю перешкоду, а також дозволити проаналізувати більшість будь-яких форматів світового часу, я придумав цю просту процедуру, яка, здається, працює досить добре.

: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

Приємно, що в цій процедурі є те, що ви передаєте в часовий рядок як перший параметр, а ім'я змінної середовища, яку ви хочете містити час (у сантисекундах) як другий параметр. Наприклад:

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

(* Кріс *)


1

Можливо, щось подібне:

@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

У таких ситуаціях використовується простий, стандартний підхід до програмування: Замість того, щоб витрачати величезні зусилля на аналіз невідомої сутності, просто збережіть поточну конфігурацію, відновіть її до відомого стану, витягніть інформацію та відновіть початковий стан. Використовуйте лише стандартні ресурси Windows.

Зокрема, формати дати та часу зберігаються під ключем реєстру HKCU \ Control Panel \ International \ у [визначення MS] "значень": "sTimeFormat" та "sShortDate". Reg - це редактор реєстру консолі, включений до всіх версій Windows. Підвищені привілеї не потрібні для зміни ключа 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

Простий, простий і повинен працювати для всіх регіонів.

З незрозумілих причин, скидання значення "sShortDate" набуває чинності негайно у вікні консолі, але скидання дуже подібного значення "sTimeFormat" НЕ набуває чинності, поки не відкриється нове вікно консолі. Однак єдиним, що можна змінити, є роздільник - позиції цифр фіксовані. Так само, як і "HH" часовий маркер повинен передбачати провідні нулі, але це не так. На щастя, обхідні шляхи прості.


-1 "Замість того, щоб додати початковий нуль, чому б вам не порушити конфігурацію машини, змінити її на свою випадкову потребу і потім зробити свою справу?" Цей підхід знаходиться поза цим світом, вимагає значних зусиль і може призвести до нескінченного числа небажаних наслідків. І я навіть не хочу розпочинати дискусію щодо читабельності та стандартної очікуваної поведінки коду. кудо.
vaitrafra

Скидання sTimeFormatформату часу марно . Ні. Оскільки це впливає на наступне запит консолі, застосуйте його, використовуючиfor /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
JosefZ

1

Цей сценарій використовує інтерфейс WMI, доступ до якого здійснюється первинно через інструмент WMIC, який є невід'ємною частиною Windows, оскільки Windows XP Professional (Домашня редакція теж підтримується, але інструмент не встановлений за замовчуванням). Сценарій також реалізує спосіб відсутності інструменту WMIC шляхом створення та виклику vbscript WSH для доступу до інтерфейсу WMI та запису на консольний вихід часу у тому ж форматі, що і інструмент WMIC.

@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

Приємний однолінійний трюк, щоб уникнути раннього розширення змінної, - це використовувати 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

Для дуже простого рішення для числової дати для використання у файлах імен використовуйте наступний код:

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

Розподіліть результати команди дати на косою рисою, після чого ви можете перемістити кожен маркер у відповідні змінні.

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%
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.