1

我有以下代码

set x=%date /T %
date 16/12/2012
date 15/12/2012

some stuff goes here    
echo set your date

date %x%       <--- getting error in that line.
pause

那么我怎样才能以 dd/mm/yy 格式获取日期

4

9 回答 9

10

wmic您可以使用命令获取 dd/mm/yy 的日期格式。此命令允许您获取当前日期而不受区域设置的影响。

    @echo off
    SETLOCAL EnableDelayedExpansion

    for /f "skip=1 tokens=1-6 delims= " %%a in ('wmic path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do (
        IF NOT "%%~f"=="" (
            set /a FormattedDate=10000 * %%f + 100 * %%d + %%a
            set FormattedDate=!FormattedDate:~-2,2!/!FormattedDate:~-4,2!/!FormattedDate:~-6,2!
        )
    )

    echo %FormattedDate%
    PAUSE

date.bat您可以通过在命令提示符下执行以下命令将其另存为并运行此批处理文件:

C:\>date.bat
21/01/13
Press any key to continue...

希望这可以帮助。

于 2013-01-21T09:36:20.603 回答
5

另外两种不依赖于时间设置的方法(均取自:如何独立于本地化获取数据/时间:)。两者都获得星期几,而且都不需要管理员权限!:

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 和 win 2003 的本机命令,但可以从 microsoft 网站下载 。但内置于 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/BATCH混合(需要另存为.bat)。Jscript 在 NT 及更高版本的每个系统上都可用,作为 windows 脚本主机的一部分(虽然可以通过注册表禁用,但很少见):

@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 下载(v1v2v3(仅适用于 win7 及更高版本))。默认安装在 Win7/Win2008 及更高版本的所有计算机上:

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

6.自编译jscript.net/batch(从来没有见过没有.net的windows机器,所以我认为这是一个非常便携的):

@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 在其日志文件上放置的时间戳。将适用于 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

有关获取日期功能的更多信息

于 2015-01-31T11:03:48.007 回答
1

这是在我的系统上测试的,它将日期设置为所需的格式。如果出现“所需权限不足或客户端未持有所需权限”的错误消息,请尝试以管理员身份运行脚本。这应该可以正常工作。

@echo off
set x=%DATE:~0,2%/%DATE:~3,2%/%DATE:~6,4%
echo %x%
set date=%x%
echo %date%
于 2013-01-21T10:01:35.743 回答
1

您是否尝试过 SET x=%date:~-10%,我知道它适用于 Windows 7。

于 2015-04-21T03:54:02.473 回答
0

戴尔的回答对我帮助很大。我修改了他的解决方案以获取hhmmdd格式的时间:

@echo off
SETLOCAL EnableDelayedExpansion
rem Fill variables: %%a=Day %%b=Hour %%c=Minute %%d=Month %%e=Second %%f=Year
for /f "skip=1 tokens=1-6 delims= " %%a in ('wmic path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do (
    IF NOT "%%~f"=="" (
    rem Adding leading zeros:
        set /a FormattedTime=1000000 + 10000 * %%b + 100 * %%c + %%e
    rem reading from the right to left: 
        set FormattedTime=!FormattedTime:~-6,2!!FormattedTime:~-4,2!!FormattedTime:~-2,2!
    )
)
echo %FormattedTime%
于 2014-12-19T16:06:21.367 回答
0

你的任务set x=%date /T %是错误的。百分号扩展变量,它们不提供命令替换功能。

Windows 已经提供了一个带有当前日期的自动环境变量%DATE%(也是一个%TIME%带有当前时间的变量),所以你可以简单地这样做:

set x=%DATE%
date 16/12/2012
date 15/12/2012

rem stuff

date %x%
pause
于 2013-01-20T21:41:24.380 回答
0

我知道这是一篇旧帖子,但我找到了一种无需 wmic 的方法:

起初,我找到了一种答案并使用它:

你可以试试这个!这应该适用于 Windows 机器。

for /F "usebackq tokens=1,2,3 delims=-" %%I IN ( echo %date%) do echo "%%I" "%%J" "%%K" https://stackoverflow.com/a/14820126 /3735825

然后我使用这个并做了这个:

for /F "usebackq tokens=1,2,3,4 delims=/, " %%I IN (`echo %date%`) do ECHO %%L-%%K-%%J

它从 %date% 命令中删除空格和分隔符,并允许您使用日期的任何部分作为变量;例如,如果我想将日期设置为 YYYYMMDD 代码应该是这样的:

for /F "usebackq tokens=1,2,3,4 delims=/, " %%I IN (`echo %date%`) do ECHO %%L%%K%%J

如果您需要单独的变量并且需要根据需要使用它们,那么您可以使用以下变量:

%%I = Day of Week
%%J = Day
%%K = Month
%%L = Year

我希望它可以帮助任何人。

于 2015-02-11T18:52:24.003 回答
0

以下代码适用于我:

set DATE_NOW=!date:~6,4!!date:~0,2!!date:~3,2!   
set TIME_NOW=!time:~0,2!!time:~3,2!!time:~6,2!   

echo %DATE_NOW%                                  
echo %TIME_NOW%                                  
于 2016-06-02T08:29:39.417 回答
0

就我而言,我需要格式为 YYYY-MM-DD 的日期,而不是 2019 年 5 月 9 日。所以我用 make cab修改了npocmaka的通用决策:

@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-year=%%e"
    set "current-month=%%b"
    set "current-day=%%c"
    set "current-time=%%d"
    set "weekday=%%a"
)
del ~.*
popd

CALL :CASE_%current-month% 
IF ERRORLEVEL 1 CALL :DEFAULT_CASE 

ECHO Done.
GOTO NEXT

:CASE_Jan
    set "current-month=01"
    GOTO END_CASE
:CASE_Feb
    set "current-month=02"
    GOTO END_CASE
:CASE_Mar
    set "current-month=03"
    GOTO END_CASE
:CASE_Apr
    set "current-month=04"
    GOTO END_CASE
:CASE_May
    set "current-month=05"
    GOTO END_CASE
:CASE_Jun
    set "current-month=06"
    GOTO END_CASE
:CASE_Jul
    set "current-month=07"
    GOTO END_CASE
:CASE_Aug
    set "current-month=08"
    GOTO END_CASE
:CASE_Sep
    set "current-month=09"
    GOTO END_CASE
:CASE_Oct
    set "current-month=10"
    GOTO END_CASE
:CASE_Nov
    set "current-month=11"
    GOTO END_CASE
:CASE_Dec
    set "current-month=12"
    GOTO END_CASE


:DEFAULT_CASE
  set "current-month=xx"
  echo "Month is not in the English language! Fix it!"  
  GOTO END_CASE
:END_CASE
  VER > NUL # reset ERRORLEVEL
  GOTO :EOF # return from CALL

:NEXT
echo %weekday% %current-year%-%current-month%-%current-day% %current-time%
pause

在 Windows XP SP3 和 Server 2008 R2 SP1 上测试。

于 2019-05-11T01:21:22.410 回答