2010-08-10 13 views
7

¿Hay alguna manera de obtener un tiempo de época con un comando de Windows? De lo contrario, ¿pueden modificarse los comandos date y time?¿Hay alguna forma de obtener un tiempo de época usando un comando de Windows?

Por ejemplo date en Windows da la fecha con/etc me gustaría obtener una salida que no tiene caracteres especiales como /:

+1

Con * epoch time * - ¿te refieres al recuento actual de todos los segundos desde el 1 de enero de 1970? –

+0

... o desde 1904-01-01 o intervalos de 100 ns desde 1601-01-01 o varias otras épocas ;-) La época de UNIX es de lejos la más extraña, imho ;-) – Joey

+0

@moorecats: si mi respuesta funcionó bien para ti, puedes votarlo y luego seleccionarlo como la respuesta a tu pregunta. Así es como funciona StackOverflow. Vea las preguntas frecuentes - http://stackoverflow.com/faq. Por supuesto, puede seleccionar otra respuesta si cree que se ajusta mejor a su pregunta. –

Respuesta

0

Para obtener la hora en el formato "AAAAMMDD", intente esto:

for /F "tokens=2-4 delims=/ " %i in ('date /t') do echo %k%i%j 

Más en:

+0

Esto funcionó muy bien. El artículo fue genial, gracias por señalarme eso. – moorecats

2

desde la línea de comandos a probar esto

for /f "tokens=2,3,4 delims=/ " %f in ('date /t') do @echo %h%g%f 

recordar que doblar el% de caracteres, si en el archivo por lotes

@echo off 
setlocal 
for /f "tokens=2,3,4 delims=/ " %%f in ('date /t') do set d=%%h%%g%%f 
for /f "tokens=1,2 delims=: " %%f in ('time /t') do set t=%%f%%g 
echo datetime is : %d%%t% 
endlocal 

llegué esta salida:

c:\development>xx.bat 
datetime is : 201008111108 
+0

Y obtengo 'datetime is: 2331' ;-) – Joey

+0

@Preet Sangha: su' t' puede contener espacios en blanco iniciales si la hora es anterior a las 10:00 h. Puedes arreglar eso por 'set t =% t: = 0' (que sustituye todos los espacios por' 0') ... –

+0

@pip - sweet! gracias. Siéntase libre de simplemente editar la respuesta. –

1

No hay manera confiable de conseguir una fecha en archivos por lotes sin recurriendo a herramientas externas u otros lenguajes como VBScript.

Desde VBScript puede acceder a la fecha y hora actual con las funciones Date y Time. FormatDateTime le proporcionará un formato de fecha/hora de cultivo neutral que luego puede analizar.

Usted puede obtener un resultado frmo el VBScript utilizando WScript.Echo desde el script y llamarlo como tal a partir del lote:

for /f "delims=" %%x in ('cscript /nologo foo.vbs') do set result=%%x 

Entonces la variable %result% contiene cualquiera que sea el VBScript tuvo como salida en su primera línea .

+0

Rössel: ¿Por qué dices que * 'no hay una manera confiable de obtener una fecha en los archivos por lotes' *? ¿En qué sentido son 'date/t' y' time/t' o 'echo.% Date%' y 'echo.% Time%' unreliable? - (Puede que no sean fáciles de procesar en archivos por lotes, pero ¿cómo son 'no confiables'?) –

+1

Rössel: ¿Quiso decir: * No hay una forma confiable de obtener una fecha en los archivos por lotes * ** para que funcionan de manera confiable en diferentes lugares y zonas horarias **? –

+0

@pipitas: De hecho, eso es lo que estoy diciendo. O en otras palabras: puede obtener una fecha/hora muy bien para darle un humano para leer, pero no puede obtener de manera confiable la fecha u hora en un formato estructurado para procesarlo más con el archivo por lotes. Existen algunas soluciones que funcionan para una mayor variedad de configuraciones regionales pero aún fallan en algunas. Por eso lo llamo poco confiable. Si quiero modificar un programa y distribuirlo a otros, ciertamente no quiero que la configuración regional afecte su función. – Joey

2

A través de mi propia investigación en línea, no pude encontrar una manera de hacer esto a través de un archivo por lotes directamente. Sin embargo, yo era capaz de encontrar esta solución que funcionó para mí:

En toEpoch.vbs:

WScript.Echo DateDiff("s", "01/01/1970 00:00:00", Now()) 

Luego llamada de mi escritura de la hornada de este modo:

for /f "delims=" %%x in ('cscript /nologo toEpoch.vbs') do set epoch=%%x 

que establecen el% epoch% variable con la marca de tiempo actual de Unix y pude usarlo como lo necesitaba.

Espero que esto ayude.

1

El proyecto CoreUtils para Windows, http://gnuwin32.sourceforge.net/packages/coreutils.htm tiene un comando date, que le ofrece las mismas opciones que en Linux.

Descargue el software y cambie el nombre de date.exe a gnudate.exe, para evitar un conflicto con el comando Dos date. Necesita los archivos libintl-2.dll y libiconv-2.dll para ejecutar el comando.

Para todas las opciones disponibles Tipo:

gnudate --help 

Por ejemplo gnudate "+%a %e %b %Y %H:%M:%S" dará:

Sun 10 apr 2016 21:52:35 

El comando gnudate +%s dará los segundos desde el Epoch:

1460325461 

El siguiente Dos el archivo por lotes muestra el uso de gnudate. Necesitará duplicar el % en el parámetro gnudate +%s.

rem set the variable s to the epoch seconds. 
for /f "tokens=1 delims=" %%A in ('gnudate +%%s') do set s=%%A 
rem use `%s%` for the time offset parameter of the ffmpeg drawtext filter. 
ffmpeg -y -f lavfi -i testsrc=duration=15.3:size=cif:r=10 -vf "drawtext=fontfile=arial.ttf:text=%%{pts\\\:localtime\\\:%s%\\\:%%a %%d %%b %%Y %%H\\\\\\:%%M\\\\\\:%%S}:fontsize=10:x=w-text_w:y=h-lh:box=1" a.mp4 

ffplay a.mp4 

Este archivo de proceso por lotes se probó con Windows 8 en una máquina virtual bajo Linux.

Para ejecutarlo, tendrá que instalar ffmpeg.
Puede descargar Static build en https://ffmpeg.zeranoe.com/builds/.

Cuestiones relacionadas