Wie erhalte ich das aktuelle Datum und die aktuelle Uhrzeit in der Windows-Befehlszeile in einem geeigneten Format für die Verwendung in einem Datei- / Ordnernamen?

540

Update: Jetzt, da es 2016 ist, würde ich PowerShell dafür verwenden, es sei denn, es gibt einen wirklich überzeugenden abwärtskompatiblen Grund dafür, insbesondere aufgrund des Problems der regionalen Einstellungen bei der Verwendung date. Siehe @ npocmakas https://stackoverflow.com/a/19799236/8479


Mit welchen Windows-Befehlszeilenanweisungen kann ich die aktuelle Datums- und Uhrzeitangabe in einem Format abrufen, das ich in einen Dateinamen einfügen kann?

Ich möchte eine .bat-Datei haben, die beispielsweise ein Verzeichnis in ein Archiv mit dem aktuellen Datum und der aktuellen Uhrzeit als Teil des Namens komprimiert Code_2008-10-14_2257.zip. Gibt es eine einfache Möglichkeit, dies unabhängig von den regionalen Einstellungen der Maschine zu tun?

Das Datumsformat macht mir nichts aus, im Idealfall wäre es JJJJ-MM-TT, aber alles Einfache ist in Ordnung.

Bisher habe ich das, was mir auf meiner Maschine gibt Tue_10_14_2008_230050_91:

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new ZIP file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.zip Code

Ich kann damit leben, aber es scheint ein bisschen klobig. Im Idealfall wäre es kürzer und hätte das zuvor erwähnte Format.

Ich verwende Windows Server 2003 und Windows XP Professional. Ich möchte keine zusätzlichen Dienstprogramme installieren, um dies zu erreichen (obwohl mir klar ist, dass es einige gibt, die eine gute Datumsformatierung ermöglichen).

Rory
quelle
7
Erstellen Sie ein automatisiertes Backup für Ihren Code? Schön für dich! Wir sollten das auch tun :)
Andrei Rînea
24
benutze Powershell Leute ...[datetime]::now.tostring("yyyy-MM-dd")
Nacht - Reinstate Monica
Ist es möglich, Dateien mit Erstellungsdatum mit xp_cmdshell in SQL Server zu laden? Ich habe eine Frage zu Stackoverflow gestellt, bitte sehen Sie den Link @ stackoverflow.com/q/32293517/3327081
Kolunar

Antworten:

667

Informationen zum aktuellen Datum im Format MMTTJJJJ finden Sie unter Windows-Batchdatei (.bat) :

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

Wenn Sie die Zeit im 24-Stunden- / Militärformat bevorzugen, können Sie die zweite FOR-Zeile durch folgende ersetzen:

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

C:>. \ Date.bat
2008-10-14_0642

Wenn Sie das Datum unabhängig von der Reihenfolge Tag / Monat der Region wünschen, können Sie "WMIC os GET LocalDateTime" als Quelle verwenden, da es in ISO-Reihenfolge vorliegt:

@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]

C:> test.cmd
Lokales Datum ist [2012-06-19 10: 23: 47.048]

Jay
quelle
44
Für Leute aus Großbritannien möchten Sie For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)die zweite Zeile.
Rory
17
Diese Lösung ist vom Gebietsschema abhängig. Rory gab das Beispiel für Großbritannien für andere Gebietsschemas an, in denen das Datum 22-02-2012 lautet. Sie müssen delims = / durch delims = -
Nuno Furtado
25
Auf meinem System gibt% TIME% Werte wie "0:01:15" und "3:15:12" zurück, und der %% a %% b-Code in der Antwort gibt ein führendes Leerzeichen wie "001" und "315" an. Um eine vierstellige Hhmm zu erhalten, verwenden Sie Folgendes: For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))Das gibt Werte wie "0001" und "0315" zurück, die ich in meinen Dateinamen bevorzuge.
Twamley
10
Schöne Version des wmicBefehls! Bisher habe ich nur gesehen WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table. Ebenso, um 20120623-1619in meiner lokalen Amsterdamer Zeitzone in einer Zeile zu gelangen:for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%
Arjan
5
Für mich heißt es%%a was unexpected at this time.
Scott zuz22 Blacklock
109

Regional unabhängige Analyse von Datum und Uhrzeit

Das Ausgabeformat von %DATE%und des dirBefehls ist regional abhängig und daher weder robust noch intelligent. date.exe (Teil von UnxUtils ) liefert alle Datums- und Zeitinformationen in jedem denkbaren Format. Sie können die Datums- / Uhrzeitinformationen auch aus jeder Datei mit extrahieren date.exe.

Beispiele: (Verwenden Sie in einem Cmd-Skript %% anstelle von%)

date.exe +"%Y-%m-%d"
2009-12-22

date.exe +"%T"
18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503: Beliebiger Text

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Text: 09/12 / 22-beliebiger Text-18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18:55:03" `

Die Datums- / Uhrzeitinformationen aus einer Referenzdatei:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Verwenden Sie es in einem CMD-Skript, um Informationen zu Jahr, Monat, Tag und Uhrzeit abzurufen:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Verwenden Sie es in einem CMD-Skript, um einen Zeitstempel in einem beliebigen Format abzurufen:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

Extrahieren der Datums- / Uhrzeitinformationen aus einer Referenzdatei.

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Hinzufügen von Datums- / Uhrzeitinformationen zu einer Datei:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe ist Teil der kostenlosen GNU-Tools, für die keine Installation erforderlich ist .

ANMERKUNG: Das Kopieren date.exein ein Verzeichnis im Suchpfad kann dazu führen, dass andere Skripts fehlschlagen, die den integrierten Windows- dateBefehl verwenden.

Uri Liebeskind
quelle
4
Viel besser als die seltsam populärere Lösung oben, aber ich musste / t hinzufügen, um die Eingabeaufforderung unter Windows 8.1 zu vermeiden
rainabba
6
Das integrierte Windows 8.1 date.exescheint vom Gebietsschema abhängig zu sein. Es gibt das Datum in TT / MM / JJJJ auf meinem System zurück. Wenn es vom Gebietsschema unabhängig wäre, würde ich entweder MM / TT / JJJJ oder JJJJ-MM-TT erwarten. Ich glaube nicht, dass diese Antwort über die eingebaute date.exe spricht, sondern über eine Version von Drittanbietern.
SSS
1
Es ist unabhängig vom Gebietsschema, wenn Sie es in der Befehlszeile mit dem gewünschten Format versehen
terrinecold
3
Bitte beachten Sie, dass date.exe (Teil von UnxUtils) nicht mit dem Befehl zum integrierten Datum identisch ist. Wenn Sie also / t hinzufügen müssen, wird der Windows-Datumsbefehl ausgeführt. Wenn so etwas wie date.exe + "% Y-% m-% d" funktioniert, haben Sie die UnxUtils korrekt installiert. :-)
just.do.it
Ist es möglich, Dateien mit Erstellungsdatum mit xp_cmdshell in SQL Server zu laden? Ich habe den Befehl "forfiles" ausprobiert, aber ohne Erfolg. Ich habe eine Frage zu Stackoverflow gestellt, bitte sehen Sie den Link @ stackoverflow.com/q/32293517/3327081
Kolunar
103

Zwei weitere Möglichkeiten, die nicht von den Zeiteinstellungen abhängen (beide stammen aus : So erhalten Sie Daten / Zeit unabhängig von der Lokalisierung :) . Und beide erhalten auch den Wochentag und keiner von ihnen benötigt Administratorrechte!:

  1. MAKECAB - funktioniert auf JEDEM Windows-System (schnell, erstellt jedoch eine kleine temporäre Datei) (das foxidrive-Skript):

    @echo off
    pushd "%temp%"
    makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
    for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
       set "current-date=%%e-%%b-%%c"
       set "current-time=%%d"
       set "weekday=%%a"
    )
    del ~.*
    popd
    echo %weekday% %current-date% %current-time%
    pause
    

    Weitere Informationen zur Get-Date-Funktion .

  2. ROBOCOPY - Es ist kein nativer Befehl für Windows XP und Windows Server 2003, kann jedoch von der Microsoft-Website heruntergeladen werden . Ist aber in alles von Windows Vista und höher integriert:

    @echo off
    setlocal
    for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
     set "dow=%%D"
     set "month=%%E"
     set "day=%%F"
     set "HH=%%G"
     set "MM=%%H"
     set "SS=%%I"
     set "year=%%J"
    )
    
    echo Day of the week: %dow%
    echo Day of the month : %day%
    echo Month : %month%
    echo hour : %HH%
    echo minutes : %MM%
    echo seconds : %SS%
    echo year : %year%
    endlocal
    

    Und drei weitere Möglichkeiten, die andere Windows-Skriptsprachen verwenden. Sie geben Ihnen mehr Flexibilität, z. B. können Sie Woche des Jahres, Zeit in Millisekunden und so weiter erhalten.

  3. JScript / Batch- Hybrid (muss gespeichert werden als .bat). JScript ist auf jedem System von NT und höher als Teil von Windows Script Host verfügbar ( obwohl es über die Registrierung deaktiviert werden kann, ist dies ein seltener Fall ):

    @if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
    
    @echo off
    cscript //E:JScript //nologo "%~f0"
    exit /b 0
    *------------------------------------------------------------------------------*/
    
    function GetCurrentDate() {
            // Today date time which will used to set as default date.
            var todayDate = new Date();
            todayDate = todayDate.getFullYear() + "-" +
                           ("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
                           ("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
                           ("0" + todayDate.getMinutes()).slice(-2);
    
            return todayDate;
        }
    
    WScript.Echo(GetCurrentDate());
    
  4. VSCRIPT / BATCH- Hybrid ( Ist es möglich, VBScript in eine Batch-Datei einzubetten und auszuführen, ohne eine temporäre Datei zu verwenden? ) Der gleiche Fall wie bei JScript, aber die Hybridisierung ist nicht so perfekt:

    :sub echo(str) :end sub
    echo off
    '>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
    '& echo current date:
    '& cscript /nologo /E:vbscript "%~f0"
    '& exit /b
    
    '0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
    '1 = vbLongDate - Returns date: weekday, monthname, year
    '2 = vbShortDate - Returns date: mm/dd/yy
    '3 = vbLongTime - Returns time: hh:mm:ss PM/AM
    '4 = vbShortTime - Return time: hh:mm
    
    WScript.echo  Replace(FormatDateTime(Date,1),", ","-")
    
  5. PowerShell - kann auf jedem Computer mit .NET installiert werden - Download von Microsoft ( v1 , v2 , v3 (nur für Windows 7 und höher)). Es wird standardmäßig unter Windows 7 / Windows Server 2008 und höher installiert:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    

    So verwenden Sie es aus einer Batchdatei:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Selbst kompiliertes jscript.net/batch (noch nie einen Windows-Computer ohne .NET gesehen, daher denke ich, dass dies ein ziemlich portables Gerät ist):

    @if (@X)==(@Y) @end /****** silent line that start JScript comment ******
    
    @echo off
    ::::::::::::::::::::::::::::::::::::
    :::       Compile the script    ::::
    ::::::::::::::::::::::::::::::::::::
    setlocal
    if exist "%~n0.exe" goto :skip_compilation
    
    set "frm=%SystemRoot%\Microsoft.NET\Framework\"
    
    :: Searching the latest installed .NET framework
    for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
        if exist "%%v\jsc.exe" (
            rem :: the javascript.net compiler
            set "jsc=%%~dpsnfxv\jsc.exe"
            goto :break_loop
        )
    )
    echo jsc.exe not found && exit /b 0
    :break_loop
    
    
    call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
    ::::::::::::::::::::::::::::::::::::
    :::       End of compilation    ::::
    ::::::::::::::::::::::::::::::::::::
    :skip_compilation
    
    "%~n0.exe"
    
    exit /b 0
    
    
    ****** End of JScript comment ******/
    import System;
    import System.IO;
    
    var dt=DateTime.Now;
    Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
    
  7. Logman Dies kann nicht das Jahr und den Wochentag abrufen . Es ist vergleichsweise langsam und erstellt auch eine temporäre Datei. Es basiert auf den Zeitstempeln, die logman in seine Protokolldateien einfügt. Es funktioniert unter Windows XP und höher. Es wird wahrscheinlich nie von irgendjemandem benutzt werden - auch nicht von mir - aber es ist eine weitere Möglichkeit ...

    @echo off
    setlocal
    del /q /f %temp%\timestampfile_*
    
    Logman.exe stop ts-CPU 1>nul 2>&1
    Logman.exe delete ts-CPU 1>nul 2>&1
    
    Logman.exe create counter ts-CPU  -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
    Logman.exe start ts-CPU 1>nul 2>&1
    
    Logman.exe stop ts-CPU >nul 2>&1
    Logman.exe delete ts-CPU >nul 2>&1
    for /f "tokens=2 delims=_." %%t in  ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
    
    echo %timestamp%
    echo MM: %timestamp:~0,2%
    echo dd: %timestamp:~2,2%
    echo hh: %timestamp:~4,2%
    echo mm: %timestamp:~6,2%
    
    endlocal
    exit /b 0
    
  8. Ein weiterer Weg mit WMIC, der auch die Woche des Jahres und den Wochentag angibt, jedoch nicht die Millisekunden (für Millisekunden überprüfen Sie die Antwort von foxidrive):

    for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
    echo %day%
    echo %DayOfWeek%
    echo %hour%
    echo %minute%
    echo %month%
    echo %quarter%
    echo %second%
    echo %weekinmonth%
    echo %year%
    
  9. Verwenden von TYPEPERF mit einigen Anstrengungen, um schnell und kompatibel mit verschiedenen Spracheinstellungen und so schnell wie möglich zu sein:

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=")
    set "mon="
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. Mit MSHTA können JavaScript-Methoden aufgerufen werden, die der in # 3 oben beschriebenen JScript-Methode ähneln. Beachten Sie, dass die Eigenschaften des JavaScript-Datumsobjekts mit Monatswerten von 0 bis 11 und nicht von 1 bis 12 nummeriert sind. Ein Wert von 9 bedeutet also Oktober.

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>
    
npocmaka
quelle
2
für Powershell C: \> für / f %% i in ('Powershell Get-Date-Format "{yyyyMMdd_HHmmss}"') setze datetime = %% i C: \> echo% datetime%
Samuel
1
makecab: Dies funktioniert, indem eine Datei mit dem Namen erstellt ~.rptund eine stringdarin gesuchte Datei durchsucht wird, beginnend mit makecabeiner Zeile wieMakeCAB Report: Tue Sep 02 22:15:57 2014 . Für mich ist dieser Befehl nicht lokalisiert, sondern unabhängig vom Gebietsschema. Dieser Trick beruht darauf. Hoffen wir, dass es niemals so wird, oder hüten Sie sich!
n611x007
10
Ich genieße den Eröffnungstext "Zwei weitere ...", gefolgt von 8 Lösungen.
Adam Smith
1
Was, kein mshtaHybrid? :) Stört es dich, wenn ich deine Antwort bearbeite und eine hinzufüge? Dies scheint die beste Sammlung esoterischer Lösungen zu sein, und es scheint, als ob sie mshtahierher gehört.
Rojo
1
Die akzeptierte Lösung würde für mich nicht funktionieren, egal was ich versuchte. Mehrere dieser Lösungen haben bei mir funktioniert. (Charge und Powershell).
Brett Wait
44

Hier ist eine Variante von alt.msdos.batch.nt, die lokal unabhängig arbeitet.

Fügen Sie dies in eine Textdatei ein, z. B. getDate.cmd

-----------8<------8<------------ snip -- snip ----------8<-------------
    :: Works on any NT/2k machine independent of regional date settings
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k))
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    set Today=%'yy'%-%'mm'%-%'dd'% 
    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]

    :EOF
-----------8<------8<------------ snip -- snip ----------8<-------------

Damit der Code ohne Fehlermeldungen an stderr funktioniert, musste ich die einfachen Anführungszeichen um die Variablenzuweisungen für %% a, %% b und %% c hinzufügen. Mein Gebietsschema (PT) verursachte zu einem Zeitpunkt in der Schleife / Analyse Fehler, in denen Dinge wie "set = 20" ausgeführt wurden. Die Anführungszeichen ergeben ein Token (wenn auch leer) für die linke Seite der Zuweisungsanweisung.

Der Nachteil sind die unordentlichen Namen der Gebietsschemavariablen: 'yy', 'mm' und 'dd'. Aber hey, wen interessiert das?

vMax
quelle
3
Dies ist perfekt und der einfachste und eleganteste Ansatz, den ich bisher gesehen habe.
Doug
2
Siehe auch Jeroens Verbesserungen , die erforderlich sind, da nicht alle Gebietsschemas die Zeichenfolgen verwenden dd, mmund yyin der Ausgabe von echo:^|date.
Arjan
funktioniert nicht in allen Gebietsschemas. (Auf Deutsch dategibt Geben Sie das neue Datum ein: (TT-MM-JJ), wo das JJdein Drehbuch bricht (erwartet YY))
Stephan
35

Ich benutze dies (wieder nicht regional unabhängig (UK))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
bläulich
quelle
Siehe Cmd.exe-Umgebungsvariablen mit Colon und Tilde zu dieser wenig bekannten, aber sehr effizienten Technik. (Ein Verweis auf eine autorisierende Microsoft-Referenz wäre
willkommen
Hier ist die Batch-Dateireferenz von Microsoft für Windows XP . Diese Referenz umfasst die Verwendung von Stapelparametern . Leider keine Diskussion über die "Slicing" -Technik.
DavidRR
Das funktioniert bei mir nicht ganz. Vielleicht hat es etwas mit regionalen Einstellungen zu tun? Ich erhalte eine Ausgabe von "/ 15 / - 1-We_1009", wenn es am Mittwoch, 15. Oktober 2014 ausgeführt wird.
Joel B
26

Die ersten vier Zeilen dieses Codes geben Ihnen zuverlässige YY TT MM YYYY HH Min Sec-Variablen in Windows XP Professional und höher.

@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
foxidrive
quelle
Perfekt, dies ist die beste Lösung für mich, da das Aufrufen von PS dazu führt, dass der cmd-Text lustig aussieht.
Ste
25

Leider ist dies nicht immun gegen regionale Einstellungen, aber es macht, was Sie wollen.

set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%

Erstaunlich, was Sie auf Wikipedia finden können .

Mark Ransom
quelle
1
Mark - Found Cmd.exe-Umgebungsvariablen mit Colon und Tilde, die die in Ihrer Antwort gezeigte variable "Slicing" -Technik beschreiben. Diese Informationen werden im Wikipedia-Artikel nicht mehr gefunden. Ich möchte eine maßgebliche Referenz von Microsoft finden.
DavidRR
1
Hier ist die Batch-Dateireferenz von Microsoft für Windows XP . Diese Referenz umfasst die Verwendung von Stapelparametern . Leider keine Diskussion über die "Slicing" -Technik.
DavidRR
18

Verwenden Sie das folgende Skript, um den aktuellen Tag in der Befehlszeile abzurufen:

echo %Date:~0,3%day
sudipto roy
quelle
8
Ich habe ein bisschen damit herumgespielt und es ist das kürzeste, das ich gefunden habe, um Datum und Uhrzeit zu erhalten: echo% date
%%
15

Ein anderer Weg ( Kredit ):

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
)

@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%

Beachten Sie, dass meine beiden Antworten hier immer noch von der Reihenfolge des Tages und des Monats abhängen, die durch die regionalen Einstellungen bestimmt wird - ich bin mir nicht sicher, wie ich das umgehen soll.

J c
quelle
14
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip
DigiP
quelle
http://www.dotnetperls.com/7-zip-exampleshat einige gute Punkte kann für jemanden in Zukunft nützlich sein.
Saravanan
13

Dies ist nicht wirklich kürzer, könnte aber flexibler sein ( Kredit ):

FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%
J c
quelle
10

Hier ist eine Möglichkeit, die Datums- und Uhrzeitangabe in einer einzigen Zeile abzurufen:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e

In den USA wird "JJJJ-MM-TT Hhmm" ausgegeben. Unterschiedliche regionale Einstellungen führen zu unterschiedlichen% date% -Ausgaben. Sie können jedoch die Token-Reihenfolge ändern.

Wenn Sie ein anderes Format wünschen, ändern Sie die Echoanweisung, indem Sie die Token neu anordnen oder andere (oder keine) Trennzeichen verwenden.

Matthew Johnson
quelle
Gibt es eine Möglichkeit, die Uhrzeit in einem 12-Stunden-Format abzurufen und auch AM- oder PM-Informationen anzuzeigen?
Sangli
9

Verwenden Sie einfach diese Zeile:

PowerShell -Command "get-date"
gdelfino
quelle
9

Kurze Antwort :

 :: Start - Run , type:
 cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"

 :: click into target media, Ctrl + V to paste the result 

Lange Antwort

    @echo off
    :: START USAGE  ==================================================================
    ::SET THE NICETIME 
    :: SET NICETIME=BOO
    :: CALL GetNiceTime.cmd 

    :: ECHO NICETIME IS %NICETIME%

    :: echo nice time is %NICETIME%
    :: END USAGE  ==================================================================

    echo set hhmmsss
    :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c 
    ::DEBUG ECHO hhmmsss IS %hhmmsss%
    ::DEBUG PAUSE
    echo %yyyymmdd%
        :: this is Regional settings dependant so tweak this according your current settings
    for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set  yyyymmdd=%%F%%E%%D
    ::DEBUG ECHO yyyymmdd IS %yyyymmdd%
    ::DEBUG PAUSE


    set NICETIME=%yyyymmdd%_%hhmmsss%
    ::DEBUG echo THE NICETIME IS %NICETIME%

    ::DEBUG PAUSE
Yordan Georgiev
quelle
:: in cmd für / f% i in ('PowerShell -Command "get-date" -Format "yyyyMMdd"') setze yyyyMMdd =% i :: im cmd-Skript für / f %% i in ('PowerShell -Command "get-date" -Format "yyyyMMdd" ') setze yyyyMMdd = %% i
Yordan Georgiev
8

Matthew Johnsons Einzeiler-Lösung , um Datum und Uhrzeit des Einzeilers zu ermitteln, ist beredt und nützlich.

Es ist jedoch eine einfache Änderung erforderlich, um innerhalb einer Batchdatei zu arbeiten:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
John Langstaff
quelle
1
Funktioniert nicht in CMD (%% a war zu diesem Zeitpunkt unerwartet) oder in PowerShell (Fehlendes Öffnen '(' nach Schlüsselwort für) unter Windows 8.1
rainabba
3
Rainabba, das ist genau der Fehler, den Sie erhalten, wenn dieser Befehl von der CMD-Zeile ausgegeben wird . " Innerhalb einer Batchdatei " gibt der Befehl jedoch "2014-01-30 1324" zurück.
John Langstaff
1
oder viel einfacher wäre ohne die for-Schleifeecho %date:/=-%%time::=-%
Gerhard Barnard
7

Und hier ist eine ähnliche Batch-Datei für den Zeitabschnitt.

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional time settings
::
:: Gets the time in ISO 8601 24-hour format
::
:: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that.
:: Since ISO 8601 does not care about AM/PM, we use %time%
::
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do (
      set 'hh'=%%i
      set 'mm'=%%j
      set 'ss'=%%k
      set 'ff'=%%l)
    ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'%

    ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%]
    set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction%
    echo %timestring%

    :EOF

- Jeroen

Jeroen Wiert Pluimers
quelle
Hallo, ich konnte Dateien nach dem Änderungsdatum mit dem folgenden Befehl z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” laden , aber ich möchte wissen, wie Dateien nach dem Erstellungsdatum geladen werden. Jede Hilfe wäre sehr dankbar. Beim Stackoverflow wurde eine Frage gestellt, aber noch keine Antwort. Bitte werfen Sie einen Blick auf den Link für die Details stackoverflow.com/q/32293517/3327081
kolunar
1
Stellen Sie dazu eine neue Frage. Ich habe noch nie benutzt forfiles.
Jeroen Wiert Pluimers
7

Ich habe die Antwort mit der Batch-Datei von vMax geändert, damit sie auch mit der niederländischen Sprache funktioniert.
Die Holländer - persistent , wie wir sind - haben ein paar Änderungen in der %date%, date/tunddate dass Bruch der ursprünglichen Batch-Datei.

Es wäre schön, wenn einige Leute dies auch mit anderen Windows-Gebietsschemas vergleichen und die Ergebnisse zurückmelden könnten.
Wenn die Batch-Datei an Ihrem Standort fehlschlägt, fügen Sie die Ausgabe dieser beiden Anweisungen in die Eingabeaufforderung ein:
echo:^|date
date/t

Dies ist ein Beispiel für die Ausgabe, die Sie aus der Batch-Datei erhalten sollten:

C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103

Hier ist der überarbeitete Code mit Kommentaren zum Warum:

:: /programming/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by [email protected] for Dutch locale
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
::            set '%%c'=%%k
::            set 'yy'=%%k
::
:: In addition, date will display the current date before the input prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
::        if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
    set v_day=
    set v_month=
    set v_year=

    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::DEBUG echo toks=%toks%
      for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
        if "%%a" GEQ "A" (
          for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
            set '%%a'=%%i
            set '%%b'=%%j
            set 'yy'=%%k
          )
        )
      )
      if %'yy'% LSS 100 set 'yy'=20%'yy'%
      set Today=%'yy'%-%'mm'%-%'dd'%

    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
    set datestring=%V_Year%%V_Month%%V_Day%
    echo %datestring%

    :EOF

- Jeroen

Jeroen Wiert Pluimers
quelle
2
Einige verwenden zuerst Jahre oder es fehlen führende Nullen. siehe Wikipedia Datumsformat nach Land . Die Französisch Macht Gebrauch jj-mm-aaaafür jour, mois, annee? Italiener vielleicht gg/mm/aaaafür Giorno, Mese, Anno? Deutsche tt.mm.jjjjfür Tag, Monat, Jahr? Aber dann: Ich denke, in den meisten Ländern werden nur wenige Sprachen verwendet. Wie in den Niederlanden wird Windows oft Englisch oder Niederländisch sein, sonst nicht viel. Gut genug für mich.
Arjan
2
Nebenbei: eine andere Version in den versteckten Funktionen von Windows-Batchdateien ist weniger perfekt (benötigt die Korrektur für die Niederländer jjund erzwingt kein 4-stelliges Jahr), wird jedoch verwendet shift, um den Tag wie Monoder zu verwerfen ma. Einfach anders.
Arjan
4
Es bricht auf einem deutschen System. Jahr- und Monatsarbeit, aber Tag schlägt fehl, weil "Tag" mit einem "T" auf Deutsch ("Tag") beginnt, nicht mit einem "d". Die Formatzeichenfolge in der Eingabeaufforderung lautet(TT-MM-JJ) , die date/tAusgabe lautet 23.06.2012. / cc @Arjan
balpha
2
Eine andere Seite: Man könnte die Bestellung auch aus der Registrierung mit bekommen reg query "HKCU\Control Panel\International" /vShortDate. Beachten Sie beim Testen Folgendes: Wenn Sie bei einer geöffneten Eingabeaufforderung diese Einstellung in der Systemsteuerung ändern, ändert sich auch das Format, in dem das Datum angezeigt wird (für dateund date /tund echo %date%). Unter Windows 7 wird jedoch das Format für das neue Datum NICHT geändert! Als würde ich mein kurzes Datumsformat ändern YY/MM/dd, bekomme ich : The current date is: 12/06/23 Enter the new date: (mm-dd-yy). Das Öffnen einer neuen Eingabeaufforderung behebt das.
Arjan
2
@Arjan das sollte sein reg query "HKCU\Control Panel\International" /v sShortDate.
Trikasse
6

Folgendes habe ich verwendet:

::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z")
SET DT=%date%
SET DT=%DT:/=.%
SET DT=%DT:-=.%

Wenn Sie weitere Ideen zur Automatisierung von Backups in 7-Zip-Archiven wünschen, habe ich ein kostenloses / offenes Projekt, das Sie verwenden oder auf Ideen überprüfen können: http://wittman.org/ziparcy/

Micahwittman
quelle
Auf meinem System enthält% date% "Di 14.10.2008". Sie müssen also immer noch das "Di" und das Leerzeichen abschneiden (oder anderweitig damit umgehen).
BoltBait
Hallo @micahwittman. Ist es möglich, Dateien mit Erstellungsdatum mit xp_cmdshell in SQL Server zu laden? Ich habe den Befehl "forfiles" ausprobiert, aber ohne Erfolg. Ich habe eine Frage zu Stackoverflow gestellt, bitte sehen Sie den Link @ stackoverflow.com/q/32293517/3327081
Kolunar
5

Ich hatte ein ähnliches Problem. Ich habe einen automatischen täglichen Download einer verschlüsselten Datei von einem FTP-Server. Ich wollte die Datei mit gpg entschlüsseln, die Datei auf das aktuelle Datum umbenennen (JJJJMMTT-Format) und die entschlüsselte Datei in einem Ordner für die richtige Abteilung ablegen.

Ich ging mehrere Vorschläge zum Umbenennen der Datei nach Datum durch und hatte kein Glück, bis ich auf diese einfache Lösung stieß.

for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt

Es hat perfekt funktioniert (dh der Dateiname lautet "2011-06-14.txt").

(Quelle)

KChiki
quelle
5

Eine Funktion, die basiert auf wmic:

:Now  -- Gets the current date and time into separate variables
::    %~1: [out] Year
::    %~2: [out] Month
::    %~3: [out] Day
::    %~4: [out] Hour
::    %~5: [out] Minute
::    %~6: [out] Second
  setlocal
  for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t
  endlocal & (
    if "%~1" neq "" set %~1=%T:~0,4%
    if "%~2" neq "" set %~2=%T:~4,2%
    if "%~3" neq "" set %~3=%T:~6,2%
    if "%~4" neq "" set %~4=%T:~8,2%
    if "%~5" neq "" set %~5=%T:~10,2%
    if "%~6" neq "" set %~6=%T:~12,2%
  )
goto:eof

Oberseite: Region unabhängig. Nachteil: Nur Systemadministratoren können wmic.exe ausführen.

Verwendungszweck:

call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%

Dies spiegelt eine Zeichenfolge wie diese wider:

2014-01-22 12:51:53

Beachten Sie, dass Funktionsparameter out-Parameter sind - das heißt, Sie müssen Variablennamen anstelle von Werten angeben.

Alle Parameter sind optional. Dies call:Now Y Mgilt auch für einen gültigen Aufruf, wenn Sie nur Jahr und Monat abrufen möchten.

Tomalak
quelle
4

http://sourceforge.net/projects/unxutils/files/

Suchen Sie in der ZIP-Datei nach "Date.exe" und benennen Sie sie in "DateFormat.exe" um (um Konflikte zu vermeiden).

Legen Sie es in Ihrem Windows-System32-Ordner ab.

Es gibt viele Optionen für die "Datumsausgabe".

Verwenden Sie für Hilfe DateFormat.exe --h

Ich bin nicht sicher, wie Sie die Ausgabe in eine Umgebungsvariable einfügen würden ... mit SET.

Ausfall
quelle
1
Vielen Dank, obwohl diese Frage speziell dafür gedacht ist, ohne zusätzliche Tools herunterzuladen.
Rory
3

Regionale unabhängige Lösung zur Erstellung des ISO-Datumsformats:

rem save the existing format definition
for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a
rem set ISO specific format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul:
rem query the date in the ISO specific format 
set ISODATE=%DATE%
rem restore previous format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul:

Was noch optimiert werden könnte: Andere Prozesse können verwirrt werden, wenn das Datumsformat in der kurzen Zeit verwendet wird, während es geändert wird. Das Parsen der Ausgabe gemäß der vorhandenen Formatzeichenfolge könnte also "sicherer" sein - ist jedoch komplizierter

V15I0N
quelle
Sie können iDate ( technet.microsoft.com/en-us/library/cc978637.aspx ) abfragen und bedingt fortfahren (3 mögliche Werte gemäß technet) - obwohl ich dies noch nicht ausprobiert habe.
Vincent De Smet
2
:: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format
:: - Sets environment variables %_isotime% and %_now% to current time
:: - On failure, clears these environment variables
:: Inspired on -> https://ss64.com/nt/syntax-getdate.html
:: - (cX) 2017 [email protected]
:: - http://stackoverflow.com/questions/203090
@echo off

set _isotime=
set _now=

:: Check that WMIC.exe is available
WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_

if not (%1)==() goto _help
SetLocal EnableDelayedExpansion

:: Use WMIC.exe to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC.exe Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    IF "%%~L"=="" goto  _WMIC_done_
        set _yyyy=%%L
        set _mm=00%%J
        set _dd=00%%G
        set _hour=00%%H
        set _minute=00%%I
        set _second=00%%K
)
:_WMIC_done_

::   1    2     3       4      5      6
:: %%G  %%H    %%I     %%J    %%K    %%L
:: Day  Hour  Minute  Month  Second  Year
:: 27   9     35      4      38      2017

:: Remove excess leading zeroes
        set _mm=%_mm:~-2%
        set _dd=%_dd:~-2%
        set _hour=%_hour:~-2%
        set _minute=%_minute:~-2%
        set _second=%_second:~-2%
:: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep%

:: Set date/time in ISO 8601 format:
        Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second%
:: -> http://google.com/search?num=100&q=ISO+8601+format

if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am
if 1%_hour% LSS 112 goto _skip_12_
    set /a _hour=1%_hour%-12
    set _hour=%_hour:~-2%
    set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm
    :: -> https://ss64.com/nt/if.html
    :: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows
    :: 'if () else ()' will NOT set %_now% correctly !?
:_skip_12_

EndLocal & set _isotime=%_isotime% & set _now=%_now%
goto _out

:_WMIC_MISSING_
echo.
echo WMIC.exe command not available
echo - WMIC.exe needs Administrator privileges to run in Windows
echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe"

:_help
echo.
echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format
echo.
echo    %%_now%%     environment variable set to current date and time
echo    %%_isotime%% environment variable to current time in ISO format
echo    set _today=%%_isotime:~0,10%%
echo.

:_out
:: EOF: GetDate.cmd
Adolfo
quelle
0

Bei gegebener bekannter Lokalität als Referenz in funktionaler Form. Der ECHOTIMESTAMPAufruf zeigt, wie der Zeitstempel in eine Variable übernommen wird ( DTSin diesem Beispiel).

@ECHO off

CALL :ECHOTIMESTAMP
GOTO END

:TIMESTAMP
SETLOCAL  EnableDelayedExpansion
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL & SET "%~1=%DTS%"
GOTO :EOF

:ECHOTIMESTAMP
SETLOCAL
    CALL :TIMESTAMP DTS
    ECHO %DTS%
ENDLOCAL
GOTO :EOF

:END

EXIT /b 0

Und in der Datei timestamp.bat gespeichert, hier ist die Ausgabe:

Geben Sie hier die Bildbeschreibung ein

bvj
quelle
Es scheint, dass dies mit dem regionalen Problem zusammenhängt - dies funktioniert nicht auf allen englischen Maschinen.
Nicht überrascht, @SteveFest. Wenn es möglich wäre, das Gebietsschema vorübergehend festzulegen, könnte dies zu einer globalen Lösung beitragen, aber es scheint notwendig, die Region im Voraus zu kennen. Ist Ihr Gebietsschema en-US oder en-SomewhereElse?
bvj
@SteveFest Ich nehme an, es wäre möglich, eine Liste von Gebietsschemas zu erstellen, in denen jedes Datum / Uhrzeit-Ausdrücke mit einem zu validierenden Beispiel enthält. Ich bin sehr beschäftigt, aber ich werde versuchen, meine Antwort zu aktualisieren, um sie zu veranschaulichen. Können Sie mir Beispiele der HK-Zeit- / Datumsausgaben zeigen? Ich kann törichterweise annehmen, dass zh-HK Ziffern mit festen Offsets druckt.
bvj
zh-HK: (yy)yy年m月d日 hh:mm- keine führenden Nullen. (yy) könnte ignoriert werden, da wir ein zweistelliges Jahr oder ein vierstelliges Jahr haben. Beachten Sie jedoch eines: Das Datums- und Uhrzeitformat kann pro Maschine geändert werden.
Danke @SteveFest, ich werde mich in ein paar Wochen melden. Führen Sie systeminfodie CLI aus und lassen Sie mich wissen, wofür Sie sehen System Locale. Die Ausführung des Programms dauert einige Zeit, aber möglicherweise wird das Ergebnis des Gebietsschemas zwischengespeichert und anschließend zum Indizieren eines Zeitstempelformats verwendet.
bvj
0

Unter Windows 7 funktioniert dieser Code für mich:

SET DATE=%date%
SET YEAR=%DATE:~0,4%
SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
ECHO %YEAR%
ECHO %MONTH%
ECHO %DAY%

SET DATE_FRM=%YEAR%-%MONTH%-%DAY% 
ECHO %DATE_FRM%
Frizz1977
quelle
Und wieder. Es ist schön, dass es auf Ihrer Maschine funktioniert, aber Sie haben den Punkt verpasstindependent of the regional settings of the machine
jeb
-1

Ich stelle fest, dass das O / P nicht nach einer regionunabhängigen Lösung gefragt hat. Meine Lösung ist jedoch für Großbritannien.

Dies ist die einfachste mögliche Lösung, eine 1-zeilige Lösung zur Verwendung in einer Batch-Datei:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%
Ed999
quelle
2
Er erwähnte eine regionunabhängige Lösung ...particularly because of the regional settings issue with using date. Übrigens. Ihre Lösung entspricht den zwanzig anderen Antworten.
Jeb
Ja, aber meine könnte tatsächlich (optional) in der Kommandozeile verwendet werden. Was ist der Vorteil beim Posten von 35 Codezeilen, wenn eine Codezeile dieselbe Lösung bietet?
Ed999
Ich kann keinen relevanten Unterschied zu den alten Antworten von @Matthew Johnson, 2010 oder @KChiki, 2011
jeb
Obwohl diese Antwort falsch ist, wird hier keine for-Schleife benötigt, um die tatsächliche Antwort zu kommentieren, wenn Sie dies einfach hätten tun könnenecho %date:/=-%
Gerhard Barnard,
Nein. Wenn Sie die FOR-Schleife weglassen, können keine Variablen erstellt werden, und das Datum, an dem Sie sich die Mühe gemacht haben, zu extrahieren, ist immer noch unbrauchbar. Mit der FOR-Schleife können die von der Schleife erstellten Variablen in anderen Teilen des Skripts verwendet werden. Ich lehne es stark ab, Dutzende von Codezeilen zu verwenden, um die FOR-Schleife zu erstellen, wenn nur 1 Zeile erforderlich ist. Und ich lehne es stark ab, Lösungen ohne Befehlszeile zu veröffentlichen, bei denen das O / P speziell nach einer einzeiligen Lösung für die Verwendung in der Befehlszeile gefragt hat.
Ed999
-3

Ich weiß, dass es bereits zahlreiche Möglichkeiten gibt. Aber hier ist mein Weg, es aufzuschlüsseln, um zu verstehen, wie es gemacht wird. Hoffentlich ist es hilfreich für jemanden, der Schritt für Schritt Methode mag.

:: Check your local date format
echo %date%

    :: Output is Mon 08/15/2016

:: get day (start index, number of characters)
::         (index starts with zero)
set myday=%DATE:~0,4%
echo %myday%
    :: output is Mon 

:: get month
set mymonth=%DATE:~4,2%
echo %mymonth%
    :: output is 08

:: get date 
set mydate=%DATE:~7,2% 
echo %mydate%
    :: output is 15

:: get year
set myyear=%DATE:~10,4%
echo %myyear%
    :: output is 2016
Gifcrazy
quelle
3
Sie haben den Punkt verpasstindependent of the regional settings of the machine
jeb