Как мне получить текущую дату / время в командной строке Windows в подходящем формате для использования в имени файла / папки?

Обновление: теперь, когда наступил 2016 год, я бы использовал для этого PowerShell, если для этого нет действительно веской причины обратной совместимости, особенно из-за проблемы региональных настроек при использовании date. См. https://stackoverflow.com/a/19799236/8479 @ npocmaka


Какие операторы командной строки Windows я могу использовать, чтобы получить текущую дату и время в формате, который я могу поместить в имя файла?

Я хочу иметь файл .bat, который заархивирует каталог в архив с текущими датой и временем как частью имени, например Code_2008-10-14_2257.zip. Есть ли какой-нибудь простой способ сделать это независимо от региональных настроек машины?

Я не особо возражаю против формата даты, в идеале это будет гггг-мм-дд, но все простое подойдет.

Пока что у меня есть это, что на моей машине дает мне Tue_10_14_2008_230050_91:

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new ZIP file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.zip Code

Я могу смириться с этим, но это кажется немного неуклюжим. В идеале это было бы короче и иметь формат, упомянутый ранее.

Я использую Windows Server 2003 и Windows XP Professional. Я не хочу устанавливать дополнительные утилиты для этого (хотя я понимаю, что есть некоторые, которые хорошо подходят для форматирования даты).

Создаете автоматическую резервную копию вашего кода? Повезло тебе! Мы тоже должны это сделать :)

Andrei Rînea 14.04.2010 20:09

используйте людей PowerShell ... [datetime]::now.tostring("yyyy-MM-dd")

Nacht 29.10.2014 03:03

Можно ли загружать файлы с датой создания с помощью xp_cmdshell в SQL Server? Я задал вопрос о stackoverflow, пожалуйста, перейдите по ссылке @ stackoverflow.com/q/32293517/3327081

kolunar 02.09.2015 16:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
568
3
1 437 212
29
Перейти к ответу Данный вопрос помечен как решенный

Ответы 29

Вот что я использовал:

::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z")
SET DT=%date%
SET DT=%DT:/=.%
SET DT=%DT:-=.%

Если вам нужны дальнейшие идеи по автоматизации резервного копирования в архивы 7-Zip, у меня есть бесплатный / открытый проект, который вы можете использовать или просмотреть для идей: http://wittman.org/ziparcy/

В моей системе% date% содержит «Вт, 14.10.2008». Таким образом, вам все равно нужно отключить (или иным образом обработать) «Вт» и пробел.

BoltBait 15.10.2008 02:34

Привет, @micahwittman. Можно ли загружать файлы с датой создания с помощью xp_cmdshell в SQL Server? Я пробовал команду "forfiles", но безрезультатно. Я задал вопрос о stackoverflow, пожалуйста, перейдите по ссылке @ stackoverflow.com/q/32293517/3327081

kolunar 02.09.2015 16:17

Это не совсем короче, но может быть более гибким способом (кредит):

FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%

Другой способ (кредит):

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
)

@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%

Обратите внимание, что оба моих ответа здесь по-прежнему зависят от порядка дня и месяца, определенного региональными настройками, - не знаю, как это обойти.

Ответ принят как подходящий

См. Пакетный файл Windows (.bat) для получения текущей даты в формате MMDDYYYY:

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

Если вы предпочитаете время в 24-часовом / военном формате, вы можете заменить вторую строку FOR на это:

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

C:> .\date.bat
2008-10-14_0642

Если вам нужна дата независимо от порядка дня / месяца в регионе, вы можете использовать "WMIC os GET LocalDateTime" в качестве источника, поскольку он находится в порядке ISO:

@echo off
for /F "usebackq tokens=1,2 delims= = " %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]

C:>test.cmd
Local date is [2012-06-19 10:23:47.048]

Это хорошо! В моей системе «time / t» дает «11:58 PM». Я мог бы добавить еще одну строку с "set mytime =% mytime: = _%" или какие-либо другие настройки, которые вы можете предложить?

Rory 15.10.2008 02:58

Добавлен еще один потенциальный вариант отображения в 24-часовом режиме, устраняющий необходимость в указателе PM / AM.

Jay 15.10.2008 03:37

Для британцев вам понадобится For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) для второй линии.

Rory 13.01.2011 21:24

Это решение зависит от локали, Рори привел пример для Великобритании для других локалей, где дата - 22-02-2012, вам нужно заменить delims = / на delims = -

Nuno Furtado 29.02.2012 01:59

В моей системе% TIME% возвращает такие значения, как «0:01:15» и «3:15:12», а код %% a %% b в ответе дает начальный пробел, например «001» и «315». Чтобы получить четырехзначный ххм, используйте это: For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b)), который возвращает значения типа «0001» и «0315», которые я предпочитаю в своих именах файлов.

twamley 16.05.2012 21:20

Хорошая версия команды wmic! Пока видел только WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table. Аналогичным образом, чтобы получить 20120623-1619 в моем местном часовом поясе Амстердама, в одной строке: for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%

Arjan 23.06.2012 18:20

Порядок ISO приветствуется (ура для автоматической сортировки), но обратите внимание, что полные двоеточия не являются допустимыми символами в именах файлов Windows (согласно OP)!

Hannele 27.09.2013 18:28

есть проблема с приведенным выше примером военного времени с использованием% TIME%. Если час до 10 часов утра, вы получите цифру «9», которая, когда вы соедините их вместе, даст пробел в вашей переменной строке. Не хорошо, если вы используете его для имени файла. :-(

stu 12.02.2014 19:30

если вы добавите пробел после списка разделителей для времени ... for / f "tokens = 1-2 delims = /:" %% a in ('time / t') do (set mytime = %% a %% b ) он будет рассматривать AM / PM как отдельный разделитель и не забирать его

stu 12.02.2014 19:35

Обязательно вызовите set mydate= (отменяет mydate) перед циклом forloop. В противном случае он не будет сброшен при вызове того же командного файла в том же экземпляре консоли.

Rolf 04.08.2014 17:44

Для меня это %%a was unexpected at this time.

Scott zuz22 Blacklock 02.11.2014 19:40

Можно ли загружать файлы с датой создания с помощью xp_cmdshell в SQL Server? Я пробовал команду "forfiles", но безрезультатно. Я задал вопрос о stackoverflow, пожалуйста, перейдите по ссылке @ stackoverflow.com/q/32293517/3327081

kolunar 02.09.2015 16:15

В чем смысл '. и .' по сравнению с %%i и LocalDateTime? Кажется, что он соответствует каждой строке wmic, и в результате ldt не имеет значения.

NobleUplift 24.09.2016 22:41

Это работает хорошо, за исключением того, что с моей стороны упускается «дневная» часть. Выходной файл - pmtctdb_backup.-03-2017_1629.sql. По какой причине?

Chagbert 22.03.2017 17:33

@ Scottzuz22Blacklock это только если запускать из командной строки. %% a экранирует первый знак процента, который необходим для командного файла. Для командной строки просто удалите второй знак процента. За: stackoverflow.com/a/2340018

JacksonHaenchen 01.11.2017 06:36

Этот For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) не работает в Windows 10.

kittu 20.05.2020 13:12

@Chagbert, это почти наверняка ваш региональный формат даты, оригинал для США. См. Комментарий выше относительно Великобритании и попробуйте адаптировать его для строки, которую вы получаете, когда запускаете date / t в командной строке.

Ivan McA 06.10.2020 18:05

Как такая простая вещь, как определение текущего времени, может быть настолько сложной? : S

J. Doe 17.11.2020 11:41

Для Германии дата расшифровывается с помощью For /f "tokens=1-3 delims=. " %%a in ('date /t') do (set CURR_DATE=%%c%%b%%a).

chrmue 19.02.2021 17:37

К сожалению, это не невосприимчиво к региональным настройкам, но делает то, что вы хотите.

set hour=%time:~0,2%
if "%time:~0,1%"= = " " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%

Удивительные вещи, которые вы можете найти на Википедия.

отметка - Found Переменные среды Cmd.exe с двоеточием и тильдой which describes the variable 'slicing' technique exhibited in your answer. Not finding that info any longer in the Wikipedia article. Would like to find an authoritative reference from Microsoft.
DavidRR 16.12.2013 04:41

Вот Microsoft Справочник по пакетным файлам для Windows XP. Эта ссылка включает Использование параметров партии. К сожалению, нет обсуждения техники «нарезки».

DavidRR 16.12.2013 04:50

Я использую это (опять же не независимый от региона (Великобритания))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%

См. Переменные среды Cmd.exe с двоеточием и тильдой об этой малоизвестной, но очень эффективной технике. (Приветствуется указатель на авторитетную ссылку Microsoft.)

DavidRR 16.12.2013 04:33

Вот Microsoft Справочник по пакетным файлам для Windows XP. Эта ссылка включает Использование параметров партии. К сожалению, нет обсуждения техники «нарезки».

DavidRR 16.12.2013 04:51

Для меня это не совсем подходит. Может дело в региональных настройках? Я получаю вывод «/ 15 / - 1-We_1009» при запуске в среду, 15 октября 2014 г.

Joel B 15.10.2014 20:11

Это очень точно и аккуратно. Я думаю, что это лучший ответ на вопрос, потому что вам не нужно никаких настроек, чтобы использовать его в качестве имени файла. Спасибо, что поделился!

omostan 02.11.2020 13:03

"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip

http://www.dotnetperls.com/7-zip-examples имеет ряд хороших моментов, которые могут пригодиться кому-то в будущем.

Saravanan 04.08.2011 07:47

Регионально независимый синтаксический анализ даты и времени

Формат вывода %DATE% и команды dir зависит от региона и, следовательно, не является ни надежным, ни интеллектуальным. date.exe (часть UnxUtils) доставляет любую информацию о дате и времени в любом мыслимом формате. Вы также можете извлечь дату / время из любого файла с помощью date.exe.

Примеры: (в cmd-скрипте используйте %% вместо%)

date.exe +"%Y-%m-%d"
2009-12-22

date.exe +"%T"
18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503: Любой текст

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Текст: 09/12/22-любой текст-18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18:55:03" `

Информация о дате и времени из справочного файла:
. date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Использование его в сценарии CMD для получения информации о году, месяце, дне и времени:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Использование его в сценарии CMD для получения метки времени в любом необходимом формате:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

Извлечение информации о дате / времени из любого справочного файла.

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Добавление в файл информации о дате / времени:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe - это часть бесплатных инструментов GNU, который не требует установки.

ПРИМЕЧАНИЕ. Копирование date.exe в любой каталог, указанный в пути поиска, может привести к сбою других сценариев, использующих встроенную в Windows команду date.

Намного лучше, чем странно более популярное решение, приведенное выше, но мне пришлось добавить / t, чтобы не выводить запрос в Windows 8.1.

rainabba 28.01.2014 20:17

Встроенная Windows 8.1 date.exe, похоже, зависит от локали. Он возвращает дату в моей системе в формате dd / MM / yyyy, если бы он не зависел от локали, я бы ожидал либо MM / dd / yyyy, либо yyyy-MM-dd. Я не думаю, что в этом ответе говорится о встроенном date.exe, а о какой-то его сторонней версии.

SSS 07.04.2014 06:49

он не зависит от локали, если вы предоставите ему желаемый формат в командной строке

terrinecold 16.10.2014 03:06

Обратите внимание, что date.exe (часть UnxUtils) не совпадает с командой даты сборки. Поэтому, если вам нужно добавить / t, выполняется команда даты Windows. Если работает что-то вроде date.exe + "% Y-% m-% d", значит, вы правильно установили UnxUtils. :-)

just.do.it 16.12.2014 11:30

Можно ли загружать файлы с датой создания с помощью xp_cmdshell в SQL Server? Я пробовал команду "forfiles", но безрезультатно. Я задал вопрос о stackoverflow, пожалуйста, перейдите по ссылке @ stackoverflow.com/q/32293517/3327081

kolunar 02.09.2015 16:18

Я просто использовал date.exe, но переименовал его в date_unxutils.exe и использовал в пакетном скрипте, используя временное (сеансовое) назначение PATH.

om-ha 28.01.2021 22:07

На всякий случай, если кому интересно ... stackoverflow.com/a/65943831/10830091

om-ha 28.01.2021 22:17

Короткий ответ :

 :: Start - Run , type:
 cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"

 :: click into target media, Ctrl + V to paste the result 

Длинный ответ

    @echo off
    :: START USAGE  ==================================================================
    ::SET THE NICETIME 
    :: SET NICETIME=BOO
    :: CALL GetNiceTime.cmd 

    :: ECHO NICETIME IS %NICETIME%

    :: echo nice time is %NICETIME%
    :: END USAGE  ==================================================================

    echo set hhmmsss
    :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c 
    ::DEBUG ECHO hhmmsss IS %hhmmsss%
    ::DEBUG PAUSE
    echo %yyyymmdd%
        :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set  yyyymmdd=%%F%%E%%D
    ::DEBUG ECHO yyyymmdd IS %yyyymmdd%
    ::DEBUG PAUSE


    set NICETIME=%yyyymmdd%_%hhmmsss%
    ::DEBUG echo THE NICETIME IS %NICETIME%

    ::DEBUG PAUSE

:: in cmd для / f% i in ('PowerShell -Command "get-date" -format "yyyyMMdd"') установить yyyyMMdd =% i :: in cmd script для / f %% i in ('PowerShell -Command "get-date" -format "yyyyMMdd" ') установить yyyyMMdd = %% i

Yordan Georgiev 19.12.2016 17:09

Вот вариант из alt.msdos.batch.nt, который работает независимо локально.

Поместите это в текстовый файл, например getDate.cmd

-----------8<------8<------------ snip -- snip ----------8<-------------
    :: Works on any NT/2k machine independent of regional date settings
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k))
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    set Today=%'yy'%-%'mm'%-%'dd'% 
    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]

    :EOF
-----------8<------8<------------ snip -- snip ----------8<-------------

Чтобы заставить код работать без сообщения об ошибке в stderr, мне пришлось добавить одинарные кавычки вокруг назначений переменных для %% a, %% b и %% c. Моя локаль (PT) вызывала ошибки на одном этапе цикла / анализа, когда выполнялись такие вещи, как «set = 20». Кавычки дают токен (хотя и пустой) для левой части оператора присваивания.

Обратной стороной являются запутанные имена переменных локали: «yy», «mm» и «dd». Но кого это волнует!

Это идеальный и самый простой и элегантный подход, который я когда-либо видел.

Doug 14.12.2011 04:25

См. Также Улучшения Йеруна, необходимо, поскольку не все языковые стандарты используют строки dd, mm и yy в выводе echo:^|date.

Arjan 23.06.2012 14:01

не работает на всех языках. (На немецком языке date дает Geben Sie das neue Datum ein: (TT-MM-JJ), где JJ нарушает ваш скрипт (ожидает YY))

Stephan 07.08.2019 12:41

Вот способ получить дату и время в одной строке:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e

В США это будет вывод «гггг-мм-дд ччмм». Различные региональные настройки приведут к разным выводам% date%, но вы можете изменить порядок токенов.

Если вам нужен другой формат, измените оператор echo, переставив токены или используя другие (или не используя) разделители.

Есть ли способ получить время в 12-часовом формате, а также отобразить информацию AM или PM?

Sangli 04.07.2019 15:12

http://sourceforge.net/projects/unxutils/files/

Найдите в ZIP-файле что-то под названием «Date.exe» и переименуйте его в «DateFormat.exe» (во избежание конфликтов).

Поместите его в папку system32 вашей Windows.

У него много опций "вывода даты".

Для справки используйте DateFormat.exe --h

Я не уверен, как бы вы поместили его вывод в переменную окружения ... используя SET.

Спасибо, хотя этот вопрос предназначен специально для того, чтобы сделать это без загрузки дополнительных инструментов.

Rory 31.10.2010 15:22

Я изменил ответ пакетным файлом из vMax, чтобы он работал и с голландским языком. Голландцы, несмотря на нашу настойчивость, внесли несколько изменений в %date%, date/t и date, которые нарушают работу исходного командного файла.

Было бы неплохо, если бы некоторые люди могли проверить это на других языках Windows и сообщить результаты. Если командный файл не работает в вашем местоположении, включите вывод этих двух операторов в командную строку:
echo:^|date
date/t

Это пример вывода, который вы должны получить из командного файла:

C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103

Вот исправленный код с комментариями о том, почему:

:: https://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by [email protected] for Dutch locale
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
::            set '%%c'=%%k
::            set 'yy'=%%k
::
:: In addition, date will display the current date before the input prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
::        if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
    set v_day=
    set v_month=
    set v_year=

    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::DEBUG echo toks=%toks%
      for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
        if "%%a" GEQ "A" (
          for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
            set '%%a'=%%i
            set '%%b'=%%j
            set 'yy'=%%k
          )
        )
      )
      if %'yy'% LSS 100 set 'yy'=20%'yy'%
      set Today=%'yy'%-%'mm'%-%'dd'%

    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
    set datestring=%V_Year%%V_Month%%V_Day%
    echo %datestring%

    :EOF

- Джерун

Некоторые действительно используют сначала годы или не имеют начальных нулей; см. Формат даты по стране в Википедии. Французский мощь использует jj-mm-aaaa для jour, mois, annee? Итальянцы, может быть, gg/mm/aaaa для giorno, mese, anno? Немцы tt.mm.jjjj для Tag, Monat, Jahr? Но затем: я думаю, в большинстве стран используется только несколько языков. Как и в Нидерландах, Windows часто бывает английской или голландской, не более того. Достаточно хорошо для меня.

Arjan 23.06.2012 13:49

В стороне: другая версия в Скрытые возможности командных файлов Windows менее совершенна (требует исправления для голландского jj и не требует четырехзначного года), но использует shift, чтобы отбросить день, как Mon или ma. Просто другой.

Arjan 23.06.2012 13:50

Это ломается по немецкой системе. Год и месяц работают, но день не работает, потому что «день» начинается с буквы «T» на немецком языке («тег»), а не с буквы «d». Строка формата в приглашении - (TT-MM-JJ), вывод date/t - 23.06.2012. / cc @Arjan

balpha 23.06.2012 14:18

Еще в стороне: можно также получить заказ из реестра, используя reg query "HKCU\Control Panel\International" /vShortDate. Будьте осторожны при тестировании: для открытой командной строки изменение этой настройки панели управления также изменяет формат, используемый для отображения даты (как для date, так и для date /t и echo %date%), но в Windows 7 НЕ меняет формат новой даты! Как изменение моего короткого формата даты на YY/MM/dd, я получаю: The current date is: 12/06/23 Enter the new date: (mm-dd-yy). Открытие новой командной строки исправляет это.

Arjan 23.06.2012 14:38

Арьян, балфа, спасибо за отличные комментарии. Это было действительно то, что я искал.

Jeroen Wiert Pluimers 24.06.2012 21:29

@Arjan, это должен быть reg query "HKCU\Control Panel\International" /v sShortDate.

tricasse 19.11.2015 16:31

Ты прав, @tricasse. Не уверен, сработало ли это так, как я писал в 2012 году, но, безусловно, сегодня мой комментарий неверен. Жаль, что я не могу редактировать свой комментарий ;-)

Arjan 19.11.2015 16:45

А вот аналогичный батник для временной части.

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional time settings
::
:: Gets the time in ISO 8601 24-hour format
::
:: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that.
:: Since ISO 8601 does not care about AM/PM, we use %time%
::
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do (
      set 'hh'=%%i
      set 'mm'=%%j
      set 'ss'=%%k
      set 'ff'=%%l)
    ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'%

    ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%]
    set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction%
    echo %timestring%

    :EOF

- Джерун

Привет, мне удалось загрузить файлы в соответствии с датой изменения с помощью приведенной ниже команды, z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path”. Но я хочу знать, как загружать файлы в соответствии с датой создания. Любая помощь будет очень признательна. Был задан вопрос о stackoverflow, но ответа пока нет. Подробности смотрите по ссылке stackoverflow.com/q/32293517/3327081

kolunar 02.09.2015 16:35

Задайте новый вопрос по этому поводу. Я никогда не использовал forfiles.

Jeroen Wiert Pluimers 04.09.2015 14:09

У меня была аналогичная проблема. У меня есть автоматическая ежедневная загрузка с FTP-сервера зашифрованного файла. Я хотел расшифровать файл с помощью gpg, переименовать файл в текущую дату (формат ГГГГММДД) и перетащить расшифрованный файл в папку для нужного отдела.

Я рассмотрел несколько предложений по переименованию файла в соответствии с датой, и мне не повезло, пока я не наткнулся на это простое решение.

for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt

Он работал отлично (т.е. имя файла выглядит как «2011-06-14.txt»).

(Источник)

Используйте следующий сценарий, чтобы получить текущий день в командной строке:

echo %Date:~0,3%day

Немного поиграв с этим, я нашел самое короткое время, которое я нашел, чтобы получить дату и время: echo% date%% time%

loomi 23.11.2012 12:49

Региональное независимое решение, генерирующее формат даты ISO:

rem save the existing format definition
for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a
rem set ISO specific format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul:
rem query the date in the ISO specific format 
set ISODATE=%DATE%
rem restore previous format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul:

Что еще можно оптимизировать: Другие процессы могут запутаться, если использовать формат даты за короткий период времени, пока он изменяется. Таким образом, синтаксический анализ вывода в соответствии с существующей строкой формата может быть более безопасным, но будет более сложным.

вы можете зарегистрировать запрос iDate (technet.microsoft.com/en-us/library/cc978637.aspx) и условно продолжить (3 возможных значения в соответствии с technet) - хотя я еще не пробовал это.

Vincent De Smet 05.05.2012 23:08

Мэтью Джонсона однострочное решение для получения однострочной даты и времени - это красноречивый и полезно.

Однако для работы из командного файла требуется простая модификация:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e

Не работает в CMD (%% a было неожиданным в это время) или в PowerShell (отсутствует открытие '(' после ключевого слова для) в Windows 8.1

rainabba 28.01.2014 20:28

Райнабба, это именно та ошибка, которую вы получаете, когда запускаете эту команду из линии CMD. Однако, «из командного файла», команда возвращает «2014-01-30 1324».

John Langstaff 30.01.2014 22:30

или намного проще было бы без цикла for echo %date:/=-%%time::=-%

Gerhard 25.11.2019 14:23

Еще два способа, не зависящих от настроек времени (оба взяты из : Как получить данные / время независимо от локализации:). И оба также получают день недели, и ни один из них не требует прав администратора !:

  1. MAKECAB - будет работать на КАЖДОЙ системе Windows (быстро, но создает небольшой временный файл) (скрипт foxidrive):

    @echo off
    pushd "%temp%"
    makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
    for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
       set "current-date=%%e-%%b-%%c"
       set "current-time=%%d"
       set "weekday=%%a"
    )
    del ~.*
    popd
    echo %weekday% %current-date% %current-time%
    pause
    

    Подробнее о функции get-date.

  2. РОБОКОПИЯ - это не собственная команда для Windows XP и Windows Server 2003, но может быть скачано с сайта microsoft. Но встроено во все, начиная с Windows Vista и выше:

    @echo off
    setlocal
    for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
     set "dow=%%D"
     set "month=%%E"
     set "day=%%F"
     set "HH=%%G"
     set "MM=%%H"
     set "SS=%%I"
     set "year=%%J"
    )
    
    echo Day of the week: %dow%
    echo Day of the month : %day%
    echo Month : %month%
    echo hour : %HH%
    echo minutes : %MM%
    echo seconds : %SS%
    echo year : %year%
    endlocal
    

    И еще три способа использования других языков сценариев Windows. Они дадут вам больше гибкости, например, вы можете получить неделю в году, время в миллисекундах и так далее.

  3. JScript / пакет гибрид (необходимо сохранить как .bat). JScript доступен в любой системной форме NT и выше как часть Хост сценариев Windows (хотя можно отключить через реестр, это редкий случай):

    @if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
    
    @echo off
    cscript //E:JScript //nologo "%~f0"
    exit /b 0
    *------------------------------------------------------------------------------*/
    
    function GetCurrentDate() {
            // Today date time which will used to set as default date.
            var todayDate = new Date();
            todayDate = todayDate.getFullYear() + "-" +
                           ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
                           ("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
                           ("0" + todayDate.getMinutes()).slice(-2);
    
            return todayDate;
        }
    
    WScript.Echo(GetCurrentDate());
    
  4. VSCRIPT / BATCH hybrid (Можно ли встроить и выполнить VBScript в пакетном файле без использования временного файла?) тот же случай, что и JScript, но гибридизация не так идеальна:

    :sub echo(str) :end sub
    echo off
    '>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
    '& echo current date:
    '& cscript /nologo /E:vbscript "%~f0"
    '& exit /b
    
    '0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
    '1 = vbLongDate - Returns date: weekday, monthname, year
    '2 = vbShortDate - Returns date: mm/dd/yy
    '3 = vbLongTime - Returns time: hh:mm:ss PM/AM
    '4 = vbShortTime - Return time: hh:mm
    
    WScript.echo  Replace(FormatDateTime(Date,1),", ","-")
    
  5. PowerShell - может быть установлен на любой машине с .NET - загрузить с Microsoft (v1, v2, v3 (только для Windows 7 и выше)). Он устанавливается по умолчанию на все, начиная с Windows 7 / Windows Server 2008 и выше:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    

    Чтобы использовать его из командного файла:

    for /f "delims = " %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Самостоятельно скомпилированный jscript.net/batch (никогда не видел машину с Windows без .NET, поэтому я думаю, что это довольно портативный):

    @if (@X)==(@Y) @end /****** silent line that start JScript comment ******
    
    @echo off
    ::::::::::::::::::::::::::::::::::::
    :::       Compile the script    ::::
    ::::::::::::::::::::::::::::::::::::
    setlocal
    if exist "%~n0.exe" goto :skip_compilation
    
    set "frm=%SystemRoot%\Microsoft.NET\Framework\"
    
    :: Searching the latest installed .NET framework
    for /f "tokens=* delims = " %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
        if exist "%%v\jsc.exe" (
            rem :: the javascript.net compiler
            set "jsc=%%~dpsnfxv\jsc.exe"
            goto :break_loop
        )
    )
    echo jsc.exe not found && exit /b 0
    :break_loop
    
    
    call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
    ::::::::::::::::::::::::::::::::::::
    :::       End of compilation    ::::
    ::::::::::::::::::::::::::::::::::::
    :skip_compilation
    
    "%~n0.exe"
    
    exit /b 0
    
    
    ****** End of JScript comment ******/
    import System;
    import System.IO;
    
    var dt=DateTime.Now;
    Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
    
  7. Логман Не может получить год и день недели. Это сравнительно медленно, а также создает временный файл и основывается на отметках времени, которые logman помещает в свои файлы журнала. Он будет работать на всем, начиная с Windows XP и выше. Он, вероятно, никогда не будет использоваться кем-либо, в том числе и мной, но это еще один способ ...

    @echo off
    setlocal
    del /q /f %temp%\timestampfile_*
    
    Logman.exe stop ts-CPU 1>nul 2>&1
    Logman.exe delete ts-CPU 1>nul 2>&1
    
    Logman.exe create counter ts-CPU  -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
    Logman.exe start ts-CPU 1>nul 2>&1
    
    Logman.exe stop ts-CPU >nul 2>&1
    Logman.exe delete ts-CPU >nul 2>&1
    for /f "tokens=2 delims=_." %%t in  ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
    
    echo %timestamp%
    echo MM: %timestamp:~0,2%
    echo dd: %timestamp:~2,2%
    echo hh: %timestamp:~4,2%
    echo mm: %timestamp:~6,2%
    
    endlocal
    exit /b 0
    
  8. Еще один способ с WMIC, который также дает неделю года и день недели, но не миллисекунды (миллисекунды проверьте ответ foxidrive):

    for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
    echo %day%
    echo %DayOfWeek%
    echo %hour%
    echo %minute%
    echo %month%
    echo %quarter%
    echo %second%
    echo %weekinmonth%
    echo %year%
    
  9. Использование TYPEPERF с некоторыми усилиями, чтобы быть быстрым и совместимым с различными языковыми настройками и как можно быстрее:

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v = ")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v = ")
    set "mon = "
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. MSHTA позволяет вызывать методы JavaScript, аналогичные методу JScript, продемонстрированному в # 3 выше. Имейте в виду, что свойства объекта Date в JavaScript, включающие значения месяца, пронумерованы от 0 до 11, а не от 1 до 12. Таким образом, значение 9 означает октябрь.

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims = " %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>
    

для powershell C: \> for / f %% i in ('powershell get-date -format "{yyyyMMdd_HHmmss}"') установить datetime = %% i C: \> echo% datetime%

Samuel 09.05.2014 17:59

makecab: это работает путем создания файла с именем ~.rpt и поиска в нем string, начиная с makecab, который является строкой типа MakeCAB Report: Tue Sep 02 22:15:57 2014. для меня эта команда не локализована, она не зависит от локали. Этот трюк полагается на это. Будем надеяться, что этого никогда не будет, иначе будьте осторожны!

n611x007 03.09.2014 00:19

Привет, мне удалось загрузить файлы в соответствии с датой изменения с помощью приведенной ниже команды, ‘z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path”‘. Но я хочу знать, как загружать файлы в соответствии с датой создания. Любая помощь будет очень признательна. Был задан вопрос о stackoverflow, но ответа пока нет. Подробности смотрите по ссылке @ stackoverflow.com/q/32293517/3327081

kolunar 02.09.2015 16:30

Мне нравится вводный текст «Еще два ...», за которым следуют 8 решений.

Adam Smith 21.10.2015 00:30

Что, никакого гибрида mshta? :) Не возражаете, если я отредактирую ваш ответ и добавлю еще один? Кажется, это лучшая коллекция эзотерических решений, и, похоже, mshta здесь.

rojo 26.10.2015 17:19

@rojo - совсем нет - вперед :)

npocmaka 26.10.2015 17:26

Принятое решение не сработало бы для меня, что бы я ни пробовал. У меня сработало несколько из этих решений. (Пакетная и Powershell).

Brett Wait 15.05.2018 18:19

Функция, основанная на wmic:

:Now  -- Gets the current date and time into separate variables
::    %~1: [out] Year
::    %~2: [out] Month
::    %~3: [out] Day
::    %~4: [out] Hour
::    %~5: [out] Minute
::    %~6: [out] Second
  setlocal
  for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t
  endlocal & (
    if "%~1" neq "" set %~1=%T:~0,4%
    if "%~2" neq "" set %~2=%T:~4,2%
    if "%~3" neq "" set %~3=%T:~6,2%
    if "%~4" neq "" set %~4=%T:~8,2%
    if "%~5" neq "" set %~5=%T:~10,2%
    if "%~6" neq "" set %~6=%T:~12,2%
  )
goto:eof

Достоинства: Не зависит от региона. Обратная сторона: Только системные администраторы могут запускать wmic.exe.

Использование:

call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%

Это перекликается с такой строкой:

2014-01-22 12:51:53

Обратите внимание, что параметры функции являются внешними параметрами, то есть вы должны указывать имена переменных вместо значений.

Все параметры являются необязательными, поэтому call:Now Y M является допустимым вызовом, если вы хотите получить только год и месяц.

Первые четыре строки этого кода предоставят вам надежные переменные YY DD MM YYYY HH Min Sec в Windows XP Professional и выше.

@echo off
for /f "tokens=2 delims= = " %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause

Отлично, это лучшее решение для меня, так как вызов PS приведет к тому, что текст cmd станет забавным.

Ste 23.03.2020 00:35

Просто используйте эту строку:

PowerShell -Command "get-date"

Учитывая известную местность, для справки в функциональной форме. Вызов ECHOTIMESTAMP показывает, как получить метку времени в переменной (в данном примере DTS).

@ECHO off

CALL :ECHOTIMESTAMP
GOTO END

:TIMESTAMP
SETLOCAL  EnableDelayedExpansion
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL & SET "%~1=%DTS%"
GOTO :EOF

:ECHOTIMESTAMP
SETLOCAL
    CALL :TIMESTAMP DTS
    ECHO %DTS%
ENDLOCAL
GOTO :EOF

:END

EXIT /b 0

И сохраненный в файл timestamp.bat, вот результат:

Похоже, это связано с региональной проблемой - это работает не на всех английских машинах.

user6250760 21.07.2017 04:11

Не удивлен, @SteveFest. Если бы можно было временно установить локаль, это могло бы помочь предоставить глобальное решение, но кажется, что необходимо знать регион заранее. Ваш регион - en-US или en-SomewhereElse?

bvj 21.07.2017 10:01

@SteveFest Я полагаю, можно было бы создать список локалей, каждый из которых включает выражения даты / времени с образцом для проверки. Я очень занят, но постараюсь обновить свой ответ, чтобы проиллюстрировать. Не могли бы вы показать мне образцы выходных данных времени / даты Гонконга? Я могу по глупости предполагать, что zh-HK печатает цифры с фиксированным смещением.

bvj 23.07.2017 07:10

zh-HK: (yy)yy年m月d日 hh:mm - без ведущих нулей. (yy) можно игнорировать, так как у нас есть год из двух или четырех цифр. Но обратите внимание на одну вещь: формат даты и времени может быть изменен на каждой машине.

user6250760 23.07.2017 07:42

Спасибо @SteveFest, я свяжусь с вами в течение нескольких недель. Запустите systeminfo в интерфейсе командной строки и сообщите мне, что вы видите для System Locale. Программа требует времени для запуска, но, возможно, результат локали может быть кэширован и впоследствии использован для индексации формата временной метки.

bvj 26.07.2017 08:20

мой компьютер просто умер :(

user6250760 26.07.2017 08:27

Мой компьютер вернулся - язык - zh-HK

user6250760 26.07.2017 10:19

Я знаю, что уже упоминалось множество способов. Но вот мой способ разобрать это, чтобы понять, как это делается. Надеюсь, это будет полезно для тех, кто любит пошаговый метод.

:: Check your local date format
echo %date%

    :: Output is Mon 08/15/2016

:: get day (start index, number of characters)
::         (index starts with zero)
set myday=%DATE:~0,4%
echo %myday%
    :: output is Mon 

:: get month
set mymonth=%DATE:~4,2%
echo %mymonth%
    :: output is 08

:: get date 
set mydate=%DATE:~7,2% 
echo %mydate%
    :: output is 15

:: get year
set myyear=%DATE:~10,4%
echo %myyear%
    :: output is 2016

Вы упустили момент independent of the regional settings of the machine

jeb 15.08.2016 19:13

В Windows 7 у меня работает этот код:

SET DATE=%date%
SET YEAR=%DATE:~0,4%
SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
ECHO %YEAR%
ECHO %MONTH%
ECHO %DAY%

SET DATE_FRM=%YEAR%-%MONTH%-%DAY% 
ECHO %DATE_FRM%

И опять. Приятно, что на вашем аппарате работает, но вы упустили момент independent of the regional settings of the machine

jeb 16.08.2016 14:06

:: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format
:: - Sets environment variables %_isotime% and %_now% to current time
:: - On failure, clears these environment variables
:: Inspired on -> https://ss64.com/nt/syntax-getdate.html
:: - (cX) 2017 [email protected]
:: - http://stackoverflow.com/questions/203090
@echo off

set _isotime=
set _now=

:: Check that WMIC.exe is available
WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_

if not (%1)==() goto _help
SetLocal EnableDelayedExpansion

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

::   1    2     3       4      5      6
:: %%G  %%H    %%I     %%J    %%K    %%L
:: Day  Hour  Minute  Month  Second  Year
:: 27   9     35      4      38      2017

:: Remove excess leading zeroes
        set _mm=%_mm:~-2%
        set _dd=%_dd:~-2%
        set _hour=%_hour:~-2%
        set _minute=%_minute:~-2%
        set _second=%_second:~-2%
:: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep%

:: Set date/time in ISO 8601 format:
        Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second%
:: -> http://google.com/search?num=100&q=ISO+8601+format

if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am
if 1%_hour% LSS 112 goto _skip_12_
    set /a _hour=1%_hour%-12
    set _hour=%_hour:~-2%
    set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm
    :: -> https://ss64.com/nt/if.html
    :: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows
    :: 'if () else ()' will NOT set %_now% correctly !?
:_skip_12_

EndLocal & set _isotime=%_isotime% & set _now=%_now%
goto _out

:_WMIC_MISSING_
echo.
echo WMIC.exe command not available
echo - WMIC.exe needs Administrator privileges to run in Windows
echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe"

:_help
echo.
echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format
echo.
echo    %%_now%%     environment variable set to current date and time
echo    %%_isotime%% environment variable to current time in ISO format
echo    set _today=%%_isotime:~0,10%%
echo.

:_out
:: EOF: GetDate.cmd

Я отмечаю, что o / p действительно нет запрашивал независимое от региона решение. Но мое решение для Великобритании.

Это простейшее возможное решение, однострочное решение для использования в пакетном файле:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%

Он упомянул регионально-независимое решение ...particularly because of the regional settings issue with using date. Кстати. Ваше решение такое же, как и двадцать других ответов.

jeb 06.12.2018 13:57

Да, но мой действительно можно (при желании) использовать в командной строке. В чем преимущество публикации 35 строк кода, если одна строка кода предоставит такое же решение?

Ed999 06.12.2018 21:37

Я не вижу существенной разницы в старых ответах @ Мэтью Джонсон, 2010 или @KChiki, 2011 г.

jeb 07.12.2018 10:27

хотя этот ответ неверен, чтобы прокомментировать фактический ответ, цикл for здесь не нужен, когда вы могли бы просто выполнить echo %date:/=-%

Gerhard 25.11.2019 14:23

Нет. Если вы опустите цикл FOR, никакие переменные не могут быть созданы, а дата, которую вы потрудились извлечь, все равно будет бесполезной. В цикле FOR переменные, созданные циклом, доступны для использования в других частях скрипта. Я категорически не рекомендую использовать десятки строк кода для создания цикла FOR, когда требуется только одна строка. И я категорически не рекомендую публиковать решения, не относящиеся к командной строке, когда o / p специально запрашивает однострочное решение для использования в командной строке.

Ed999 15.12.2019 07:32

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

Ed999 15.12.2019 07:43

FOR / F "tokens = 1-3 delims = /"% A IN ("% date%") DO (SET today =% C-% B-% A) && echo% A-% B-% C && echo% сегодня%

Ed999 15.12.2019 07:43

Объедините Powershell в пакетный файл и используйте мета-переменные для назначения каждой из них:

@echo off
for /f "tokens=1-6 delims=-" %%a in ('PowerShell -Command "& {Get-Date -format "yyyy-MM-dd-HH-mm-ss"}"') do (
    echo year: %%a
    echo month: %%b
    echo day: %%c
    echo hour: %%d
    echo minute: %%e
    echo second: %%f
)

Вы также можете изменить формат, если предпочитаете название месяца MMM или MMMM и 12- или 24-часовой форматы hh или HH.

  • Я использовал date.exe и переименовал его в date_unxutils.exe, чтобы избежать конфликтов.

  • Поместите его в папку bin рядом с пакетным сценарием.

Код

:: Add binaries to temp path
IF EXIST bin SET PATH=%PATH%;bin

:: Create UTC Timestamp string in a custom format
:: Example: 20210128172058
set timestamp_command='date_unxutils.exe -u +"%%Y%%m%%d%%H%%M%%S"'
FOR /F %%i IN (%timestamp_command%) DO set timestamp=%%i
echo %timestamp%

Скачать UnxUtils

использованная литература

Другие вопросы по теме