ฉันจะรับวันที่ / เวลาปัจจุบันในบรรทัดคำสั่ง Windows ในรูปแบบที่เหมาะสมสำหรับการใช้งานในชื่อไฟล์ / โฟลเดอร์ได้อย่างไร


540

ปรับปรุง: ตอนนี้ว่ามันเป็น 2016 ฉันต้องการใช้ PowerShell dateสำหรับการนี้เว้นแต่มีเหตุผลย้อนหลังได้ที่น่าสนใจจริงๆสำหรับมันโดยเฉพาะอย่างยิ่งเพราะการตั้งค่าภูมิภาคออกกับการใช้ ดูที่https://stackoverflow.com/a/19799236/8479ของ @ npocmaka


คำสั่งบรรทัดคำสั่งของ Windows คืออะไรฉันสามารถใช้เพื่อรับวันที่และเวลาปัจจุบันในรูปแบบที่ฉันสามารถใส่ลงในชื่อไฟล์ได้

Code_2008-10-14_2257.zipฉันต้องการที่จะมีไฟล์ค้างคาวที่ซิปขึ้นไดเรกทอรีเป็นที่เก็บกับวันและเวลาปัจจุบันเป็นส่วนหนึ่งของชื่อเช่น มีวิธีง่าย ๆ ที่ฉันสามารถทำได้โดยไม่ขึ้นอยู่กับการตั้งค่าภูมิภาคของเครื่อง?

ฉันไม่สนใจเกี่ยวกับรูปแบบวันที่จริง ๆ แล้วมันน่าจะเป็น yyyy-mm-dd แต่อะไรที่เรียบง่ายก็ใช้ได้

จนถึงตอนนี้ฉันได้รับสิ่งนี้ซึ่งบนเครื่องของฉันให้ฉัน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

ฉันสามารถมีชีวิตอยู่กับสิ่งนี้ได้ แต่ดูเหมือนว่าจะเป็นเรื่องเล็กน้อย เป็นการดีที่มันจะเงียบกว่าและมีรูปแบบดังกล่าวข้างต้น

ฉันใช้ Windows Server 2003 และ Windows XP Professional ฉันไม่ต้องการติดตั้งโปรแกรมอรรถประโยชน์เพิ่มเติมเพื่อให้ได้สิ่งนี้ (แม้ว่าฉันจะรู้ว่ามีบางอย่างที่จะทำการจัดรูปแบบวันที่ดี)


7
สร้างการสำรองข้อมูลอัตโนมัติสำหรับรหัสของคุณหรือไม่ ดีสำหรับคุณ! เราควรทำสิ่งนี้ด้วยเช่นกัน :)
Andrei Rînea

24
ใช้คน powershell ...[datetime]::now.tostring("yyyy-MM-dd")
Nacht - Reinstate Monica

เป็นไปได้ไหมที่จะโหลดไฟล์ด้วยวันที่สร้างโดยใช้ xp_cmdshell ใน SQL Server ฉันได้ถามคำถามเกี่ยวกับ stackoverflow โปรดดูลิงก์ @ stackoverflow.com/q/32293517/3327081
kolunar

คำตอบ:


667

ดูไฟล์ Windows Batch (.bat) เพื่อรับวันที่ปัจจุบันในรูปแบบ MMDDYYYY :

@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%

หากคุณต้องการเวลาในรูปแบบ 24 ชั่วโมง / การทหารคุณสามารถแทนที่ FOR ที่สองด้วย:

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

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

หากคุณต้องการให้วันที่เป็นอิสระจากการสั่งซื้อวันที่ / เดือนภูมิภาคคุณสามารถใช้ "WMIC os GET LocalDateTime" เป็นแหล่งที่มาเนื่องจากมันอยู่ในลำดับ ISO:

@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
วันที่ท้องถิ่นคือ [2012-06-19 10: 23: 47.048]


44
สำหรับคนในสหราชอาณาจักรคุณต้องการFor /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)บรรทัดที่สอง
โรรี่

17
วิธีการแก้ปัญหานี้ขึ้นอยู่กับสถานที่เกิดเหตุโรรี่ให้ตัวอย่างสำหรับสหราชอาณาจักรสำหรับสถานที่อื่น ๆ ที่วันที่มาเป็น 22-02-2012 คุณจะต้องแทนที่ delims = / with delims = -
Nuno Furtado

25
ในระบบของฉัน% TIME% ส่งคืนค่าเช่น "0:01:15" และ "3:15:12" และรหัส %% a %% b ในคำตอบจะให้พื้นที่นำเช่น "001" และ "315" ในการรับ hhmm สี่หลักให้ใช้สิ่งนี้: For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))ที่ส่งกลับค่าเช่น "0001" และ "0315" ซึ่งฉันชอบในชื่อไฟล์ของฉัน
twamley

10
รุ่นที่ดีของwmicคำสั่ง! WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:tableเพื่อให้ห่างไกลที่ฉันได้เห็นเท่านั้น ในทำนองเดียวกันการได้รับ20120623-1619ในเขตเวลาท้องถิ่นของอัมสเตอร์ดัมในบรรทัดเดียว: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
สำหรับฉันมันบอกว่า%%a was unexpected at this time.
Scott zuz22 Blacklock

109

การแยกเวลาวันที่ในระดับภูมิภาค

รูปแบบเอาต์พุตของ%DATE%และdirคำสั่งนั้นขึ้นอยู่กับภูมิภาคดังนั้นจึงไม่น่าเชื่อถือ date.exe (ส่วนหนึ่งของUnxUtils ) ให้ข้อมูลวันที่และเวลาในรูปแบบที่สามารถคาดเดาได้ นอกจากนี้คุณยังอาจจะดึงข้อมูลวันที่ / เวลาจากไฟล์ใด ๆ date.exeกับ

ตัวอย่าง: (ใน cmd-script ให้ใช้ %% แทนที่จะเป็น%)

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: ข้อความใด ๆ

date.exe +"Text: %y/%m/%d-any text-%H.%M"
ข้อความ: 09/12 / 22- ข้อความใด ๆ -18.55

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

ข้อมูลวันที่ / เวลาจากไฟล์อ้างอิง:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

ใช้ในสคริปต์ CMD เพื่อรับข้อมูลปีเดือนวันที่และเวลา:

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

ใช้ในสคริปต์ CMD เพื่อรับการประทับเวลาในรูปแบบที่ต้องการ:

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

แยกข้อมูลวันที่ / เวลาจากไฟล์อ้างอิงใด ๆ

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

การเพิ่มข้อมูลวันที่ / เวลาลงในไฟล์:

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 เป็นส่วนหนึ่งของเครื่องมือ GNU ฟรีที่ไม่จำเป็นต้องติดตั้ง

หมายเหตุ: การคัดลอกdate.exeไปยังไดเรกทอรีใด ๆ ที่อยู่ในเส้นทางการค้นหาอาจทำให้สคริปต์อื่น ๆ ล้มเหลวที่ใช้dateคำสั่งในตัวของ Windows


4
ดีกว่าการแก้ปัญหาผิดปกติที่นิยมมากขึ้นดังกล่าวข้างต้น แต่ฉันมีการเพิ่ม / ตันเพื่อหลีกเลี่ยงพรอมต์บน Windows 8.1
rainabba

6
date.exeดูเหมือนว่าWindows 8.1 ในตัวจะขึ้นอยู่กับสถานที่ มันส่งคืนวันที่ในรูปแบบวว / ดด / ปปปปบนระบบของฉันหากเป็นแบบโลแคลที่เป็นอิสระฉันคาดหวังว่า MM / dd / yyyy หรือ yyyy-MM-dd ฉันไม่คิดว่าคำตอบนี้กำลังพูดถึง date.exe ในตัว แต่มีบางรุ่นของ บริษัท อื่น
SSS

1
มันเป็นสถานที่ที่เป็นอิสระถ้าคุณให้มันมีรูปแบบที่ต้องการในบรรทัดคำสั่ง
terrinecold

3
โปรดสังเกตว่า date.exe (ส่วนหนึ่งของ UnxUtils) ไม่เหมือนกับคำสั่ง build-in date ดังนั้นหากคุณต้องเพิ่ม / t คำสั่ง windows date จะถูกดำเนินการ หากสิ่งที่ต้องการ date.exe + "% Y-% m-% d" ทำงานคุณได้ติดตั้ง UnxUtils อย่างถูกต้อง :-)
just.do.it

เป็นไปได้ไหมที่จะโหลดไฟล์ด้วยวันที่สร้างโดยใช้ xp_cmdshell ใน SQL Server ฉันได้ลองใช้คำสั่ง "forfiles" แต่ไม่มีประโยชน์ ฉันได้ถามคำถามเกี่ยวกับ stackoverflow โปรดดูลิงก์ @ stackoverflow.com/q/32293517/3327081
kolunar

103

อีกสองคนด้วยวิธีการที่ไม่ได้ขึ้นอยู่กับการตั้งค่าเวลา (ทั้งที่นำมาจาก: วิธีการรับอิสระข้อมูลที่ / เวลาจากการแปล: ) และทั้งสองยังได้รับวันในสัปดาห์และไม่ต้องมีสิทธิ์ผู้ดูแลระบบ!:

  1. MAKECAB - ใช้งานได้กับทุกระบบ Windows (เร็ว แต่สร้างไฟล์ชั่วคราวขนาดเล็ก) (สคริปต์ foxidrive):

    @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
    

    ข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชั่นได้รับวัน-

  2. ROBOCOPY - ยังไม่ได้คำสั่งพื้นเมืองสำหรับ Windows XP และ Windows Server 2003 แต่ก็สามารถดาวน์โหลดได้จากเว็บไซต์ของไมโครซอฟท์ แต่มีทุกอย่างในตัวจาก Windows Vista ขึ้นไป:

    @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
    

    และอีกสามวิธีที่ใช้ภาษาสคริปต์ Windows อื่น ๆ พวกเขาจะให้ความยืดหยุ่นมากขึ้นเช่นคุณสามารถรับสัปดาห์ของปีเวลาเป็นมิลลิวินาทีและอื่น ๆ

  3. JScript / ชุดผสม (ต้องบันทึกเป็น.bat) JScript มีให้บริการในทุกรูปแบบของระบบ NT ขึ้นไปซึ่งเป็นส่วนหนึ่งของWindows Script Host ( แต่สามารถปิดการใช้งานผ่านรีจิสทรีได้ซึ่งเป็นกรณีที่หายาก ):

    @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 ( เป็นไปได้หรือไม่ที่จะฝังและเรียกใช้ VBScript ภายในไฟล์แบตช์โดยไม่ต้องใช้ไฟล์ชั่วคราว? ) กรณีเดียวกับ JScript แต่การผสมข้ามภาพไม่สมบูรณ์แบบ:

    :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 - สามารถติดตั้งได้ในทุกเครื่องที่มี. NET - ดาวน์โหลดจาก Microsoft ( v1 , v2 , v3 (เฉพาะสำหรับ Windows 7 ขึ้นไป)) มีการติดตั้งตามค่าเริ่มต้นในทุกสิ่งจาก Windows 7 / Windows Server 2008 และสูงกว่า:

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

    วิธีใช้จากไฟล์แบตช์:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. รวบรวมเอง jscript.net/batch (ไม่เคยเห็นเครื่อง Windows ที่ไม่มี. NET ดังนั้นฉันคิดว่านี่เป็นแบบพกพาที่สวย):

    @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สิ่งนี้ไม่สามารถรับปีและวันในสัปดาห์ มันค่อนข้างช้าและสร้างไฟล์ชั่วคราวและขึ้นอยู่กับการประทับเวลาที่ logman วางไว้ในล็อกไฟล์ มันจะทำงานกับทุกอย่างจาก Windows XP ขึ้นไป มันอาจจะไม่ถูกใช้โดยใคร - รวมถึงฉัน - แต่เป็นอีกวิธีหนึ่ง ...

    @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. อีกทางหนึ่งด้วยWMICซึ่งให้สัปดาห์ของปีและวันของสัปดาห์ แต่ไม่ใช่มิลลิวินาที (สำหรับมิลลิวินาทีตรวจสอบคำตอบของ 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. การใช้TYPEPERFด้วยความพยายามที่จะรวดเร็วและเข้ากันได้กับการตั้งค่าภาษาที่แตกต่างกันและเร็วที่สุด:

    @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. MSHTAช่วยให้สามารถเรียกใช้เมธอด JavaScript ที่คล้ายกับวิธี JScript ที่แสดงใน # 3 ข้างต้น โปรดทราบว่าคุณสมบัติวันที่ของวัตถุของ JavaScript ที่เกี่ยวข้องกับค่าเดือนจะถูกกำหนดหมายเลขตั้งแต่ 0 ถึง 11 ไม่ใช่ 1 ถึง 12 ดังนั้นค่า 9 หมายถึงตุลาคม

    <!-- : 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>
    

2
สำหรับ powershell C: \> สำหรับ / f %% i ใน ('powershell get-date -format "{yyyyMMDd_HHmmss}"') ตั้ง datetime = %% i C: \> echo% datetime%
ซามูเอล

1
makecab: นี้ทำงานโดยการสร้างไฟล์ที่เรียกว่า~.rptและค้นหาstringภายในมันเริ่มต้นด้วยซึ่งเป็นเส้นเหมือนmakecab MakeCAB Report: Tue Sep 02 22:15:57 2014สำหรับฉันคำสั่งนี้ไม่ได้แปลเป็นภาษาท้องถิ่นมันเป็นอิสระ เคล็ดลับนี้ขึ้นอยู่กับว่า หวังว่ามันจะไม่เป็นอย่างนั้นหรืออื่นระวัง!
n611x007

10
ฉันสนุกกับข้อความเปิดตัว "สองเพิ่มเติม ... " ตามด้วยโซลูชัน 8 รายการ
Adam Smith

1
ไม่มีmshtaอะไรไฮบริด :) รังเกียจไหมถ้าฉันจะแก้ไขคำตอบของคุณและเพิ่ม? นี่เป็นคอลเล็กชั่นโซลูชั่นลับที่ดีที่สุดและดูเหมือนว่าจะmshtaเป็นของที่นี่
rojo

1
ทางออกที่ยอมรับไม่ได้ผลสำหรับฉันไม่ว่าฉันจะพยายามทำอะไร โซลูชันเหล่านี้หลายอย่างใช้ได้ผลสำหรับฉัน (แบตช์และพาวเวอร์เซลล์)
เบร็

44

นี่คือตัวแปรจาก alt.msdos.batch.nt ที่ทำงานในพื้นที่ได้อย่างอิสระ

ใส่สิ่งนี้ในไฟล์ข้อความเช่น 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<-------------

เพื่อให้โค้ดทำงานผิดพลาด msg ถึง stderr ฉันต้องเพิ่มเครื่องหมายอัญประกาศเดี่ยวเพื่อนับการกำหนดตัวแปรสำหรับ %% a, %% b และ %% c ตำแหน่งที่ตั้งของฉัน (PT) ก่อให้เกิดข้อผิดพลาดในขั้นตอนเดียวในการวนลูป / การแยกวิเคราะห์ซึ่งสิ่งต่าง ๆ เช่น "set = 20" ถูกเรียกใช้งาน เครื่องหมายคำพูดให้โทเค็น (แม้ว่าจะว่างเปล่า) สำหรับด้านซ้ายมือของคำสั่งการมอบหมาย

ข้อเสียคือชื่อตัวแปรโลแคลยุ่งเหยิง: 'yy', 'mm' และ 'dd' แต่เดี๋ยวก่อนใครสนใจ!


3
นี่เป็นวิธีที่สมบูรณ์แบบและเป็นวิธีที่ง่ายที่สุดและหรูหราที่สุดที่ฉันเคยเห็นมา
Doug

2
ดูเพิ่มเติมปรับปรุง Jeroen ของจำเป็นที่จะไม่ใช้ตำแหน่งที่ตั้งทั้งหมดสตริงdd, mmและในการส่งออกของyy echo:^|date
Arjan

ไม่สามารถใช้ได้กับทุกพื้นที่ (ในภาษาเยอรมันdateให้Geben Sie das neue Datum ein: (TT-MM-JJ)ที่JJแบ่งสคริปต์ของคุณ (คาดว่าYY))
เตฟาน

35

ฉันใช้สิ่งนี้ (ไม่ใช่ภูมิภาคที่ไม่ขึ้นกับใคร (สหราชอาณาจักร))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%

ดูCmd.exe ตัวแปรสภาพแวดล้อมที่มีเครื่องหมายโคลอนและตัวหนอนในเทคนิคที่รู้จักกันน้อย แต่มีประสิทธิภาพมากนี้ (ตัวชี้ไปยังการอ้างอิงที่มีสิทธิ์ของ Microsoft จะได้รับการชื่นชม)
DavidRR

นี่คือไมโครซอฟท์อ้างอิงแฟ้มชุดสำหรับ Windows XP การอ้างอิงที่มีการใช้พารามิเตอร์ชุด น่าเสียดายที่ไม่มีการอภิปรายเกี่ยวกับเทคนิค 'การแบ่งส่วนข้อมูล'
DavidRR

มันไม่ได้ผลสำหรับฉัน อาจเป็นเรื่องของการตั้งค่าภูมิภาคไหม ฉันได้รับผลลัพธ์ของ "/ 15 / - 1-We_1009" เมื่อใช้งานในวันพุธที่ 15 ตุลาคม 2014
Joel B

26

สี่บรรทัดแรกของรหัสนี้จะให้ตัวแปร YY DD MM YYYY HH Min Sec ที่เชื่อถือได้ใน Windows XP Professional และสูงกว่า

@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

สมบูรณ์แบบนี่เป็นทางออกที่ดีที่สุดสำหรับฉันเพราะการโทร PS จะส่งผลให้ข้อความ cmd ดูตลกดี
Ste

25

น่าเสียดายที่นี่ไม่ได้คุ้มค่ากับการตั้งค่าภูมิภาค แต่ทำในสิ่งที่คุณต้องการ

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%

ที่น่าตื่นตาตื่นใจสิ่งที่คุณจะพบกับวิกิพีเดีย


1
ทำเครื่องหมาย - พบCmd.exe Environment Variables ที่มีเครื่องหมายโคลอนและ Tildeซึ่งอธิบายถึงเทคนิค 'การแบ่ง' ตัวแปรที่แสดงในคำตอบของคุณ ไม่พบข้อมูลนั้นอีกต่อไปในบทความ Wikipedia ต้องการค้นหาข้อมูลอ้างอิงที่เชื่อถือได้จาก Microsoft
DavidRR

1
นี่คือไมโครซอฟท์อ้างอิงแฟ้มชุดสำหรับ Windows XP การอ้างอิงที่มีการใช้พารามิเตอร์ชุด น่าเสียดายที่ไม่มีการอภิปรายเกี่ยวกับเทคนิค 'การแบ่งส่วนข้อมูล'
DavidRR

18

โปรดใช้สคริปต์ต่อไปนี้เพื่อรับวันปัจจุบันในบรรทัดคำสั่ง:

echo %Date:~0,3%day

8
เล่นไปรอบ ๆ กับสิ่งนี้มันสั้นที่สุดที่ฉันพบว่าได้รับวันที่และเวลา: echo% date%% เวลา%
loomi

15

อีกวิธีหนึ่ง ( เครดิต ):

@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%

โปรดทราบว่าคำตอบของฉันทั้งที่นี่ยังคงขึ้นอยู่กับคำสั่งของวันและเดือนตามการตั้งค่าภูมิภาค - ไม่แน่ใจว่าจะแก้ไขอย่างไร


14
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.zip

http://www.dotnetperls.com/7-zip-examplesมีบางจุดที่ดีอาจเป็นประโยชน์สำหรับบางคนในอนาคต
Saravanan

13

นี่ไม่ได้เป็นความจริง แต่อาจเป็นวิธีที่ยืดหยุ่นกว่า ( เครดิต ):

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%

10

ต่อไปนี้เป็นวิธีรับวันที่ในบรรทัดเดียว:

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

ในสหรัฐอเมริกาจะมีการส่งออก "yyyy-mm-dd hhmm" การตั้งค่าภูมิภาคที่แตกต่างกันจะส่งผลให้% วันที่% เอาท์พุทที่แตกต่างกัน แต่คุณสามารถปรับเปลี่ยนลำดับโทเค็น

หากคุณต้องการรูปแบบอื่นให้แก้ไขคำสั่ง echo โดยจัดเรียงโทเค็นใหม่หรือใช้ตัวคั่น (หรือไม่) ที่แตกต่างกัน


มีวิธีรับเวลาในรูปแบบ 12 ชั่วโมงและแสดงข้อมูล AM หรือ PM หรือไม่
Sangli


9

คำตอบสั้น ๆ :

 :: 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 

คำตอบที่ยาว

    @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

:: ใน cmd สำหรับ / f% i ใน ('PowerShell -Command "get-date" - จัดรูปแบบ "yyyyMMdd" ") ตั้งค่า yyyyMMMM =% i :: ใน cmd สคริปต์สำหรับ / f %% i ใน (' PowerShell -Command "get-date" - ฟอร์แมต "yyyyMMdd" ') ตั้งค่า yyyyMMdd = %% i
Yordan Georgiev

8

วิธีแก้ปัญหาแบบหนึ่งซับของ Matthew Johnsonเพื่อให้ได้วันและเวลาแบบวันเดียวคือฝีปากและมีประโยชน์

อย่างไรก็ตามมันจำเป็นต้องมีการดัดแปลงอย่างง่าย ๆ เพื่อให้ทำงานได้จากภายในแบตช์ไฟล์:

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

1
ไม่สามารถใช้งานได้ใน CMD (%% a ในตอนนี้) หรือใน PowerShell (เปิดขาดหายไป '(' หลังจากคีย์เวิร์ดสำหรับ) บน Windows 8.1
rainabba

3
Rainabba ว่าเป็นสิ่งผิดพลาดที่คุณได้รับเมื่อคำสั่งที่ออกจากสาย CMD อย่างไรก็ตาม " จากภายในไฟล์แบตช์ " คำสั่งจะส่งคืน "2014-01-30 1324"
John Langstaff

1
หรือง่ายกว่านี้มากถ้าปราศจากลูปecho %date:/=-%%time::=-%
แกร์ฮาร์ดบาร์นาร์ด

7

และนี่คือไฟล์แบทช์ที่คล้ายกันสำหรับส่วนเวลา

:: 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


สวัสดีฉันสามารถโหลดไฟล์ตามวันที่แก้ไขโดยใช้คำสั่งด้านล่างz: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” แต่ฉันอยากรู้วิธีโหลดไฟล์ตามวันที่สร้าง ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก คำถามถูกถามใน stackoverflow แต่ยังไม่มีคำตอบ โปรดดูที่ลิงก์สำหรับรายละเอียดstackoverflow.com/q/32293517/3327081
kolunar

1
ถามคำถามใหม่เกี่ยวกับเรื่องนั้น forfilesฉันไม่เคยใช้
Jeroen Wiert Pluimers

7

ฉันเปลี่ยนคำตอบด้วยไฟล์แบตช์จากvMaxเพื่อให้สามารถทำงานกับภาษาดัตช์ได้เช่นกัน
ชาวดัตช์ - ถาวรที่เราเป็น - มีการเปลี่ยนแปลงเล็กน้อยใน%date%, date/tและdateพักที่เดิมชุดไฟล์

มันจะดีถ้าบางคนสามารถตรวจสอบกับสถานที่อื่น ๆ ของ Windows เช่นกันและรายงานผลกลับ
หากไฟล์แบตช์ล้มเหลวที่ตำแหน่งของคุณโปรดรวมเอาท์พุทของสองคำสั่งเหล่านี้ในพรอมต์คำสั่ง:
echo:^|date
date/t

นี่คือตัวอย่างของผลลัพธ์ที่คุณควรได้รับจาก batch-file:

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

นี่คือรหัสที่ได้รับการแก้ไขพร้อมความคิดเห็นเกี่ยวกับสาเหตุ:

:: /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 jeroen@pluimers.com 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


2
บางคนใช้ปีแรกก่อนหรือไม่มีเลขศูนย์นำหน้า ดูวิกิพีเดียรูปแบบวันตามประเทศ ภาษาฝรั่งเศสอาจใช้jj-mm-aaaaสำหรับ jour, mois, annee? คนอิตาเลียนอาจจะgg/mm/aaaaเป็น giorno, mese, anno? tt.mm.jjjjแท็ก Monat, Jahr สำหรับภาษาเยอรมันหรือไม่ แต่แล้ว: ฉันเดาว่าในประเทศส่วนใหญ่จะใช้เพียงไม่กี่ภาษา เช่นเดียวกับในเนเธอร์แลนด์จริง ๆ แล้ว Windows มักจะเป็นภาษาอังกฤษหรือดัตช์ไม่มากนัก ดีพอสำหรับฉัน
Arjan

2
เช่นกัน: รุ่นอื่นในที่ซ่อนคุณสมบัติของไฟล์ชุดของ Windowsเป็นที่สมบูรณ์แบบน้อย (ต้องการแก้ไขสำหรับชาวดัตช์jjและไม่บังคับใช้เป็นปีที่ 4 หลัก) แต่การใช้งานshiftจะทิ้งวันเหมือนหรือMon maแตกต่างกันเพียง
Arjan

4
มันทำลายระบบของเยอรมัน ปีและเดือนทำงาน แต่วันล้มเหลวเนื่องจาก "วัน" เริ่มต้นด้วย "T" ในภาษาเยอรมัน ("แท็ก") ไม่ใช่ "d" สตริงรูปแบบในการแจ้งการมี(TT-MM-JJ)การส่งออกเป็นdate/t 23.06.2012/ cc
@Arjan

2
อีกประการหนึ่งนอกเหนือ: หนึ่งยังสามารถได้รับการสั่งซื้อจากรีจิสทรีreg query "HKCU\Control Panel\International" /vShortDateใช้ ระวังขณะทดสอบ: สำหรับพรอมต์คำสั่งเปิดการเปลี่ยนการตั้งค่าแผงควบคุมจะเปลี่ยนรูปแบบที่ใช้ในการแสดงวันที่ (ทั้งdateและdate /tและecho %date%) แต่ใน Windows 7 จะไม่เปลี่ยนรูปแบบสำหรับวันที่ใหม่! เช่นการเปลี่ยนรูปแบบวันที่สั้นของฉันเป็นYY/MM/dd, The current date is: 12/06/23 Enter the new date: (mm-dd-yy)ได้รับฉัน: การเปิดพรอมต์คำสั่งใหม่แก้ไขนั้น
Arjan

2
@Arjan reg query "HKCU\Control Panel\International" /v sShortDateนี้ควรจะเป็น
tricasse

6

นี่คือสิ่งที่ฉันใช้:

::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:-=.%

หากคุณต้องการแนวคิดเพิ่มเติมสำหรับการสำรองข้อมูลอัตโนมัติไปยังคลังข้อมูล 7-Zip ฉันมีโครงการฟรี / เปิดที่คุณสามารถใช้หรือตรวจสอบแนวคิดได้ที่: http://wittman.org/ziparcy/


ในระบบ% วันที่ของฉัน% มี "อ. 10/14/2008" ดังนั้นคุณจะต้องตัด (หรือจัดการกับ) อักขระ "Tue" และอักขระเว้นวรรค
BoltBait

สวัสดี @micahwittman เป็นไปได้ไหมที่จะโหลดไฟล์ด้วยวันที่สร้างโดยใช้ xp_cmdshell ใน SQL Server ฉันได้ลองใช้คำสั่ง "forfiles" แต่ไม่มีประโยชน์ ฉันได้ถามคำถามเกี่ยวกับ stackoverflow โปรดดูลิงก์ @ stackoverflow.com/q/32293517/3327081
kolunar

5

ฉันมีปัญหาที่คล้ายกัน ฉันดาวน์โหลดอัตโนมัติทุกวันจากเซิร์ฟเวอร์ FTP ของไฟล์ที่เข้ารหัส ฉันต้องการถอดรหัสไฟล์โดยใช้ gpg เปลี่ยนชื่อไฟล์เป็นวันที่ปัจจุบัน (รูปแบบ YYYYMMDD) และวางไฟล์ถอดรหัสลงในโฟลเดอร์สำหรับแผนกที่ถูกต้อง

ฉันได้รับคำแนะนำหลายประการสำหรับการเปลี่ยนชื่อไฟล์ตามวันที่และไม่มีโชคจนกระทั่งฉันสะดุดกับวิธีแก้ปัญหาง่ายๆนี้

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

มันทำงานได้อย่างสมบูรณ์ (เช่นชื่อไฟล์ออกมาเป็น "2011-06-14.txt")

(ที่มา)


5

ฟังก์ชั่นที่เป็นไปตาม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

Upside:ภูมิภาคอิสระ Downside:ผู้ดูแลระบบเท่านั้นที่สามารถเรียกใช้ wmic.exe

การใช้งาน:

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

echos นี้สตริงเช่นนี้:

2014-01-22 12:51:53

โปรดทราบว่าฟังก์ชั่นพารามิเตอร์เป็นพารามิเตอร์นอก - นั่นคือคุณต้องระบุชื่อตัวแปรแทนค่า

พารามิเตอร์ทั้งหมดเป็นตัวเลือกดังนั้นจึงcall:Now Y Mเป็นการโทรที่ถูกต้องหากคุณต้องการรับปีและเดือนเท่านั้น


4

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

ดูในไฟล์ ZIP เพื่อหาสิ่งที่เรียกว่า "Date.exe" และเปลี่ยนชื่อเป็น "DateFormat.exe" (เพื่อหลีกเลี่ยงข้อขัดแย้ง)

วางไว้ในโฟลเดอร์ Windows system32 ของคุณ

มีตัวเลือก "วันที่ออก" จำนวนมาก

สำหรับความช่วยเหลือใช้ DateFormat.exe --h

ฉันไม่แน่ใจว่าคุณจะใส่ผลลัพธ์ลงในตัวแปรสภาพแวดล้อมได้อย่างไร ... โดยใช้ SET


1
ขอบคุณแม้ว่าคำถามนี้มีไว้สำหรับทำโดยเฉพาะโดยไม่ต้องดาวน์โหลดเครื่องมือเพิ่มเติม
โรรี่

3

โซลูชันอิสระระดับภูมิภาคที่สร้างรูปแบบวันที่ ISO:

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:

สิ่งที่สามารถปรับให้เหมาะสม: กระบวนการอื่นอาจสับสนหากใช้รูปแบบวันที่ในช่วงเวลาสั้น ๆ ในขณะที่มีการแก้ไข ดังนั้นการแยกวิเคราะห์เอาต์พุตตามสตริงรูปแบบที่มีอยู่อาจเป็น 'ปลอดภัย' - แต่จะซับซ้อนกว่า


คุณสามารถ reg แบบสอบถาม IDATE ( technet.microsoft.com/en-us/library/cc978637.aspx ) และเงื่อนไขดำเนินการ (3 ค่าที่เป็นไปตาม TechNet) - แม้ว่าฉันไม่ได้พยายามนี้เลย
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 adolfo.dimare@gmail.com
:: - 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

0

รับทราบตำแหน่งสำหรับอ้างอิงในรูปแบบการใช้งาน การECHOTIMESTAMPโทรแสดงวิธีการบันทึกเวลาลงในตัวแปร ( DTSในตัวอย่างนี้)

@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

และบันทึกลงในไฟล์ timestamp.bat นี่คือผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่


ดูเหมือนว่าสิ่งนี้จะมาพร้อมกับปัญหาในระดับภูมิภาคซึ่งไม่สามารถใช้ได้กับเครื่องภาษาอังกฤษทั้งหมด

ไม่แปลกใจ @SteveFest หากเป็นไปได้ที่จะกำหนดสถานที่ชั่วคราวซึ่งอาจช่วยในการแก้ปัญหาระดับโลก แต่ดูเหมือนว่าจำเป็นต้องรู้พื้นที่นั้นล่วงหน้า เป็นสถานที่ของคุณในสหรัฐอเมริกาหรือในบางสถานที่?
bvj

@SteveFest ฉันคิดว่ามันจะเป็นไปได้ที่จะสร้างรายการสถานที่ที่แต่ละคนมีการแสดงออกวันที่ / เวลาที่มีตัวอย่างในการตรวจสอบ ฉันยุ่งมาก แต่ฉันจะพยายามอัปเดตคำตอบเพื่ออธิบาย คุณช่วยแสดงตัวอย่างของเวลา / วันที่ฮ่องกงได้หรือไม่? ฉันอาจจะโง่เขลาสมมติว่า zh-HK พิมพ์ตัวเลขที่ออฟเซ็ตคงที่
bvj

zh-HK: (yy)yy年m月d日 hh:mm- ไม่มีเลขศูนย์นำหน้า (yy) อาจถูกเพิกเฉยเนื่องจากเรามี 2 หลักปีหรือ 4 หลักปี แต่โปรดทราบสิ่งหนึ่ง: รูปแบบเวลาวันที่สามารถเปลี่ยนแปลงได้ต่อเครื่อง

ขอบคุณ @SteveFest ฉันจะติดตามผลภายในไม่กี่สัปดาห์ เรียกใช้systeminfoที่ CLI System Localeและแจ้งให้เราทราบสิ่งที่คุณเห็น โปรแกรมใช้เวลาในการรัน แต่บางทีผลลัพธ์ของโลแคลอาจถูกแคชและใช้ในภายหลังเพื่อจัดทำดัชนีรูปแบบการประทับเวลา
bvj

0

ด้วย Windows 7 รหัสนี้ใช้ได้กับฉัน:

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%

และอีกครั้ง. มันเป็นเรื่องดีที่จะทำงานบนเครื่องของคุณ แต่คุณพลาดจุดindependent of the regional settings of the machine
Jeb

-1

ฉันทราบว่า o / p ไม่ได้ขอวิธีแก้ปัญหาแบบไม่ขึ้นกับภูมิภาค ทางออกของฉันสำหรับสหราชอาณาจักรแม้ว่า

นี่คือทางออกที่ง่ายที่สุดที่เป็นไปได้ซึ่งเป็นโซลูชัน 1 บรรทัดสำหรับใช้ในไฟล์ Batch:

FOR /F "tokens=1-3 delims=/" %%A IN ("%date%") DO (SET today=%%C-%%B-%%A)
echo %today%

2
...particularly because of the regional settings issue with using dateเขากล่าวถึงวิธีการแก้ปัญหาที่เป็นอิสระภูมิภาค Btw โซลูชันของคุณเหมือนกับคำตอบยี่สิบข้ออื่น ๆ
Jeb

ใช่ แต่จริง ๆ แล้วสามารถใช้ของฉัน (ตัวเลือก) ในบรรทัดคำสั่ง ข้อดีของการโพสต์โค้ด 35 บรรทัดคืออะไรหากโค้ดหนึ่งบรรทัดจะให้โซลูชันเดียวกัน
Ed999

ฉันไม่เห็นความแตกต่างที่เกี่ยวข้องกับคำตอบเก่า ๆ ของ@Matthew Johnson, 2010หรือ@KChiki, 2011
jeb

แม้ว่าคำตอบนี้จะไม่ถูกต้องในการแสดงความคิดเห็นในการตอบที่เกิดขึ้นจริงสำหรับห่วงไม่จำเป็นที่นี่เมื่อคุณสามารถทำได้เพียงแค่echo %date:/=-%
Gerhard Barnard

ไม่ได้หากคุณเว้นวงวน FOR ไว้จะไม่สามารถสร้างตัวแปรใด ๆ ได้และวันที่คุณประสบปัญหาในการแตกไฟล์ยังคงไม่มีประโยชน์ ด้วยการวนรอบ FOR ตัวแปรที่สร้างโดยการวนรอบจะพร้อมใช้งานในส่วนอื่น ๆ ของสคริปต์ ฉันเลิกใช้อย่างจริงจังโดยใช้โค้ดหลายสิบบรรทัดเพื่อสร้าง FOR ลูปเมื่อต้องการเพียง 1 บรรทัด และฉันไม่เห็นด้วยอย่างยิ่งกับการโพสต์การแก้ปัญหาที่ไม่ใช่บรรทัดคำสั่งที่ o / p ถามเป็นพิเศษสำหรับการแก้ปัญหาหนึ่งบรรทัดสำหรับใช้ในบรรทัดคำสั่ง
Ed999

-3

ฉันรู้ว่ามีหลายวิธีที่กล่าวถึงแล้ว แต่นี่คือวิธีของฉันที่จะทำลายมันลงเพื่อทำความเข้าใจว่ามันทำอย่างไร หวังว่าจะเป็นประโยชน์สำหรับคนที่ชอบวิธีการทีละขั้นตอน

:: 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

3
คุณพลาดประเด็นไปแล้วindependent of the regional settings of the machine
59
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.