Làm cách nào để có được ngày / giờ hiện tại trên dòng lệnh Windows ở định dạng phù hợp để sử dụng trong tên tệp / thư mục?


540

Cập nhật: Bây giờ là năm 2016 tôi sẽ sử dụng PowerShell cho điều này trừ khi có lý do thực sự tương thích ngược với nó, đặc biệt là do vấn đề cài đặt khu vực khi sử dụng date. Xem https://stackoverflow.com/a/19799236/8479 của @ npocmaka


Tôi có thể sử dụng câu lệnh dòng Windows nào để lấy datetime hiện tại theo định dạng mà tôi có thể đặt vào tên tệp?

Tôi muốn có một tệp .bat nén thư mục vào một kho lưu trữ với ngày và giờ hiện tại như một phần của tên, ví dụ , Code_2008-10-14_2257.zip. Có cách nào dễ dàng để tôi có thể làm điều này, độc lập với cài đặt khu vực của máy không?

Tôi không thực sự bận tâm về định dạng ngày tháng, lý tưởng nhất là yyyy-mm-dd, nhưng mọi thứ đơn giản đều ổn.

Cho đến nay tôi đã có cái này, cái mà trên máy của tôi mang lại cho tôi 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

Tôi có thể sống với điều này, nhưng nó có vẻ hơi lộn xộn. Lý tưởng nhất là nó dễ hiểu hơn và có định dạng được đề cập trước đó.

Tôi đang sử dụng Windows Server 2003 và Windows XP Professional. Tôi không muốn cài đặt các tiện ích bổ sung để đạt được điều này (mặc dù tôi nhận thấy có một số tiện ích sẽ thực hiện định dạng ngày tốt đẹp).


7
Tạo một bản sao lưu tự động cho mã của bạn? Tốt cho bạn! Chúng ta cũng nên làm điều này :)
Andrei Rînea

24
sử dụng quyền hạn của mọi người ...[datetime]::now.tostring("yyyy-MM-dd")
Nacht - Tái lập Monica

Có thể tải các tệp có ngày tạo bằng xp_cmdshell trong SQL Server không? Tôi đã hỏi một câu hỏi về stackoverflow, vui lòng xem liên kết @ stackoverflow.com/q/32293517/3327081
kolunar

Câu trả lời:


667

Xem Windows Batch File (.bat) để có được ngày hiện tại ở định dạng 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%

Nếu bạn thích thời gian ở định dạng 24 giờ / quân đội, bạn có thể thay thế dòng FOR thứ hai bằng dòng này:

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

C:>. \ Ngày.bat
2008-10-14_0642

Nếu bạn muốn ngày độc lập với thứ tự ngày / tháng của khu vực, bạn có thể sử dụng "WMIC os GET LocalDateTime" làm nguồn, vì đó là theo thứ tự 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
Ngày địa phương là [2012-06-19 10: 23: 47.048]


44
Đối với những người Anh, bạn sẽ muốn For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a)cho dòng thứ hai.
Rory

17
Giải pháp này phụ thuộc vào địa phương, Rory đã đưa ra ví dụ cho Vương quốc Anh cho các địa phương khác nơi ngày đến là 22/02/2012 bạn cần thay thế delims = / bằng delims = -
Nuno Furtado

25
Trên hệ thống của tôi,% TIME% trả về các giá trị như "0:01:15" và "3:15:12" và mã %% a %% b trong câu trả lời mang lại một không gian hàng đầu như "001" và "315". Để có được bốn chữ số hhmm, hãy sử dụng For /f "tokens=1-2 delims=/: " %%a in ("%TIME%") do (if %%a LSS 10 (set mytime=0%%a%%b) else (set mytime=%%a%%b))giá trị này: Trả về các giá trị như "0001" và "0315" mà tôi thích trong tên tệp của mình.
twamley

10
Phiên bản đẹp của wmiclệnh! Cho đến nay tôi chỉ thấy WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table. Tương tự, để 20120623-1619vào múi giờ Amsterdam địa phương của tôi, trong một dòng: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
Đối với tôi nó nói%%a was unexpected at this time.
Scott zuz22 Blacklock

109

Phân tích thời gian ngày độc lập theo vùng

Định dạng đầu ra của %DATE%và của dirlệnh phụ thuộc vào khu vực và do đó không mạnh mẽ cũng không thông minh. date.exe (một phần của UnxUtils ) cung cấp bất kỳ thông tin ngày và thời gian nào ở bất kỳ định dạng có thể nghĩ được. Bạn cũng có thể trích xuất thông tin ngày / giờ từ bất kỳ tệp nào vớidate.exe .

Ví dụ: (trong tập lệnh cmd sử dụng %% thay vì%)

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: Bất kỳ văn bản nào

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Văn bản: 09/12/12 - bất kỳ văn bản nào - 18,55

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

Thông tin ngày / giờ từ tệp tham chiếu:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Sử dụng nó trong tập lệnh CMD để lấy thông tin năm, tháng, ngày, thời gian:

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

Sử dụng nó trong tập lệnh CMD để lấy dấu thời gian ở bất kỳ định dạng bắt buộc nào:

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

Trích xuất thông tin ngày / giờ từ bất kỳ tập tin tham khảo.

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

Thêm vào một tập tin thông tin ngày / giờ của 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 là một phần của các công cụ GNU miễn phí không cần cài đặt.

LƯU Ý: Sao chép date.exevào bất kỳ thư mục nào trong đường dẫn tìm kiếm có thể khiến các tập lệnh khác không sử dụng lệnh tích hợp Windows date.


4
Tốt hơn nhiều so với giải pháp phổ biến kỳ lạ hơn ở trên nhưng tôi đã phải thêm / t để tránh lời nhắc trên Windows 8.1
rainabba

6
Windows 8.1 tích hợp date.exedường như phụ thuộc vào miền địa phương. Nó trả về ngày tính bằng dd / MM / yyyy trên hệ thống của tôi, nếu nó độc lập với ngôn ngữ địa phương, tôi sẽ mong đợi MM / dd / yyyy hoặc yyyy-MM-dd. Tôi không nghĩ câu trả lời này nói về date.exe tích hợp nhưng một số phiên bản bên thứ ba của nó.
SSS

1
nó là độc lập cục bộ nếu bạn cung cấp cho nó định dạng mong muốn trên dòng lệnh
terrinecold

3
Xin lưu ý rằng date.exe (một phần của UnxUtils) không giống với lệnh ngày tích hợp. Vì vậy, nếu bạn phải thêm / t lệnh ngày windows được thực thi. Nếu một cái gì đó như date.exe + "% Y-% m-% d" hoạt động, bạn đã cài đặt UnxUtils chính xác. :-)
just.do.it

Có thể tải các tệp có ngày tạo bằng xp_cmdshell trong SQL Server không? Tôi đã thử lệnh "forfiles" nhưng không có kết quả. Tôi đã hỏi một câu hỏi về stackoverflow, xin vui lòng xem liên kết @ stackoverflow.com/q/32293517/3327081
kolunar

104

Hai cách khác không phụ thuộc vào cài đặt thời gian (cả hai được lấy từ : Cách lấy dữ liệu / thời gian độc lập với nội địa hóa :). Và cả hai cũng có được ngày trong tuần và không ai trong số họ yêu cầu quyền quản trị!:

  1. MAKECAB - sẽ hoạt động trên MỌI hệ thống Windows (nhanh, nhưng tạo một tệp tạm thời nhỏ) (tập lệnh 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
    

    Thêm thông tin về chức năng nhận ngày .

  2. ROBOCOPY - đó không phải là lệnh gốc cho Windows XP và Windows Server 2003, nhưng nó có thể được tải xuống từ trang web microsoft . Nhưng được tích hợp sẵn mọi thứ từ Windows Vista trở lên:

    @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
    

    Và ba cách nữa sử dụng các ngôn ngữ script Windows khác. Chúng sẽ giúp bạn linh hoạt hơn, ví dụ bạn có thể nhận được tuần trong năm, thời gian tính bằng mili giây và cứ thế.

  3. JScript / batch hybrid (cần được lưu dưới dạng .bat). JScript có sẵn trên mọi mẫu hệ thống NT trở lên, như một phần của Windows Script Host ( mặc dù có thể bị vô hiệu hóa thông qua sổ đăng ký, đây là trường hợp hiếm gặp ):

    @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. Phép lai VSCRIPT / BATCH ( Có thể nhúng và thực thi VBScript trong tệp bó mà không sử dụng tệp tạm thời không? ) Giống như JScript, nhưng phép lai không quá hoàn hảo:

    :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 - có thể được cài đặt trên mọi máy có .NET - tải xuống từ Microsoft ( v1 , v2 , v3 (chỉ dành cho Windows 7 trở lên)). Nó được cài đặt theo mặc định trên mọi thứ từ Windows 7 / Windows Server 2008 trở lên:

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

    Để sử dụng nó từ một tệp bó:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Tự biên dịch jscript.net/batch (chưa bao giờ thấy máy Windows không có .NET, vì vậy tôi nghĩ đây là một thiết bị di động khá đẹp):

    @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 Điều này không thể có được năm và ngày trong tuần. Nó tương đối chậm và cũng tạo ra một tệp tạm thời và dựa trên dấu thời gian mà logman đặt trên các tệp nhật ký của nó. Nó sẽ hoạt động trên mọi thứ từ Windows XP trở lên. Nó có thể sẽ không bao giờ được sử dụng bởi bất kỳ ai - kể cả tôi - nhưng là một cách khác ...

    @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. Một cách nữa với WMIC cũng cung cấp tuần trong năm và ngày trong tuần, nhưng không phải là mili giây (đối với mili giây kiểm tra câu trả lời của 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. Sử dụng TYPEPERF với một số nỗ lực để nhanh chóng và tương thích với các cài đặt ngôn ngữ khác nhau và nhanh nhất có thể:

    @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 cho phép gọi các phương thức JavaScript tương tự như phương thức JScript được trình bày trong # 3 ở trên. Hãy nhớ rằng các thuộc tính đối tượng Ngày của JavaScript liên quan đến các giá trị tháng được đánh số từ 0 đến 11, không phải từ 1 đến 12. Vì vậy, giá trị 9 có nghĩa là tháng 10.

    <!-- : 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
for powershell C: \> for / f %% i in ('powershell get-date -format "{yyyyMMdd_HHmmss}"') hãy đặt datetime = %% i C: \> echo% datetime%
Samuel

1
makecab: điều này hoạt động bằng cách tạo một tệp có tên ~.rptvà tìm kiếm stringbên trong nó, bắt đầu bằng makecab, đó là một dòng như thế nào MakeCAB Report: Tue Sep 02 22:15:57 2014. Đối với tôi lệnh này không được bản địa hóa. Thủ thuật này dựa vào đó. Hãy hy vọng nó sẽ không bao giờ, hoặc nếu không hãy cẩn thận!
n611x007

10
Tôi thích đoạn văn mở đầu "Hai lần nữa ..." kèm theo 8 giải pháp.
Adam Smith

1
Cái gì, không mshtalai? :) Nếu tôi chỉnh sửa câu trả lời của bạn và thêm một? Đây dường như là bộ sưu tập các giải pháp bí truyền tốt nhất, và dường như nó mshtathuộc về nơi này.
rojo

1
Giải pháp được chấp nhận sẽ không hiệu quả với tôi cho dù tôi có cố gắng thế nào. Nhiều giải pháp này đã làm việc cho tôi. (Batch và Powershell).
Brett Chờ

44

Đây là một biến thể từ alt.msdos.batch.nt hoạt động độc lập cục bộ.

Đặt cái này trong một tệp văn bản, ví dụ 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<-------------

Để có được mã hoạt động sans lỗi thông báo lỗi cho stderr, tôi đã phải thêm các trích dẫn duy nhất khơi dậy các phép gán biến cho %% a, %% b và %% c. Ngôn ngữ của tôi (PT) đã gây ra lỗi ở một giai đoạn trong vòng lặp / phân tích cú pháp trong đó các công cụ như "set = 20" đang được thực thi. Các trích dẫn mang lại một mã thông báo (mặc dù trống) cho phía bên trái của câu lệnh gán.

Nhược điểm là tên biến địa phương lộn xộn: 'yy', 'mm' và 'dd'. Nhưng này, ai quan tâm chứ!


3
Điều này là hoàn hảo và là cách tiếp cận đơn giản và thanh lịch nhất mà tôi từng thấy cho đến nay.
Doug

2
Xem thêm cải tiến Jeroen của , cần thiết như không phải tất cả miền địa phương sử dụng các dây dd, mmyytrong đầu ra của echo:^|date.
Arjan

không hoạt động trên tất cả các địa phương. (Trong tiếng Đức dateđưa ra Geben Sie das neue Datum ein: (TT-MM-JJ), nơi JJphá vỡ kịch bản của bạn (mong đợi YY))
Stephan

35

Tôi sử dụng cái này (một lần nữa không độc lập với khu vực (Anh))

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

Xem Biến môi trường Cmd.exe với Đại tràng và Tilde về kỹ thuật ít được biết đến nhưng rất hiệu quả này. (Một con trỏ tới tham chiếu có thẩm quyền của Microsoft sẽ được đánh giá cao.)
DavidRR

Đây là tài liệu tham khảo tập tin hàng loạt của Microsoft cho Windows XP . Tham chiếu đó bao gồm Sử dụng tham số lô . Thật không may, không có cuộc thảo luận về kỹ thuật 'cắt lát'.
DavidRR

Điều này không làm việc cho tôi. Có lẽ đó là một cái gì đó để làm với các thiết lập khu vực? Tôi nhận được đầu ra "/ 15 / - 1-We_1009" khi chạy nó vào Thứ Tư ngày 15 tháng 10 năm 2014.
Joel B

26

Bốn dòng đầu tiên của mã này sẽ cung cấp cho bạn các biến YY DD MM YYYY HH Min Sec đáng tin cậy trong Windows XP Professional trở lên.

@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

Hoàn hảo, đây là giải pháp tốt nhất cho tôi vì gọi PS sẽ dẫn đến sự xuất hiện của văn bản cmd để trông buồn cười.
Ste

25

Thật không may, điều này không tránh khỏi các thiết lập khu vực, nhưng nó làm những gì bạn muốn.

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%

Tuyệt vời những thứ bạn có thể tìm thấy trên Wikipedia .


1
Đánh dấu - Đã tìm thấy Biến môi trường Cmd.exe với Đại tràng và Tilde mô tả kỹ thuật biến 'cắt' được thể hiện trong câu trả lời của bạn. Không tìm thấy thông tin đó nữa trong bài viết Wikipedia. Muốn tìm một tài liệu tham khảo có thẩm quyền từ Microsoft.
DavidRR

1
Đây là tài liệu tham khảo tập tin hàng loạt của Microsoft cho Windows XP . Tham chiếu đó bao gồm Sử dụng tham số lô . Thật không may, không có cuộc thảo luận về kỹ thuật 'cắt lát'.
DavidRR

18

Vui lòng sử dụng tập lệnh sau để có được ngày hiện tại trong dòng lệnh:

echo %Date:~0,3%day

8
Chơi một chút với điều này, đó là lần ngắn nhất tôi tìm thấy để nhận Ngày và Giờ: echo% date %% time%
loomi

15

Một cách khác ( tín dụng ):

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

Lưu ý rằng cả hai câu trả lời của tôi ở đây vẫn phụ thuộc vào thứ tự trong ngày và tháng được xác định bởi cài đặt khu vực - không chắc chắn cách xử lý xung quanh đó.


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-examplescó một số điểm tốt có thể hữu ích cho một số trong tương lai.
Saravanan

13

Điều này không thực sự tốt hơn nhưng có thể là một cách linh hoạt hơn ( tín dụng ):

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

Đây là một cách để có được thời gian ngày trong một dòng:

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

Ở Mỹ, điều này sẽ tạo ra "yyyy-mm-dd hhmm". Các cài đặt khu vực khác nhau sẽ dẫn đến kết quả% ngày% khác nhau, nhưng bạn có thể sửa đổi thứ tự mã thông báo.

Nếu bạn muốn một định dạng khác, hãy sửa đổi câu lệnh echo bằng cách sắp xếp lại các mã thông báo hoặc sử dụng các dấu tách (hoặc không) khác nhau.


Có cách nào để có được thời gian ở định dạng 12 giờ và cũng để hiển thị thông tin AM hoặc PM không?
Sangli

9

Chỉ cần sử dụng dòng này:

PowerShell -Command "get-date"

9

Câu trả lời ngắn :

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

Câu trả lời dài

    @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

: "get-date" -format "yyyyMMdd" ') không đặt yyyyMMdd = %% i
Yordan Georgiev

8

Giải pháp một lớp lót của Matthew Johnson để có được ngày và thời gian một lớp lót là hùng hồn và hữu ích.

Tuy nhiên, nó cần một sửa đổi đơn giản để làm việc trong một tệp bó:

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

1
Không hoạt động trong CMD (%% a bất ngờ tại thời điểm này) hoặc trong PowerShell (Thiếu mở '(' sau từ khóa cho) trên Windows 8.1
rainabba

3
Rainabba, đó chính xác là lỗi bạn gặp phải khi lệnh đó được ban hành từ dòng CMD . Tuy nhiên, " từ trong một tệp bó ", lệnh trả về "2014-01-30 1324".
John Langstaff

1
hoặc đơn giản hơn nhiều sẽ không có vòng lặp forecho %date:/=-%%time::=-%
Gerhard Barnard

7

Và đây là một tệp bó tương tự cho phần thời gian.

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


Xin chào, tôi đã có thể tải tệp theo ngày Sửa đổi bằng cách sử dụng lệnh bên dưới, z: & forfiles /m *.jpg /s /d 07/16/2015 /c “cmd /c echo @fdate @ftime @path” nhưng tôi muốn biết cách tải tệp theo Ngày đã tạo. Bất kỳ trợ giúp sẽ được rất đánh giá cao. Một câu hỏi đã được hỏi trên stackoverflow nhưng chưa có câu trả lời nào. Vui lòng xem liên kết để biết chi tiết stackoverflow.com/q/32293517/3327081
kolunar

1
Đặt một câu hỏi mới về điều đó. Tôi chưa bao giờ sử dụng forfiles.
Jeroen Wiert Pluimers

7

Tôi đã thay đổi câu trả lời với tệp bó từ vMax để nó cũng hoạt động với ngôn ngữ Hà Lan.
Hà Lan - dai dẳng như chúng ta - có một vài thay đổi trong %date%, date/tdatenghỉ rằng bản gốc batch-file.

Sẽ thật tuyệt nếu một số người cũng có thể kiểm tra điều này với các địa điểm Windows khác và báo cáo lại kết quả.
Nếu tệp bó không thành công tại vị trí của bạn, thì vui lòng bao gồm đầu ra của hai câu lệnh này trên dấu nhắc lệnh:
echo:^|date
date/t

Đây là một mẫu đầu ra mà bạn sẽ nhận được từ tệp bó:

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

Dưới đây là mã sửa đổi với ý kiến ​​về lý do:

:: /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
Một số sử dụng năm đầu tiên, hoặc thiếu số không hàng đầu; xem định dạng ngày của Wikipedia theo quốc gia . Người Pháp có thể sử dụng jj-mm-aaaacho jour, mois, annee? Người Ý có thể gg/mm/aaaacho giorno, mese, anno? Người Đức tt.mm.jjjjcho Tag, Monat, Jahr? Nhưng sau đó: tôi đoán ở hầu hết các quốc gia chỉ có một vài ngôn ngữ được sử dụng. Giống như ở Hà Lan, Windows thực sự sẽ là tiếng Anh hoặc tiếng Hà Lan, không phải là nhiều. Đủ tôt cho tôi.
Arjan

2
Bên cạnh đó: một phiên bản khác trong các tính năng ẩn của các tệp bó Windows không hoàn hảo (cần sửa lỗi cho tiếng Hà Lan jjvà không thực thi năm 4 chữ số), nhưng sử dụng shiftđể loại bỏ ngày như Monhoặc ma. Chỉ khác nhau.
Arjan

4
Nó phá vỡ một hệ thống của Đức. Năm và tháng làm việc, nhưng ngày không thành công vì "ngày" bắt đầu bằng chữ "T" trong tiếng Đức ("Thẻ"), không phải là "d". Chuỗi định dạng trong lời nhắc là (TT-MM-JJ), date/tđầu ra là 23.06.2012. / cc
@Arjan

2
Một khía cạnh khác: người ta cũng có thể nhận được đơn đặt hàng từ cơ quan đăng ký , sử dụng reg query "HKCU\Control Panel\International" /vShortDate. Cẩn thận trong khi kiểm tra: đối với dấu nhắc lệnh mở, việc thay đổi cài đặt Bảng điều khiển cũng thay đổi định dạng được sử dụng để hiển thị ngày (cho cả datedate /techo %date%), nhưng trên Windows 7 KHÔNG thay đổi định dạng cho ngày mới! Giống như thay đổi định dạng ngày ngắn của tôi thành YY/MM/dd, giúp tôi : The current date is: 12/06/23 Enter the new date: (mm-dd-yy). Mở một dấu nhắc lệnh mới sửa nó.
Arjan

2
@Arjan này nên được reg query "HKCU\Control Panel\International" /v sShortDate.
tricasse

6

Đây là những gì tôi đã sử dụng:

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

Nếu bạn muốn có thêm ý tưởng để tự động sao lưu vào kho lưu trữ 7-Zip, tôi có một dự án miễn phí / mở mà bạn có thể sử dụng hoặc xem xét cho các ý tưởng: http://wittman.org/ziparcy/


Trên hệ thống của tôi% ngày% chứa "Thứ ba 10/14/2008". Vì vậy, bạn vẫn sẽ cần phải cắt bỏ (hoặc nói cách khác là giải quyết) "Tuệ" và nhân vật không gian.
BoltBait

Xin chào @micahwittman. Có thể tải các tệp có ngày tạo bằng xp_cmdshell trong SQL Server không? Tôi đã thử lệnh "forfiles" nhưng không có kết quả. Tôi đã hỏi một câu hỏi về stackoverflow, xin vui lòng xem liên kết @ stackoverflow.com/q/32293517/3327081
kolunar

5

Tôi đã có một vấn đề tương tự. Tôi có tải xuống tự động hàng ngày từ máy chủ FTP của một tệp được mã hóa. Tôi muốn giải mã tệp bằng gpg, đổi tên tệp thành ngày hiện tại (định dạng YYYYMMDD) và thả tệp được giải mã vào một thư mục cho đúng bộ phận.

Tôi đã trải qua một số gợi ý để đổi tên tập tin theo ngày và không gặp may mắn cho đến khi tôi vấp phải giải pháp đơn giản này.

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

Nó hoạt động hoàn hảo (ví dụ, tên tệp xuất hiện là "2011-06-14.txt").

(Nguồn)


5

Một chức năng dựa trên 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

Ưu điểm: Vùng độc lập. Nhược điểm: Chỉ quản trị viên hệ thống mới có thể chạy wmic.exe.

Sử dụng:

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

Đây là một chuỗi như thế này:

2014-01-22 12:51:53

Lưu ý rằng các tham số chức năng là tham số ngoài - nghĩa là, bạn phải cung cấp tên biến thay vì giá trị.

Tất cả các tham số là tùy chọn, do đó, call:Now Y Mlà một cuộc gọi hợp lệ nếu bạn chỉ muốn nhận được năm và tháng.


4

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

Nhìn vào bên trong tệp ZIP để biết một cái gì đó gọi là "Date.exe" và đổi tên thành "DateFormat.exe" (để tránh xung đột).

Đặt nó trong thư mục Windows system32 của bạn.

Nó có rất nhiều tùy chọn "đầu ra ngày".

Để được giúp đỡ, sử dụng DateFormat.exe --h

Tôi không chắc chắn làm thế nào bạn sẽ đưa đầu ra của nó vào một biến môi trường ... bằng cách sử dụng SET.


1
Cảm ơn, mặc dù câu hỏi này là đặc biệt để làm điều đó mà không cần tải xuống các công cụ bổ sung.
Rory

3

Giải pháp độc lập khu vực tạo định dạng ngày 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:

Điều vẫn có thể được tối ưu hóa: Các quy trình khác có thể bị nhầm lẫn nếu sử dụng định dạng ngày trong khoảng thời gian ngắn trong khi nó được sửa đổi. Vì vậy, phân tích đầu ra theo chuỗi định dạng hiện tại có thể 'an toàn hơn' - nhưng sẽ phức tạp hơn


bạn có thể truy vấn iDate ( technet.microsoft.com/en-us/l Library / cc978637.aspx ) và tiến hành có điều kiện (3 giá trị có thể theo Technet) - mặc dù tôi chưa thử điều này.
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

Cho một địa phương được biết đến, để tham khảo ở dạng chức năng. Cuộc ECHOTIMESTAMPgọi cho thấy cách lấy dấu thời gian thành một biến ( DTStrong ví dụ này.)

@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

Và được lưu vào tệp, timestamp.bat, đây là đầu ra:

nhập mô tả hình ảnh ở đây


Có vẻ như điều này đi kèm với vấn đề khu vực - điều này không hoạt động trong tất cả các máy tiếng Anh.

Không ngạc nhiên, @SteveFest. Nếu có thể tạm thời đặt ngôn ngữ, điều đó có thể giúp cung cấp giải pháp toàn cầu, nhưng có vẻ như cần phải biết trước khu vực. Địa phương của bạn là en-US hay en-SomewhereElse?
bvj

@SteveFest Tôi cho rằng có thể xây dựng một danh sách các địa điểm nơi mỗi biểu thức bao gồm các biểu thức ngày / thời gian với một mẫu để xác thực. Tôi rất bận, nhưng tôi sẽ cố gắng cập nhật câu trả lời của mình để minh họa. Bạn có thể chỉ cho tôi các mẫu đầu ra thời gian / ngày của HK không? Tôi có thể dại dột giả sử zh-HK in các chữ số ở độ lệch cố định.
bvj

zh-HK: (yy)yy年m月d日 hh:mm- không có số 0 đứng đầu. (yy) có thể bỏ qua vì chúng ta có 2 chữ số năm hoặc 4 chữ số năm. Nhưng xin lưu ý một điều: định dạng thời gian ngày có thể được thay đổi trên mỗi máy.

Cảm ơn @SteveFest, tôi sẽ theo dõi trong vòng vài tuần. Chạy systeminfotại CLI và cho tôi biết những gì bạn thấy System Locale. Chương trình cần có thời gian để chạy, nhưng có lẽ kết quả miền địa phương có thể được lưu trữ và sau đó được sử dụng để lập chỉ mục định dạng dấu thời gian.
bvj

0

Với Windows 7, mã này hoạt động với tôi:

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%

Và một lần nữa. Thật tuyệt khi nó hoạt động trên máy của bạn, nhưng bạn đã bỏ lỡ điểmindependent of the regional settings of the machine
jeb

-1

Tôi lưu ý rằng o / p không yêu cầu giải pháp độc lập theo vùng. Giải pháp của tôi là cho Vương quốc Anh mặc dù.

Đây là giải pháp đơn giản nhất có thể, giải pháp 1 dòng, để sử dụng trong tệp Batch:

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

2
Ông đề cập đến một giải pháp độc lập khu vực ...particularly because of the regional settings issue with using date. Btw. Giải pháp của bạn cũng giống như hai mươi câu trả lời khác.
Jeb

Vâng, nhưng tôi thực sự có thể (tùy chọn) được sử dụng trên dòng lệnh. Công lao trong việc đăng 35 dòng mã là gì, nếu một dòng mã sẽ cung cấp cùng một giải pháp?
Ed999

Tôi không thể nhìn thấy bất kỳ sự khác biệt liên quan đến các câu trả lời cũ của @Matthew Johnson, 2010 hoặc @KChiki, 2011
Jeb

mặc dù câu trả lời này không chính xác, để bình luận về câu trả lời thực tế, một vòng lặp for không cần thiết ở đây khi bạn có thể thực hiện một cách đơn giảnecho %date:/=-%
Gerhard Barnard

Không. Nếu bạn bỏ qua vòng lặp FOR, không có biến nào có thể được tạo và ngày mà bạn gặp sự cố cần giải nén vẫn vô dụng. Với vòng lặp FOR, các biến được tạo bởi vòng lặp có sẵn để sử dụng trong các phần khác của tập lệnh. Tôi không tán thành việc sử dụng hàng chục dòng mã để tạo vòng lặp FOR, khi chỉ cần 1 dòng. Và tôi không tán thành việc đăng các giải pháp dòng lệnh, trong đó o / p đặc biệt yêu cầu giải pháp một dòng để sử dụng trên dòng lệnh.
Ed999

-3

Tôi biết rằng có rất nhiều cách đã được đề cập. Nhưng đây là cách của tôi để phá vỡ nó để hiểu làm thế nào nó được thực hiện. Hy vọng, nó hữu ích cho những người thích phương pháp từng bước.

:: 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
Bạn đã bỏ lỡ điểmindependent of the regional settings of the machine
jeb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.