Windows cmd get time

Get system time accurate to milliseconds in Windows cmd

I’m trying to get the system time accurate to milliseconds in Windows cmd. I know that it’s possible to get centisecond accuracy using:

I’ve found other questions that are asking the exact same thing but there is no answer that fully answers the question. Here is what I’ve found so far:

This solution is only good for centisecond accuracy (same as what I described above): Print time in a batch file (milliseconds)

This solution provides a timer solution but not a print current timestamp solution: Print Batch Time in Milliseconds

Any help would be much appreciated.

2 Answers 2

As Neil pointed out there is no native solution in cmd. For anyone who has the option of using PowerShell instead, you could use the following:

There may be a more succinct way of doing it but this worked for my purposes.

Since the question is tagged cmd the appropriate command line for calling this from cmd is:

might be a workable thing for you

If you have admin privs,
and if you’re running on a WINDOWS system
and if you have a networked machine configured as a time slave (to another machine),
and if want to only measure TIME DELTAS,
you can query the Windows «W32tm» utility.

It gives you the microseconds since the last Time Synchronization, via the call

(Lotsa stuff prints out)

then pluck out only the line with the last sync time

Then, from a BAT file, do like:

(what you want to measure goes here)

Little more work if you want to automate the subtraction, but it can be done

Как можно работать с переменными среды %date% и %time% в коммандных файлах Windows .cmd / .bat

Иногда требуется сформировать переменную даты и времени в cmd / bat скриптах windows так, как нужно нам, а не так, как нам отдаёт операционная система.

Например чтоб добавить эти данные в log файл, для фиксации времени или даты события, создать файл с именем, в котором должны фигурировать данные даты или времени (день, месяц, год, час, минуты, скунды, миллисекунды.) Да мало-ли, какие у нас задачи. Подключаем нашу фантазию 🙂

В следующем примере мы видим разбиение переменных по нужным нам шаблонам.

h- час 2 знака (то есть час будет выдаваться в следующем виде — 01, 02, . 09, . , 12, . 24)

m — минуты 2 знака

s — секунжы 2 знака

ms — миллисекунды 2 знака, почему-то от 0 до 99

dd — день 2 знака

mm — месяц 2 знака

yyyy — год 4 знака

Пример использования переменных %DATE% и %TIME% в скриптах cmd / bat Windows:

@echo off
set h=%TIME:

9,2%
set curtime=%h%:%m%:%s%:%ms%
set dd=%DATE:

3,2%
set yyyy=%DATE:

6,4%
set curdate=%dd%-%mm%-%yyyy%
set curdatetime=%curdate% %curtime%

echo Текущее время — %curdatetime%

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

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

Первая цифра после :

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

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

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

Засекаем время в bat/cmd

При всех моих стараниях уйти от Windows везде и навсегда не получается. Есть компьютер на работе, компьютеры друзей, собственный нетбук, с которым неохота возиться настолько кардинально. При этом, ряд задач в принципе выполняется из командной строки проще и удобнее, чем «оконно-мышевым» способом. Особенно если это задачи из тех, что имеют прямое отношение к Linux, например, работа с утилитами из комплекта gnuwin32.

Читайте также:  Астра линукс рутокен драйвер

Запуская однажды уже упомянутую упаковку/распаковку при помощи windows-реализации tar, я захотел однажды засечь время. Ну, не секундомером же это делать… Сделал командный файл, в котором вывожу время, запускаю архиватор, снова вывожу время.

Получается ерунда. Команда time \t выдает время с точностью до минуты. Ладно, можно использовать переменную среды %time% :

Чуть получше, но все равно очень плохо. Во-первых, если архиватору добавить ключ -v, и он начнет выдавать в консоль имена архивируемых объектов, то время начала стремительно унесется за пределы экрана. Во-вторых, чтобы понять, сколько процесс занял времени, все равно придется считать, а компьютер на что?

Однако переменная %time% хитроформатированная, скорее текст, чем число, и ее в лоб не получится использовать для вычитания времени начала из времени окончания. Тем более, командный интерпретатор cmd.exe работает с целочисленными значениями, а время идет с точностью до сотых секунды (ну, или до десятков миллисекунд, как хотите).

Ладно, разберем время на составляющие. При помощи конструкции set t1_m=%t1:

3,2% которая присваивает переменной t1_m два знака из t1, пропустив первые три, получим часы, минуты, секунды и сотые доли секунды:

Напоминаю, что ключик /a позволяет оператору set не только присваивать значение переменной, но и выполнять некоторые операции (подробнее — set /? ).

В результате получили в s1 время в сотнях миллисекунд, допустим, из времени начала операции. Можно сделать аналогичным образом s2 из времени окончания. Эти две переменные целочисленные и прекрасно складываются, вычитаются и все такое. Нам надо разность, и, чтобы избежать неожиданностей со знаками, можно сразу определить, что из них больше, и потом вычитать:

Ключик /i расширяет возможности оператора сравнения, позволяя ему не только выполнять сравнение строк на тождественность (чем он занимался изначально), но и сравнивать числа на больше/меньше/равно ( if /? )

Получили s3 — разность времени в десятках миллисекунд. Надо разобрать на составляющие, а потом склеить обратно в удобочитаемом виде. Все несложно, используем остаток от деления, чтобы избавиться, например, от часов при извлечении минут, и деление (целочисленное, другого тут нет), чтобы избавиться от секунд, примерно так:

Тут надо не забыть забавную тонкость: в командном интерпретаторе символ процента — подводный камень. Иногда он ставится по обе стороны от переменной, и тогда при выполнении интерпретатор отбрасывает эту пару, а имя переменной заменяет значением. Иногда он стоит перед переменной цикла. Иногда он используется в виде оператора получения остатка от целочисленного деления. Так вот, там, где процент непарный, его надо не забывать удваивать, а то его отбросят и будут безуспешно искать пару.

Получили часы, минуты, секунды и десятки миллисекунд в отдельных переменных. Можно их использовать, как числа, а можно — как строки, поэтому их легко склеить в одно значение времени и выдать его в стандартный поток ввода-вывода, «на консоль»:

Все это можно засунуть в отдельный файл, чтобы использовать в разных местах. Тогда время надо будет передавать файлу в виде параметров. Тут есть два варианта: либо

и передавать параметры в двойных кавычках (а тильда раскроет кавычки), либо

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

Итого, получился такой командный файл, скажем, timecalc.bat:

Теперь об использовании. Допустим, есть такой батничек, запускающий архивацию с засечкой времени:

В переменных a и b имеем время начала и окончания операции соответственно. Можно передать их нашему скрипту, непременно валяющемуся тут же рядом, в этой же папке:

Читайте также:  Linux file kernel version

И он выведет в консоль затраченное время третьей строчкой, после «start » и «stop ». Но хотелось бы добавить, допустим, «упаковано за » или «распаковано за », так что ввести соответствующие строки в файл «подпрограммы» не получится. Передавать этот строковый «довесок» в виде еще одного параметра и не особо красиво, и при желании дописать текст после времени (а не перед) опять потребует лезть в вызываемый файл. А как перехватить вывод вызываемого файла для использования в вызывающем?

Я просто обалдел, когда узнал. Внезапно, при помощи оператора цикла. О, сколько нам открытий чудных готовит for /? …

Расширение синтаксиса /F позволяет выковыривать переменную цикла из разного рода наборов: файлов, символьных строк, команд. Чтобы понять, что используется для цикла, применяются (или не применяются) кавычки. Без кавычек в скобках пишем файл или набор файлов. А применение кавычек зависит от того, установлена или нет опция usebackq: при установленной в двойных кавычках пишем строку, в простых — команду. При снятой опции строку пишем в простых кавычках, а команду — в обратных (которые обычно на клавише с буквой Ё). При этом, команда вполне может быть одна, и проход цикла тоже один, и в теле цикла получаем нужный нам вывод команды, который засунем в переменную для дальнейшего использования (хотя можно и использовать сразу):

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

Итого получаем такой командный файл, скажем, tar_time.cmd, который принимает в качестве параметра пакуемую папку, засекает время и пишет его в консоль и в лог-файл:

Аналогичным образом написал почти то же для распаковки, поправив пару строчек.

Конечно, можно кое-что оптимизировать, например, все вычисления с константами сделать на калькуляторе (или в уме), преобразование времени в сотые доли секунды вынести в «функцию» и вызывать ее через call , но так удобочитаемее, а на скорость выполнения влияет мало. Еще можно вместо своры собак ( @ ) поставить один раз в начале файла @echo off , дело вкуса. И, конечно, можно повнимательнее относиться к регистру символов и писать либо везде прописными, либо везде строчными. Но, как уж получилось…

Возможности команд Windows (тяжелое наследие DOS), конечно, довольно ограничены, но даже с их помощью можно делать интересные и полезные штучки. Вот только иногда фиг догадаешься, описание какой команды для твоей цели нужно смотреть и где именно искать…

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

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

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

Читайте также:  List 850 драйвер windows 10

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

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

C:> test.cmd
Локальная дата: [2012-06-19 10: 23: 47.048]

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

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

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

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 для получения информации о годе, месяце, дне и времени:

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

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

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

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

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

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

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

ROBOCOPY — это не встроенная команда для Windows XP и Windows Server 2003, но ее можно скачать с сайта Microsoft . Но встроен во все, от Windows Vista и выше:

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

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

Гибрид VSCRIPT / BATCH ( возможно ли встроить и выполнить VBScript в пакетный файл без использования временного файла? ) В том же случае, что и в JScript, но гибридизация не так совершенна:

PowerShell — может быть установлен на любой машине с .NET — скачать с Microsoft ( v1 , v2 , v3 (только для Windows 7 и выше)). Он устанавливается по умолчанию на все, начиная от Windows 7 / Windows Server 2008 и выше:

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

Самоскомпилированный jscript.net/batch (никогда не видел машины с Windows без .NET, поэтому я думаю, что это довольно переносимо):

Логман Это не может получить год и день недели. Это сравнительно медленно, а также создает временный файл и основывается на отметках времени, которые logman помещает в свои файлы журнала. Это будет работать на всем от Windows XP и выше. Это, вероятно, никогда не будет использоваться никем — включая меня — но это еще один способ .

Еще один способ с WMIC, который также дает неделю года и день недели, но не миллисекунды (для миллисекунд проверьте ответ foxidrive):

Использование TYPEPERF с некоторыми усилиями, чтобы быть быстрым и совместимым с различными настройками языка и максимально быстро:

MSHTA позволяет вызывать методы JavaScript, аналогичные методу JScript, продемонстрированному в # 3 выше. Имейте в виду, что свойства объекта Date в JavaScript, включающие значения месяца, пронумерованы от 0 до 11, а не от 1 до 12. Таким образом, значение 9 означает октябрь.

Оцените статью