2013-03-13 46 views
3

有沒有辦法在批處理文件(比如3個環境變量)中拆分%date%,但是不管區域設置如何?今天的日期將爲3/13/2013美國,但與我的區域設置它是13.3.2013 - 分隔符更改,並且訂單以及無論區域設置如何,在批處理文件中拆分%日期%

+1

這是一個很好的問題。我正在考慮用數字進行分隔,但這不起作用......我需要考慮這一點。 – 2013-03-13 06:54:31

+0

謝謝。我現在在網上搜索,我想我找到了一些東西,但我不喜歡它使用REG QUERY。 http://forums.techguy.org/dos-other/837046-solved-date-format-bat-file.html – sashoalm 2013-03-13 06:56:06

+0

我認爲有兩種方法可以做到這一點。 1.您可以創建子串並進行交叉檢查以確定如何顯示它,或者2.您可以以某種方式訪問​​區域設置並從那裏開始。 – 2013-03-13 06:58:31

回答

4

你可以做到這一點using wmic(但不包括XP家庭WMIC):

@ECHO OFF 
:: Check WMIC is available 
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error 

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

:: Pad digits with leading zeros 
     Set _mm=%_mm:~-2% 
     Set _dd=%_dd:~-2% 
     Set _hour=%_hour:~-2% 
     Set _minute=%_minute:~-2% 

:: Display the date/time in ISO 8601 format: 
Set _isodate=%_yyyy%-%_mm%-%_dd% %_hour%:%_minute% 
Echo %_isodate% 

GOTO:EOF 

:s_error 
Echo GetDate.cmd 
Echo Displays date and time independent of OS Locale, Language or date format. 
Echo Requires Windows XP Professional, Vista or Windows 7 
Echo. 
Echo Returns 6 environment variables containing isodate,Year,Month,Day,hour and minute. 

,您可以通過parsing the date command這樣做是爲了查找什麼當前日期格式需要是。

第一個鏈接表示您可能需要在第二個Win7上編輯代碼,以處理短日期/長日期形式的一些額外皺紋。

+0

中分割出日期和月份感謝您提供「解析日期命令」(http://www.robvanderwoude.com/amb_datetime。 php) – 2015-07-21 17:39:02

-3

你好,你可以使用字符串更改,使之如此: 回聲%日期:〜1,2%得到「01」 ,你可以得到你想要的。

+1

請重新閱讀該問題,並閱讀[答]。 – 2013-03-13 06:53:11

+1

你也可以隨時刪除你自己的答案,所以它不會混淆東西。 – sashoalm 2013-03-13 06:54:51

+0

其實不要刪除它,你幫我計算了如何從%date% – swdev 2014-02-06 01:06:19

1

我發現這個在http://forums.techguy.org/dos-other/837046-solved-date-format-bat-file.html

我重新整理了一下,實際上它在3個環境變量分裂。

缺點是它需要查詢註冊表,可能是爲了找出訂單的日,月和年。

@Echo Off 
Set _Date=%date% 
If "%_Date%A" LSS "A" (Set _NumTok=1-3) Else (Set _NumTok=2-4) 
:: Default Delimiter of TAB and Space are used 
For /F "TOKENS=2*" %%A In ('REG QUERY "HKCU\Control Panel\International" /v iDate') Do Set _iDate=%%B 
For /F "TOKENS=2*" %%A In ('REG QUERY "HKCU\Control Panel\International" /v sDate') Do Set _sDate=%%B 
IF %_iDate%==0 For /F "TOKENS=%_NumTok% DELIMS=%_sDate% " %%B In ("%_Date%") Do Set _fdate=%%D%%B%%C 
IF %_iDate%==1 For /F "TOKENS=%_NumTok% DELIMS=%_sDate% " %%B In ("%_Date%") Do Set _fdate=%%D%%C%%B 
IF %_iDate%==2 For /F "TOKENS=%_NumTok% DELIMS=%_sDate% " %%B In ("%_Date%") Do Set _fdate=%%B%%C%%D 
Set _Month=%_fdate:~4,2% 
Set _Day=%_fdate:~6,2% 
Set _Year=%_fdate:~0,4% 
Echo _Year=%_Year% 
Echo _Month=%_Month% 
Echo _Day=%_Day% 
1

REG QUERY是不夠的,如果sShortDate設置爲類似dd yy。使用REG ADD

@echo off &setlocal 
for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate^|find "REG_SZ"') do set "ssShortDate=%%b" 
reg add "HKCU\Control Panel\International" /f /v sShortDate /d "dd MM yyyy" >nul 
set "cdate=%date%" 
reg add "HKCU\Control Panel\International" /f /v sShortDate /d "%ssShortDate%" >nul 
for /f "tokens=1-3" %%i in ("%cdate%") do set "day=0%%i"&set "month=0%%j"&set "year=%%k" 
set "day=%day:~-2%" 
set "month=%month:~-2%" 
echo.%day%.%month%.%year% 
endlocal 
+0

沒有辦法在沒有外部二進制文件(例如wmic,robocopy)的情況下批量生成有效日期,但是要自己設置註冊表。 'date'和'dir'命令總是顯示'sShortDate'從註冊表的國際設置。 – Endoro 2013-03-13 08:16:23

2

我返工sashoalm的版本照顧的抑制,前導零的情況:

@Echo OFF 
SETLOCAL 
If "%Date%A" LSS "A" (Set _NumTok=1-3) Else (Set _NumTok=2-4) 
:: Default Delimiter of TAB and Space are used 
For /F "TOKENS=2*" %%A In ('REG QUERY "HKCU\Control Panel\International" /v iDate') Do Set _iDate=%%B 
For /F "TOKENS=2*" %%A In ('REG QUERY "HKCU\Control Panel\International" /v sDate') Do Set _sDate=%%B 
IF %_iDate%==0 For /F "TOKENS=%_NumTok% DELIMS=%_sdate% " %%F In ("%Date%") Do CALL :procdate %%H %%F %%G 
IF %_iDate%==1 For /F "TOKENS=%_NumTok% DELIMS=%_sdate% " %%F In ("%Date%") Do CALL :procdate %%H %%G %%F 
IF %_iDate%==2 For /F "TOKENS=%_NumTok% DELIMS=%_sdate% " %%F In ("%Date%") Do CALL :procdate %%F %%G %%H 
endlocal&SET YYYYMMDD=%YYYYMMDD% 
GOTO :eof 

:: 
:: Date elements are supplied in Y,M,D order but may have a leading zero 
:: 
:procdate 
:: if single-digit day then 1%3 will be <100 else 2-digit 
IF 1%3 LSS 100 (SET YYYYMMDD=0%3) ELSE (SET YYYYMMDD=%3) 
:: if single-digit month then 1%2 will be <100 else 2-digit 
IF 1%2 LSS 100 (SET YYYYMMDD=0%2%YYYYMMDD%) ELSE (SET YYYYMMDD=%2%YYYYMMDD%) 
:: Similarly for the year - I've never seen a single-digit year 
IF 1%1 LSS 100 (SET YYYYMMDD=20%YYYYMMDD%) ELSE (SET YYYYMMDD=%1%YYYYMMDD%) 
GOTO :eof 

返回YYYYMMDD - 子在你的意志。

有趣的是,後SETLOCAL

IF NOT "%1"=="" set date=%1 

插入將允許在本地序列中的任何日期(不DAYNAME)被解碼以YYYYMMDD(但要小心,設置有YY形式19XX日期將顯示爲20XX - 容易補償,如果你覺得有必要)

+0

如果用戶將窗口控制面板中的日期格式設置爲例如'dd yy'(從你的代碼輸出:'13130')。 – Endoro 2013-03-13 08:45:46

+0

什麼是抑制領先的零狀態? – sashoalm 2013-03-13 09:01:21

+2

'@ mfm4aa'這是因爲'dd yy'是一種您可以設置的格式,但沒有任何意義。 – Magoo 2013-03-13 09:03:38

0

下面是一個純粹的Batch解決方案,只使用DATE命令和%DATE%變量,因此它適用於任何Windows版本。爲了使這個程序真正具有普遍性,只需在其他語言中添加DATE命令的第二行顯示的日期和月份部分的名稱,並用斜線括起來即可。例如,假設在德語中,日期部分顯示爲TT,所以您只需修改此值:set DayNames=/dd/tt/以便在德語Windows中使用此程序(除了所有使用DD的日語部分的語言外) 。

@echo off 
setlocal EnableDelayedExpansion 

rem GetStdDate.bat: Get date in standard format independently of Regional Settings 
rem Antonio Perez Ayala 

rem Set Day and Month names shown by second line of DATE command, enclosed in slashes (add any missing language): 
set DayNames=/dd/ 
set MonthNames=/mm/ 

rem Get date NAMES from second line of date COMMAND, enclosed in parentheses 
for /F "skip=1 tokens=2 delims=()" %%n in ('date ^< NUL') do (
    rem Separate and store date names 
    for /F "tokens=1-3 delims=/-.:" %%a in ("%%n") do (
     set one=%%a& set two=%%b& set three=%%c 
     rem Get date VALUES from %date% VARIABLE 
     for /F "tokens=1-3 delims=/-.:" %%x in ("%date%") do (
     rem Assign date values to date names 
     set %%a=%%x& set %%b=%%y& set %%c=%%z 
    ) 
    ) 
) 

rem Identify locale date format and assemble StdDate=YYYY/MM/DD 
if "!DayNames:/%one%/=!" neq "%DayNames%" (
    rem Locale format is DD/MM/YYYY 
    set StdDate=!%three%!/!%two%!/!%one%! 
) else if "!MonthNames:/%one%/=!" neq "%MonthNames%" (
    rem Locale format is MM/DD/YYYY 
    set StdDate=!%three%!/!%one%!/!%two%! 
) else (
    rem Locale format is YYYY/MM/DD 
    set StdDate=!%one%!/!%two%!/!%three%! 
) 

echo Standard date: %StdDate% 
+0

感謝您的回答。你能描述一下你的方法嗎?例如,它是否使用外部實用程序等。 – sashoalm 2013-03-13 09:06:52

+0

請將窗口控制面板中的日期格式設置爲'dd yy',您將看到,這不起作用(輸出:'標準日期:13 03 //') 。每個用戶都可以將日期格式設置爲他想要的任何內容。 'date'命令取決於該設置(也在重定向中)。 – Endoro 2013-03-13 09:10:20

+1

它「接近」的作品。在日期名稱存在於%date%的默認情況下,它不起作用。作爲當地年份格式爲「yy'而非'yyyy'或月'm'不''mm'或日'd'不''dd的通用格式,它也不能正常工作。例如,例程的結果是」13/3/12「是指2013/03/12還是2012/3/13時由人解釋?現在 - 可以解決這些問題中的每一個 - 例如,「for/f」標記= 1-4「...%date%...」僅當存在dayname時纔會分配第四個元變量(&可能是第一個)和前導零可以應用一些數學/子串 – Magoo 2013-03-13 10:03:53

1

我有一個額外的建議與ROBOCOPY:

@echo off &setlocal enabledelayedexpansion 
set "day=" 
for /f "tokens=3,4,8skip=4delims=: " %%i in ('robocopy') do if not defined day (
    set "month=%%i" 
    set "day=0%%j" 
    set "year=%%k" 
) 
set /a cnt=0 
for %%i in (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) do (
    set /a cnt+=1 
    if "%%i"=="%month%" set "month=0!cnt!" 
) 
set "day=%day:~-2%" 
set "month=%month:~-2%" 
echo.%day%.%month%.%year% 
endlocal 
2

試試這個:Set_date。釐米

@echo off&goto :start 
:Set_Date DateEnv [Date] or [/p="Prompt for Date: "] [/r] 
echo. 
echo.Usage: Set_Date.cmd DateEnv [Date] or [/p="Prompt for Date: "] 
echo.Populates date variables labeled: 'DateEnv_???', see below 
echo.Accepted date formats: 
echo.  m-d-y, m/d/y, yyyymmdd, dd-Mon-yy or 7 digit julian date 
echo.  If "%%date%%" is passed as the 2nd arg it will be interpreted 
echo.  according to the current regional date setting ie. day dd/mm/yyyy 
echo.  If /r is passed then the date contained in the DateEnv variable 
echo.  and/or the [Date] argument will be interpreted in regional format 
echo.  The /r option should be placed at the end of the list if used 
echo.  The /r option should only be used if date input is not included 
echo.  in one of the default listed formats or unexpected consequences... 
echo. 
echo.DateEnv, if passed alone may be a valid defined date variable or if 
echo.undefined then todays date will be used to populate the variables 
echo.Two digit years input 'XX' are interpreted as the year '20XX' 
echo.Valid dates must be in the year 1601 or greater for the validity check 
echo.Returns 0 in errorlevel if the date is valid, else non-zero 
echo. 
echo.If DateEnv is valid or if [Date] is passed DateEnv_??? will be set to: 
echo.DateEnv_mdy will be set to mm-dd-yyyy 
echo.DateEnv_ymd will be set to yyyymmdd 
echo.DateEnv_y.m.d will be set to yyyy.mm.dd 
echo.DateEnv_dte will be set to the current active regional date format 
echo.DateEnv_jul will be set to the 7 digit Julian date 
echo.DateEnv_dow will be set to day of week, ie. Monday, Tuesday, etc. 
echo.DateEnv_vrb will be set to Verbose Date, ie. Saturday, August 20th, 2011 
echo.DateEnv_dd will be set to the 2 digit day 
echo.DateEnv_mm will be set to the 2 digit month 
echo.DateEnv_yyyy will be set to the 4 digit year 
echo.DateEnv_month will be set to the month, ie. February or December 
echo.DateEnv_mon will be set to the 3 letter month, ie. Jan or Aug 
echo. 
echo.DateEnv itself will not be changed regardless if its a valid date or not 
echo.Also formats yyyymmdd or 7 digit julian date input to desired output 
echo.Example: Set_Date today "%%date%%" or Set_Date newyear99 01-Jan-99 
echo. 
echo.Finally: 
echo.If DateEnv is not defined and there is no second argument then %%date%% in 
echo.the current regional format will be used to populate the variables 
echo.If /p is passed as 2nd argument then quoted 3rd argument will prompt for date 
echo. 
echo.Examples: 
echo.   set "AprilsFools=4/1/1" 
echo.   set_date AprilFools 
echo.   echo Aprils fools date for 2001 in Julian format is: %%AprilFools_jul%% 
echo.   echo Aprils fools date in 2001 was on a %AprilFools_dow% ^(Sunday^) 
echo.   Set_Date birthday /p="Enter your birth date: " 
echo.   ECHO You were born on a %%birthday_dow%% 
echo.   set "today=" 
echo.   Set_Date today 
echo.   echo today is %%today_dte%% or %%today_jul%% in Julian format 
echo. 
echo.If the '/p' option is used then the _GetString.cmd routine must be in the PATH 
echo.   or else set/p routine will ask for date with no validity checking 
exit /b 1 

:start 
set "jul="&set "Format="&set "Sep="&set "reg=" 
if "%~1"=="" exit /b 255 
if /i "%~1" equ "/?" goto :Set_Date Syntax 
SetLocal EnableDelayedExpansion 
echo %*|find /i "/r">nul 
if %errorlevel% equ 0 set/a reg=1&if /i "%~1" equ "/r" shift 
if defined %~1 (call set jul=%%%~1%%) else (
    if "%~2"=="" set "jul=%date%" 
) 
if not "%~2"=="" (
    if /i "%~2" neq "/r" (
    set "jul=%~2"&set "args=%~3" 
) 
) else (if not defined %~1 set/a reg=1) 
call :RegDateFmt Format Separator yy mm dd jul 
if %errorlevel% neq 0 goto :BadDate 
if /i "%~2" equ "%date%" set/a reg=1 
if defined reg (
    set "jul=!mm!-!dd!-!yy!" 
) 
if /i "%jul%" equ "/p" (
    call :_GetString.cmd "%args%" jul /d 
    if !errorlevel! gtr 0 goto :BadDate 
) else if /i "%jul:~0,1%" gtr "9" (
    if defined args set "jul=%jul% %args%" 
    set "jul=!jul:* =!" 
) else if /i "%jul:~3,1%" gtr "9" (
    set "Mon=%jul:~3,3%" 
    call :month_convert Mon 
    if !errorlevel! gtr 0 goto :BadDate 
    set "jul=!Mon!-%jul:~0,2%-%jul:~-2%" 
) 
set mdy=%jul:/=% 
set mdy=%mdy:-=% 
if /i %mdy% equ %jul% (
    call :strlen %mdy% 
    if /i !errorlevel! equ 7 ( 
    call :date_cvt mdy /j 
) else (call :date_cvt jul /j) 
) else (call :date_cvt jul /j) 
if /i %errorlevel% equ 0 (
    set/a mdy=%jul% 
    set/a dow=%jul% %% 7&call :set_day dow 
) else (goto :BadDate) 
call :date_cvt mdy /j 
set "vrb=%mdy%" 
call :format_verbose vrb dow month 
set/a ymd=%errorlevel% 
set "mon=%month:~0,3%" 
set/a dte=%ymd% 
call :setRegDate dte Format Separator dow mon 
if /i %errorlevel% gtr 0 goto :BadDate 
Endlocal&(
    call set "%~1_mdy=%mdy%"&call set "%~1_ymd=%ymd%"&call set "%~1_jul=%jul%" 
    call set "%~1_vrb=%vrb%"&call set "%~1_dow=%dow%"&call set "%~1_dd=%ymd:~-2%" 
    call set "%~1_mm=%mdy:~0,2%"&call set "%~1_yyyy=%ymd:~0,4%" 
    call set "%~1_mon=%mon%"&call set "%~1_yy=%ymd:~2,2%"&call set "%~1_dte=%dte%" 
    call set "%~1_y.m.d=%ymd:~0,4%.%mdy:~0,2%.%ymd:~-2%"&call set "%~1_month=%month%" 
    exit /b 0 
) 
:BadDate 
Endlocal&(
    call set "%~1_mdy="&call set "%~1_ymd="&call set "%~1_dte="&call set "%~1_jul=" 
    call set "%~1_vrb="&call set "%~1_dow="&call set "%~1_vrb="&call set "%~1_y.m.d=" 
    call set "%~1_month=" 
)&exit /b %errorlevel% 

::**********************************:: 
::*******|| SUBROUTINES ||*******:: 
::**********************************:: 

:set_day 
SetLocal&call set/a tkn=%%%~1%%+1 
for /f "tokens=%tkn%" %%a in ("Monday Tuesday Wednesday Thursday Friday Saturday Sunday") do (
    set "dayofwk=%%a" 
) 
EndLocal&call set %~1=%dayofwk%&exit /b 1 

:Date_Cvt DateEnv [/Julian] Date_env is converted 
if "%~1"=="" exit /b 1 
SetLocal&call set "mdy=%%%~1%%" 
set ech=&set "arg=" 
if not "%~2"=="" (set arg=%~2&set arg=!arg:~0,2!) 
xcopy /d:%mdy% /h /l "%~f0" "%~f0\">nul 2>&1 
if /i %errorlevel% equ 0 (
    for /f "tokens=1-3 delims=/- " %%a in ("%mdy%") do (
    set m=%%a&set d=%%b&set "y=%%c" 
    if /i 1!m! lss 20 set "m=0!m!" 
    if /i 1!d! lss 20 set "d=0!d!" 
    if /i 1!y! lss 20 set "y=0!y!" 
    if /i !y! lss 80 (set y=20!y!) else (if !y! lss 100 set y=19!y!) 
    set "mdy=!m!-!d!-!y!" 
) 
) else (
    set /a rc=1 
    for /f "tokens=1-3 delims=" %%a in ("%mdy%") do set "rc=%%a" 
    if /i !rc! neq 1 set /a err=2&goto :end 
    call :strlen %mdy% 
    if /i !errorlevel! gtr 8 set /a err=3&goto :end 
) 
set "mdy=%mdy:/=-%" 
set "ymd=%mdy:-=%" 
if %ymd%==%mdy% (
    call :strlen %ymd% 
    set /a err=!errorlevel! 
    if /i !err! equ 7 if /i "%arg%" equ "/j" (
    call :gdate %ymd% 
    set /a ymd=!errorlevel! 
    set /a err=8&set "arg=" 
) 
    if /i !err! neq 8 goto :end 
    set mdy=!ymd:~4,2!-!ymd:~6,2!-!ymd:~0,4!&set "ech=!mdy!" 
) else (
    set ymd=%ymd:~4,4%%ymd:~0,4%&set "ech=!ymd!" 
) 
xcopy /d:%mdy% /h /l "%~f0" "%~f0\">nul 2>&1 
set /a err=%errorlevel% 
if /i %err% neq 0 (set ech=) 
if /i %err% equ 0 if /i "%arg%" equ "/j" (
    call :jdate %ymd% 
    set /a ech=!errorlevel! 
) 
:end 
EndLocal&call set "%~1=%ech%"&exit /b %err% 

:Strlen Returns length of string in errorlevel 
setlocal&set "#=%*" 
if not defined # exit /b 0 
set/a len=0 
:loop 
set/a len+=1 
set "#=!#:~1!"&if not defined # endlocal&exit/b %len% 
goto :loop 

:jdate 
SetLocal 
set "yyyymmdd=%~1" 
set "yyyy=%yyyymmdd:~0,4%" 
set "mm=%yyyymmdd:~4,2%" 
set "dd=%yyyymmdd:~6,2%" 
if %mm:~0,1% equ 0 set "mm=%mm:~1%" 
if %dd:~0,1% equ 0 set "dd=%dd:~1%" 
set /a Month1=(%mm%-14)/12 
set /a Year1=%yyyy%+4800 
set /a JDate=1461*(%Year1%+%Month1%)/4+367*(%mm%-2-12*%Month1%)^ 
      /12-(3*((%Year1%+%Month1%+100)/100))/4+%dd%-32075 
EndLocal&exit /b %JDate% 

:gdate 
SetLocal 
set /a p  = %1 + 68569 
set /a q  = 4 * %p%/146097 
set /a r  = %p% - (146097 * %q% +3)/4 
set /a s  = 4000 * (%r% + 1)/1461001 
set /a t  = %r% - 1461 * %s%/4 + 31 
set /a u  = 80 * %t%/2447 
set /a v  = %u%/11 
set /a GYear = 100 * (%q% - 49) + %s% + %v% 
set /a GMonth = %u% + 2 - 12 * %v% 
set /a GDay = %t% - 2447 * %u%/80 
if /i 1%GMonth% lss 20 set "GMonth=0%GMonth%" 
if /i 1%GDay% lss 20 set "GDay=0%GDay%" 
set "GDate=%GYear%%GMonth%%GDay%" 
EndLocal&exit /b %GDate% 

:Format_Verbose M/D/Y dayofweek to verbose date 
SetLocal&call set "dte=%%%~1%%" 
set "dow=%%%~2%%" 
set "st=" 
set "day=%dte:~3,2%" 
set "mon=%dte:~0,2%" 
set "year=%dte:~6,4%" 
set "ymd=%year%%mon%%day%" 
set "dy=%day:~1%" 
if %day:~0,1% equ 0 set "day=%day:~1%" 
if %mon:~0,1% equ 0 set "mon=%mon:~1%" 
set months=January February March April May June^ 
July August September October November December 
for /f "tokens=%mon%" %%a in ("%months%") do set "month=%%a" 
if /i %dy% equ 0 set "st=th" 
if /i %dy% gtr 3 set "st=th" 
if /i %day% geq 11 if /i %day% leq 13 set "st=th" 
if defined st goto :end 
set/a rst=%day% %% 10 
for /f "tokens=%rst%" %%s in ("st nd rd") do set "st=%%s" 
:end 
set "dow=%dow%, %month% %day%%st%, %year%" 
EndLocal&call set %~1=%dow%&call set %~3=%month%&exit /b %ymd% 

:_GetString.cmd 
set p0=%0&set "p0=!p0:~1!" 
if not exist _GetString.cmd (
    call :checkpath %p0% 
    if !errorlevel! neq 0 (
    set/p %~2="%~1" 
    exit/b 0 
) 
) 
call _GetString.cmd "%~1" %~2 %~3 
exit/b %errorlevel% 

:checkpath 
if exist "%~$PATH:1" exit/b 0 
exit/b 1 

:RegDateFmt Format Separator y m d dte 
if "%~2"=="" exit/b 1 
setlocal EnabledelayedExpansion 
set "Day="&set "Mon="&set "dte=" 
if not "%~6"=="" set "dte=!%~6!" 
if not defined dte set "dte=%date%" 
for /f "tokens=2 delims=:" %%A in ('date^<nul') do set Format=%%A&goto :next 
:next 
set "Format=%Format: =%" 
for %%A in (/ - . ,) do (
    echo %Format%|find "%%A">nul&if !errorlevel! equ 0 set "Separator=%%A" 
) 
if /i %Format:~0,1% gtr 9 set "Day=Day " 
for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('date^<nul') do (
    set "Format=%Day%%%a%Separator%%%b%Separator%%%c" 
    for /f "tokens=1-3 delims=.-/ " %%d in ("%dte:* =%") do (
    set %%a=%%d&set %%b=%%e&set "%%c=%%f" 
    echo !yy:~3!|find "ECHO">nul 
    if /i "!errorlevel!" neq "0" set "Format=!Format:yy=yyyy!" 
    if /i "!mm:~0,1!" gtr "9" (
     set "Format=!Format:mm=Mon!" 
     call :month_convert mm 
     if /i "!errorlevel!" neq "0" endlocal&exit/b 1 
    ) 
) 
) 
endlocal&(
    call set "%~1=%Format%" 
    call set "%~2=%Separator%" 
    if not "%~3"=="" call set "%~3=%yy%" 
    if not "%~4"=="" call set "%~4=%mm%" 
    if not "%~5"=="" call set "%~5=%dd%" 
)&exit/b 0 

:month_convert 
set "months=Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" 
call set "month=%%%~1%%" 
set/a mnum=0 
for %%m in (%months%) do set/a mnum+=1&if /i %month% equ %%m call set "%~1=!mnum!"&exit /b 0 
exit/b 1 

:setRegDate dte format sep dow mon 
setlocal EnableDelayedExpansion 
if /i "%~5"=="" exit/b 1 
set mon=!%~5!&set dow=!%~4!&set "dow=!dow:~0,3! " 
set sep=!%~3!&set "format=!%~2!"&set "dte=!%~1!" 
set yyyy=%dte:~0,4%&set yy=%dte:~2,2%&set mm=%dte:~4,2%&set "dd=%dte:~-2%" 
set "toks=2-4" 
echo %format%|find " ">nul 
if %errorlevel% equ 1 set "dow="& set "toks=1-3" 
for /f "tokens=%toks% delims=%sep% " %%a in ("%format%") do (
    set "dte=%dow%!%%a!%sep%!%%b!%sep%!%%c!" 
) 
endlocal&call set "%~1=%dte%"&exit/b 0 
0

此功能應適用於所有地區。

備註:

返回月份文本格式MMM地區

@echo off 
    call :GetDateIntl year month day 
    echo/Using GetDateIntl you get: %year%-%month%-%day% 
goto:eof 

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
:GetDateIntl yy mm dd [/A] 
:: Returns the current date on any machine with regional-independent settings 
:: Arguments: 
:: yy = variable name for the year output 
:: mm = variable name for the month output 
:: dd = variable name for the day output 
:: /A = OPTIONAL, removes leading 0 on days/months smaller than 10 (example: 01 becomes 1) 
:: Remarks: 
:: Will return month in text format in regions with MMM month 
:: 
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 /I "%'yy'%"=="" set "'yy'=%'aa'%" 
if /I "%'yy'%"=="" (set "'yy'=%'jj'%" & set "'dd'=%'tt'%") 
if %'yy'% LSS 100 set 'yy'=20%'yy'% 
endlocal&set %1=%'yy'%&set %4 %2=%'mm'%&set %4 %3=%'dd'%&goto :EOF 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
+0

如果這不適用於您的系統,請告訴我echo:| date的輸出,以便我可以更新代碼。謝謝! – cyberponk 2016-05-12 21:14:10

1

四年過去了,但這個問題並沒有得到老了,我覺得現在有一個稍微好一點的答案比使用wmic(在Win7以上)。

for /F "tokens=1,2,3 delims=_" %%i in ('PowerShell -Command "& {Get-Date -format "MM_dd_yyyy"}"') do (
    set MONTH=%%i 
    set DAY=%%j 
    set YEAR=%%k 
) 
echo %MONTH% %DAY% %YEAR% 

使用PowerShell Get-Date您可以微調你想要的格式(短,長,號碼,姓名等)。在這個例子中,「MM_dd_yyyy」會得到一個數字的日期,並且在個位數月份或天數的情況下帶前導零。

+0

很乾淨。很有用。 – 2017-09-06 14:10:03

相關問題