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

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

вопрос задан 14.10.2008
Rory
24268 репутация

26 ответов


  • 602 рейтинг

    См. Пакетный файл 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: & gt; , \Дата. летучая мышь
    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: & gt; тест. cmd
    Местная дата - [2012-06-19 10:23:47. 048]

    ответ дан Jay, с репутацией 33882, 14.10.2008
  • 93 рейтинг

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

    Выходной формат %DATE% и команды dir зависит от региона и, следовательно, не является надежным и интеллектуальным. дата. 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
    

    дата. exe является частью бесплатных инструментов GNU , которые не нуждаются в установке.

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

    ответ дан Uri Liebeskind, с репутацией 939, 23.12.2009
  • 73 рейтинг

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

    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
      

      Дополнительная информация о функции получения даты .

    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. Они дадут вам больше гибкости e. г. Вы можете получить неделю года, время в миллисекундах и так далее.

    3. Гибрид JScript / batch (необходимо сохранить как .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 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 Это не может получить год и день недели. Он сравнительно медленный, а также создает временный файл и основан на отметках времени, которые 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 означает октябрь.

      
      
      
      
    ответ дан npocmaka, с репутацией 40468, 5.11.2013
  • 42 рейтинг

    Вот вариант из альт. MSDOS. партия. Нет, это работает локально-независимо.

    Поместите это в текстовый файл, e. г. 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'. Но эй, кого это волнует!

    ответ дан vMax, с репутацией 421, 8.07.2010
  • 29 рейтинг

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

    set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
    
    ответ дан Mark Ransom, с репутацией 217724, 12.04.2009
  • 22 рейтинг

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

    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%
    

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

    ответ дан Mark Ransom, с репутацией 217724, 14.10.2008
  • 16 рейтинг

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

    echo %Date:~0,3%day
    
    ответ дан sudipto roy, с репутацией 171, 15.07.2011
  • 15 рейтинг

    Первые четыре строки этого кода предоставят вам надежные переменные 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
    
    ответ дан foxidrive, с репутацией 33258, 7.09.2014
  • 14 рейтинг

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

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

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

    ответ дан J c, с репутацией 5500, 14.10.2008
  • 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%
    
    ответ дан J c, с репутацией 5500, 14.10.2008
  • 13 рейтинг
    "d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
    
    ответ дан DigiP, с репутацией 147, 4.12.2009
  • 9 рейтинг

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

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

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

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

    ответ дан Matthew Johnson, с репутацией 91, 4.10.2010
  • 8 рейтинг

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

     :: 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
    
    ответ дан Yordan Georgiev, с репутацией 2420, 18.05.2010
  • 7 рейтинг

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

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

    for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
    
    ответ дан John Langstaff, с репутацией 810, 28.04.2013
  • 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

    ответ дан Jeroen Wiert Pluimers, с репутацией 20414, 3.01.2011
  • 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
    

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

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

    ответ дан Jeroen Wiert Pluimers, с репутацией 20414, 3.01.2011
  • 6 рейтинг

    Функция, основанная на 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 является допустимым вызовом, если вы хотите получить только год и месяц.

    ответ дан Tomalak, с репутацией 251122, 22.01.2014
  • 6 рейтинг

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

    PowerShell -Command "get-date"
    
    ответ дан gdelfino, с репутацией 9576, 19.11.2014
  • 5 рейтинг

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

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

    ответ дан micahwittman, с репутацией 9930, 14.10.2008
  • 4 рейтинг

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

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

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

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

    (Источник)

    ответ дан KChiki, с репутацией 41, 14.06.2011
  • 4 рейтинг

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

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

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

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

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

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

    ответ дан Sally, с репутацией 80, 31.10.2010
  • 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:
    

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

    ответ дан V15I0N, с репутацией 375, 6.09.2011
  • 1 рейтинг
    :: 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
    
    ответ дан Adolfo, с репутацией 187, 10.05.2017
  • 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
    

    И сохранено в файл, отметка времени. летучая мышь, вот вывод:

    enter image description here

    ответ дан bvj, с репутацией 2163, 11.08.2016
  • 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%
    
    ответ дан Frizz1977, с репутацией 629, 16.08.2016
  • -2 рейтинг

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

    :: 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
    
    ответ дан Cricrazy, с репутацией 394, 15.08.2016