что такое Windows эквивалент команды date +% s

Я пишу пакетный скрипт, и мне нужно время unix. В Linux это просто, но я не могу понять, как это сделать в Windows.


person whoabackoff    schedule 20.06.2012    source источник
comment
Возможно, это поможет.   -  person ArtemStorozhuk    schedule 20.06.2012


Ответы (3)


Вот собственное пакетное решение, которое должно работать в любом регионе. Он использует WMIC для получения текущего местного времени независимо от локали. Все остальное - это "простой" вопрос разбора строк и элементарной математики.

:UnixTime  [ReturnVar]  [TimeStamp]
::
:: Computes the Unix time from the current local time as reported by the
:: operating system. The Unix time is the number of seconds that have elapsed
:: since midnight Coordinated Universal Time (UTC), January 1, 1970, not
:: counting leap seconds.
::
:: The result is returned in variable ReturnVar,
:: or the result is echoed if ReturnVar is not specified
::
:: If the TimeStamp is provided in the 2nd parameter, then the Unix time for
:: the TimeStamp is computed, rather then for the current time.
::
:: The TimeStamp must have the same format as used by WMIC:
::
::   YYYYMMDDhhmmss.ffffffSzzz
::
:: where:
::
::   YYYY   = gregorian year
::   MM     = month
::   DD     = day
::   hh     = hour in 24 hour format
::   mm     = minute
::   ss     = seconds
::   ffffff = fractional seconds (microseconds)
::   S      = timezone sign: + or -
::   zzz    = timezone: minutes difference from GMT
::
:: Each component must be zero prefixed as needed to maintain the proper width.
::
:: The ReturnVar parameter must be provided in order to use the TimeStamp.
:: A ReturnVar of "" will function the same as no ReturnVar. This enables the
:: specification of a TimeStamp without an actual ReturnVar.
::
@echo off
setlocal
set "ts=%~2"
if not defined ts for /f "skip=1 delims=" %%A in ('wmic os get localdatetime') do if not defined ts set "ts=%%A"
set /a "yy=10000%ts:~0,4% %% 10000, mm=100%ts:~4,2% %% 100, dd=100%ts:~6,2% %% 100"
set /a "dd=dd-2472663+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4"
set /a ss=(((1%ts:~8,2%*60)+1%ts:~10,2%)*60)+1%ts:~12,2%-366100-%ts:~21,1%((1%ts:~22,3%*60)-60000)
set /a ss+=dd*86400
endlocal & if "%~1" neq "" (set %~1=%ss%) else echo %ss%
exit /b


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

ИЗМЕНИТЬ - код был изменен для поддержки преобразования строки отметки времени в командной строке вместо текущего местного времени. Поддерживается точный диапазон времени: от 1901-12-13 20: 45: 52.000000 до 2038-01-19 03: 14: 07.999999 GMT. Время до 1970-01-01 00: 00: 00.000000 даст отрицательные значения.

person dbenham    schedule 20.06.2012
comment
@pizza - Это для меня новость. Скрипт отлично работает на Windows 7 без прав администратора. Я почти уверен, что он работает и с другими версиями Windows. Вы действительно тестировали сценарий? И если да, то какая версия Windows? - person dbenham; 21.06.2012
comment
winxp: не удалось зарегистрировать файл (ы) mof. Только члены группы администраторов могут использовать WMIC.EXE. Причина: ошибка Win32: отказано в доступе. - person pizza; 21.06.2012
comment
@pizza - я подтвердил, что код работает в Vista и Windows 7 без прав администратора (по крайней мере, по умолчанию). WMIC доступен в XP Professional, но не в XP Home. Я не уверен, какие привилегии предъявляются к XP Professional по умолчанию. - person dbenham; 21.06.2012
comment
Здесь есть несколько связанных сообщений: stackoverflow.com/a/4783062/1276280 обратите внимание на комментарии. Попробуйте создать новый идентификатор пользователя на 7 / Vista без специальных прав, я подозреваю, что это тоже не сработает. - person pizza; 21.06.2012
comment
Я только что пробовал на 7pro, он работает с обычным идентификатором пользователя. К сожалению, только не XP. В остальном партия довольно крутая. - person pizza; 21.06.2012

Если под "временем unix" вы имеете в виду секунду эпохи, тогда Windows не включает инструменты для создания тот. Вместо этого вы можете установить сторонние инструменты. Например:

  • Установите Cygwin.
  • Найдите двоичный файл date (в папке C:\Cygwin\ или там, где вы его установили)
  • Используйте его так же, как в Linux.

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

person ghoti    schedule 20.06.2012
comment
Нет необходимости устанавливать Cygwin только для того, чтобы получить единственный инструмент. Большинство (все?) Инструментов GNU можно загрузить и использовать без Cygwin. - person a_horse_with_no_name; 20.06.2012
comment
+1 ... это правильный ответ. Есть ряд других слоев Unixy для Windoze, UWIN и т. Д., Но все используют Cygwin. Также, возможно, стоит объяснить, что Windows - это не Unix, конечно, вы не можете получить секунды эпохи (изначально)! - person ormaaj; 20.06.2012
comment
Я пробовал GnuWin32 в Windows, и он не работает для дат до 1970 года. В Linux он работает и возвращает отрицательные числа. date +% s --date 31 декабря 1969 должен вернуть -86400, но он возвращает мне недопустимую дату - person Joe Jobs; 06.01.2021

Вы можете использовать vbscript в Windows, интерпретатор доступен в вашей системе.

'--------------------epoch.vbs----------------------- 
option explicit
dim s,o,z
for each o in GetObject("winmgmts:").InstancesOf ("Win32_OperatingSystem")
z=o.CurrentTimeZone
next
s=DateDiff("s", "01/01/1970 00:00:00", Now())-(60*z)
wscript.echo(s)
wscript.quit
person pizza    schedule 20.06.2012
comment
При этом не учитываются различия часовых поясов. Это также будет зависеть от перехода на летнее время. - person dbenham; 20.06.2012
comment
изменено для работы с часовыми поясами. - person pizza; 21.06.2012