2012-09-28 13 views
5

Estoy tratando de escribir un script por lotes que obtenga el día, mes y año actuales de manera segura (es decir, independientemente del formato de fecha). Desafortunadamente todas las fuentes de Internet que he encontrado proponen algo como:Manera segura de obtener el día actual mes y año en el lote

SET CURRENT_DATE=%DATE: =0% 
    SET YEAR=%DATE:~-4% 
    SET MONTH=%DATE:~3,2% 
    SET DAY=%DATE:~5,2% 

Esto funcionará si mi fecha está en formato aaaa/mm/dd o dd-mm-dd sino que no se si es en formato AA-MM -dd o algún otro formato. ¿Hay una forma segura de obtener el año, el mes y el día?

Y una pregunta más: ¿es posible saber qué es el separador de días? (/ en el primer caso y - en los otros casos).

+1

Uso WMIC en cambio, [SO: Log Fecha/Hora] (http://stackoverflow.com/a/7730453/463115) – jeb

Respuesta

7

Primero, podría recuperar la configuración actual del registro (en algún lugar).
El formato y también los separadores.

Pero en su lugar es más fácil usar wmic, siempre tiene el mismo formato, el único inconveniente es que toma un poco de tiempo, cada vez que lo inicia.

muestra Modificado de SO: Log Date/Time

@echo off 
setlocal EnableDelayedExpansion 
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    if "%%B" NEQ "" (
     SET /A FDATE=%%F*10000+%%D*100+%%A 
     SET /A FTIME=%%B*10000+%%C*100+%%E 
    ) 
) 
ECHO !FDATE! - !FTIME! 
+0

lo que hace ' setlocal EnableDelayedExpansion' do y por qué es necesario en este ejemplo? –

+1

Permite la expansión retrasada (¡Guau!), Es mejor leer la ayuda de 'set /?'. Y para decir la verdad: No es necesario aquí :-), Simplemente puedes cambiar el eco a 'echo% FDATE% -% FTIME%' – jeb

9

Las primeras cuatro líneas de este código le dará las variables fiables YY DD MM AAAA HH MIN SEC en XP Pro y superior.

@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 

Aquí es una solución VBS:

:: date time using WSH/VBS 
    :: datetime.bat V4.2 
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
    :: 
    :: This uses Windows Scripting Host to set variables to 
    :: the current date/time/day/day_number/week_of_year etc 
    :: for Win9x/ME/NT/W2K/XP/Vista/Win7/Win8 etc 
    :: Thanks go to Todd Vargo for his scripting 
    :: 
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
    @echo off 
    set TmpFile="%temp%.\tmp.vbs" 
    echo> %TmpFile% n=Now 
    echo>>%TmpFile% With WScript 
    echo>>%TmpFile% .Echo "set m1=" + monthname(month(n), true) 
    echo>>%TmpFile% .Echo "set m2=" + monthname(month(n), false) 
    echo>>%TmpFile% .Echo "set woy=" + CStr(datepart("ww", n)) 
    echo>>%TmpFile% .Echo "set year=" + CStr(Year(n)) 
    echo>>%TmpFile% .Echo "set yr=" + Right(Year(n),2) 
    echo>>%TmpFile% .Echo "set month="+ Right(100+Month(n),2) 
    echo>>%TmpFile% .Echo "set day=" + Right(100+Day(n),2) 
    echo>>%TmpFile% .Echo "set hour=" + Right(100+Hour(n),2) 
    echo>>%TmpFile% .Echo "set min=" + Right(100+Minute(n),2) 
    echo>>%TmpFile% .Echo "set sec=" + Right(100+Second(n),2) 
    echo>>%TmpFile% .Echo "set dow=" + WeekDayName(Weekday(n),1) 
    echo>>%TmpFile% .Echo "set dow2=" + WeekDayName(Weekday(n)) 
    echo>>%TmpFile% .Echo "set iso=" + CStr(1 + Int(n-2) mod 7) 
    echo>>%TmpFile% .Echo "set iso2=" + CStr(Weekday(n,2)) 
    echo>>%TmpFile% End With 
    cscript //nologo "%temp%.\tmp.vbs" > "%temp%.\tmp.bat" 
    call "%temp%.\tmp.bat" 
    del "%temp%.\tmp.bat" 
    del %TmpFile% 
    set TmpFile= 
    set stamp=%year%-%month%-%day%.%hour%_%min%_%sec% 

    if not "%~1"=="" goto :EOF 

    echo The year is "%year%" or "%yr%" 
    echo The month is "%month%" "%m1%" "%m2%" 
    echo The day is "%day%" "%dow%" "%dow2%" 
    echo. 
    echo ISO8601 Day-Of-Week number is "%iso%" and week of year is: "%woy%" 

    echo. 
    echo The time in hh:mm:ss is "%hour%:%min%:%sec%" 
    echo The hour is "%hour%" 
    echo The minute is "%min%" 
    echo The second is "%sec%" 
    echo. 

    echo The date and time stamp is "%stamp%" 
    echo. 
    echo date A yyyymmdd "%year%%month%%day%" 
    echo date B mmddyyyy "%month%%day%%year%" 
    echo date C ddmmyyyy "%day%%month%%year%" 
    echo date D yymmdd "%yr%%month%%day%" 
    echo date E mmddyy "%month%%day%%yr%" 
    echo date F ddmmyy "%day%%month%%yr%" 
    pause 
    :: datetime.bat 
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
Cuestiones relacionadas