Как получить текущую дату / время в командной строке 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.