¿Configuración regional% DATE% y% TIME% en archivos por lotes?


16

Las variables de entorno %DATE%y %TIME%proporcionan la fecha y hora actuales en máquinas Windows en la línea de comando y dentro de un archivo por lotes.

Lamentablemente, esos valores son locales! Lo que significa que, por ejemplo, en una máquina alemana, obtendrá

26.1.2011

en lugar de

2011-26-01

esto arruina la clasificación si desea utilizar esta variable en un nombre de archivo.

¿Hay alguna manera fácil de obtener una YYYY-MM-DDcadena de fecha desconocida en un archivo por lotes de Windows?

Por el momento, estoy trabajando con esta solución poco clara:

for /f "tokens=1,2,3,4 delims=. " %%i in ('date /t') do set date=%%k-%%j-%%i
echo %date%

pero esto ahora es específico de la localidad alemana: obviamente, una solución completamente independiente sería mucho mejor.

El sistema operativo en cuestión es Server 2008. Preferiría no utilizar una herramienta de terceros, si es posible.

Respuestas:


22

Hubo algunos intentos ( Rob van der Woude tenía algo), pero nada funcionó realmente en todos los lugares. Sin embargo, puede obtener la hora actual en un formato fácilmente analizable a través de

wmic os get LocalDateTime

Lo siguiente ya tiene al menos UTC:

@echo off
rem Get the time from WMI - at least that's a format we can work with
set X=
for /f "skip=1 delims=" %%x in ('wmic os get localdatetime') do if not defined X set X=%%x
echo.%X%

rem dissect into parts
set DATE.YEAR=%X:~0,4%
set DATE.MONTH=%X:~4,2%
set DATE.DAY=%X:~6,2%
set DATE.HOUR=%X:~8,2%
set DATE.MINUTE=%X:~10,2%
set DATE.SECOND=%X:~12,2%
set DATE.FRACTIONS=%X:~15,6%
set DATE.OFFSET=%X:~21,4%

echo %DATE.YEAR%-%DATE.MONTH%-%DATE.DAY% %DATE.HOUR%:%DATE.MINUTE%:%DATE.SECOND%.%DATE.FRACTIONS%

Sin embargo, es probable que deba tener en cuenta el desplazamiento de la zona horaria (a menos que sea para un archivo de registro, entonces siempre usaría UTC), pero eso no es un cálculo que no pueda hacer :-)


1
Excelente, ¡esto se ve exactamente como lo que necesito! Gracias.
Pekka

2
Para el registro: for /f %%x in ('wmic os get localdatetime ^| findstr /b [0-9]') do @set X=%%xes un poquito más agradable. También hay una versión más compacta disponible aquí , es decir, en ese comentario .
Tomalak

Es un poco difícil encontrar y actualizar todas las instancias antiguas donde escribiste algo :). Probablemente usaría Win32_UTCTime y Win32_LocalTime por ahora.
Joey

¡realmente fantástico!
jeromerg

Como dice @Tomalak, la findstrsolución es mucho mejor, en mi caso, el original for(sin el skip) itera 3 veces. Una vez para la palabra "LocalDateTime", una segunda vez para la fecha real y una tercera para un valor vacío (¿tal vez un salto de línea?).
cavpollo

9

Aquí hay dos líneas que he estado usando, que parece funcionar independientemente de la versión de Windows o la configuración de la hora local:

FOR /f %%a in ('WMIC OS GET LocalDateTime ^| find "."') DO set DTS=%%a
set CUR_DATE=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%

Esto establecerá una variable llamada% CUR_DATE% en el siguiente formato estándar ISO:

yyyy-mm-dd

Intenté convertirlo en una línea con &&, pero no pareció tomarlo, así que recurrí a la versión de dos líneas. Espero que esto ayude.


0

Yo uso este truco para obtener UTC ..

for /f "tokens=*" %%i in ('tzutil /g') do set CTZ=%%i
tzutil /s UTC
set UTC=
for /f  "skip=1 delims=" %%i in ('WMIC OS GET LocalDateTime') do if not defined UTC set UTC=%%i
tzutil /s "%CTZ%"
set UTC=%UTC:~0,4%-%UTC:~4,2%-%UTC:~6,3%T%UTC:~8,13%
echo %UTC%

Sin embargo, tiene el efecto secundario de cambiar brevemente todo el sistema a UTC. Esto probablemente esté bien en una estación de trabajo personal, pero no estoy seguro de cuál sería el impacto en un servidor de producción grande, que probablemente debería configurarse en UTC de todos modos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.