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


540

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


Какие операторы командной строки 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. Я не хочу устанавливать дополнительные утилиты для достижения этой цели (хотя я понимаю, что есть некоторые, которые будут делать хорошее форматирование даты).


7
Создаете автоматическое резервное копирование для вашего кода? Повезло тебе! Мы тоже должны это сделать :)
Андрей Ринеа,

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

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

Ответы:


667

См. Пакетный файл 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
Локальная дата: [2012-06-19 10: 23: 47.048]


44
Для британских людей вы захотите For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)на второй линии.
Рори

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

25
В моей системе% 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

10
Отличная версия 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%
Арджан

5
Для меня это говорит%%a was unexpected at this time.
Скотт zuz22 Блэклок

109

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

Формат вывода команды %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в любой каталог в пути поиска может привести к сбою других сценариев, использующих встроенную dateкоманду Windows .


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

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

1
он не зависит от локали, если вы
укажете

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

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

105

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

  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. ROBOCOPY - это не встроенная команда для 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 Script Host ( хотя может быть отключен через реестр, это редкий случай ):

    @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 ( возможно ли встроить и выполнить 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>
    

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

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

10
Мне нравится вводный текст "Еще два ...", сопровождаемый 8 решениями.
Адам Смит

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

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

44

Вот вариант из 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'. Но эй, кого это волнует!


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

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

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

35

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

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

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

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

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

26

Первые четыре строки этого кода предоставят вам надежные переменные 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

25

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

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%

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


1
Mark - Found Cmd.exe Переменные окружения с двоеточием и тильдой, которые описывают технику «разрезания» переменных, представленную в вашем ответе. Больше не могу найти эту информацию в статье в Википедии. Хотел бы найти авторитетную ссылку от Microsoft.
DavidRR

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

18

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

echo %Date:~0,3%day

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

15

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

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

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


14
"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имеет некоторые хорошие моменты могут быть полезны для кого-то в будущем.
Сараванан

13

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

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%

10

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

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?
Сангли


9

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

 :: 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 скрипт для / f %% i in ('PowerShell -Command "get-date" -формат "yyyyMMdd" ') действительно установить yyyyMMdd = %% i
Йордан Георгиев

8

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

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

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

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

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

1
или намного проще было бы без цикла forecho %date:/=-%%time::=-%
Герхард Барнард

7

А вот аналогичный пакетный файл для порции времени.

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

--jeroen


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

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

7

Я изменил ответ с помощью командного файла из 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

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

:: /programming/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 jeroen@pluimers.com 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

--jeroen


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

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

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

2
Другой в стороне: можно также получить заказ из реестра , используя 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). Открытие новой командной строки исправляет это.
Арджан

2
@ Arjan это должно быть reg query "HKCU\Control Panel\International" /v sShortDate.
Трикасс

6

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

::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». Таким образом, вам все равно нужно будет отрезать (или иным образом справиться) «Tue» и символ пробела.
BoltBait

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

5

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

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

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

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

(Источник)


5

Функция, которая основана на 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

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

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


4

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

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

Поместите это в свою папку system32 Windows.

У этого есть много опций «вывода даты».

Для помощи используйте DateFormat.exe --h

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


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

3

Региональное независимое решение, генерирующее формат даты 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) - хотя я еще не пробовал это.
Винсент Де Смет

2
:: 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 adolfo.dimare@gmail.com
:: - 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

0

Учитывая известную местность, для справки в функциональном виде. На 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, вот вывод:

введите описание изображения здесь


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

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

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

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

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

0

В 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
Джеб

-1

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

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

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

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

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

Я не вижу существенной разницы со старыми ответами @Matthew Johnson, 2010 или @KChiki, 2011
Джеб

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

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

-3

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

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

3
Вы упустили сутьindependent of the regional settings of the machine
Джеб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.