返回列表 发帖

[日期时间] 【方案汇总】批处理标准化获取当前系统日期时间(20231002更新)

操作系统不同,日期格式也可能不同:

星期二 2008-07-29
2008-07-29 星期二
07/29/2008 Tue
Tue 07/29/2008

再考虑到中、英之外的其它语言的操作系统,日期格式的种类实在太多了。要想标准化地获取当前系统日期20080728,以下两个方法都不好:
1. 直接使用系统变量 %date% 进行字符串截取
2. 直接对 date 命令的结果进行字符串截取
实际上日期格式是由注册表 HKEY_CURRENT_USER\Control Panel\International 里面 sShortDate 的值来决定的。

推荐使用其它方法来获取系统日期:

【方案1】BAT + PowerShell
@echo off
REM Win7/Win10/Win11等系统自带PowerShell
for /f %%i in ('powershell -c "Get-Date -uformat '%%Y%%m%%d'"') do (
    set "Today=%%i"
)
echo,%Today%
pause
for /f "delims=" %%i in ('powershell -c "Get-Date -UFormat '%%Y-%%m-%%d %%H:%%M:%%S'"') do (
    set "SysTS=%%i"
)
echo %SysTS%
pauseCOPY
【方案2】BAT + WMIC
@echo off
for /f "tokens=2 delims==" %%i in ('wmic path win32_operatingsystem get LocalDateTime /value ^| findstr "="') do (
    set "strDate=%%i"
)
set "Today=%strDate:~0,4%%strDate:~4,2%%strDate:~6,2%"
echo,%Today%
pause
set "Now=%strDate:~0,4%-%strDate:~4,2%-%strDate:~6,2% %strDate:~8,2%:%strDate:~10,2%:%strDate:~12,2%"
echo %Now%
pauseCOPY
【方案3】BAT + mshta
@echo off
for /f %%i in ('mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).WriteLine(Right(Year(Now),4)&Right("0"&Month(Now),2)&Right("0"&Day(Now),2))(Window.Close)"') do (
    set "Today=%%i"
)
echo,%Today%
pauseCOPY
【方案4】BAT + VBS
@echo off
>"%temp%\DateCalculate.vbs" echo dt=date()
>>"%temp%\DateCalculate.vbs" echo s=right(year(dt),4) ^& "-" ^& right("0" ^& month(dt),2) ^& "-" ^& right("0" ^& day(dt),2)
>>"%temp%\DateCalculate.vbs" echo wscript.echo s
for /f %%a in ('cscript /nologo "%temp%\DateCalculate.vbs"') do (
    set Today=%%a
)
echo,%Today%
pauseCOPY
【方案5】BAT + REG
@echo off
REM 无法保证在中、英之外的其它语言的操作系统上得到正确结果
for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
    set "RegDateOld=%%a"
)
set RegDateOld=%RegDateOld:~-8%
reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
set Today=%date: =%
reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
set "Week=Mon Tue Wed Thu Fri Sat Sun 星期一 星期二 星期三 星期四 星期五 星期六 星期日"
for %%a in (%Week%) do (
    call set "Today=%%Today:%%a=%%"
)
echo,%Today%
pauseCOPY
【方案6】BAT + REG
@echo off
for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
    set "RegDateOld=%%a"
)
set RegDateOld=%RegDateOld:~-8%
reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
set Today=%date: =%
reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
if "%Today:~0,1%" gtr "9" (
    set Today=%Today:~-10%
) else (
    set Today=%Today:~0,10%
)
echo,%Today%
pauseCOPY
【方案7】BAT + REG
@echo off
for /f "delims=" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
    set "RegDateOld=%%a"
)
set RegDateOld=%RegDateOld:~-8%
reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
type nul>"%temp%\MyFile.tmp"
for /f %%a in ('dir "%temp%\MyFile.tmp" ^| findstr /i "MyFile.tmp"') do (
    set Today=%%a
)
reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
echo,%Today%
pauseCOPY
【方案8】BAT + REGEDIT
@echo off
REM 需要保证注册表编辑器没有处于锁定状态
regedit /e "%temp%\bak.reg" "HKEY_CURRENT_USER\Control Panel\International"
>"%temp%\new.reg" echo REGEDIT4
>>"%temp%\new.reg" echo,
>>"%temp%\new.reg" echo [HKEY_CURRENT_USER\Control Panel\International]
>>"%temp%\new.reg" echo "sShortDate"="yyyy-MM-dd"
regedit /s "%temp%\new.reg"
set Today=%date: =%
regedit /s "%temp%\bak.reg"
if "%Today:~0,1%" gtr "9" (
    set Today=%Today:~-10%
) else (
    set Today=%Today:~0,10%
)
echo,%Today%
pauseCOPY
【方案9】BAT + DEBUG
@echo off
for /f "tokens=6,8 delims== " %%a in ('^(echo a100^&echo mov ah^,2a^&echo int 21^&echo.^&echo p 2^&echo q^)^|debug^|find "CX"') do (
    set /a y=0x%%a
    set md=%%b
)
set /a m=0x%md:~,2%
set /a d=0x%md:~-2%
set m=0%m%
set d=0%d%
set Today=%y%-%m:~-2%-%d:~-2%
echo,%Today%
pauseCOPY
以下转载两个在DOS系统(不是Windows系统的CMD)里面获取日期、时间的代码:
原文:http://www.cn-dos.net/forum/viewthread.php?tid=19756
【willsort原始版】
@echo off
if "%1"=="[(" goto parse
echo.|date|find "Current" > _getdate.bat
echo set _dw=%%3> current.bat
echo set _date=%%4>> current.bat
call _getdate.bat
echo.|date|find "Enter" > _getdfmt.bat
echo set _dfmt=%%3> enter.bat
call _getdfmt.bat
echo.|time|find "Current" > _gettime.bat
echo set _time=%%3> current.bat
call _gettime.bat
echo _|choice /c%_dfmt%%_date%_%_time%_ @%0 > _parse.bat
%comspec% /e:2048 /c _parse.bat
goto end
:parse
set _dt1=_%2%3
set _dt2=_%5%6
set _dt3=_%8%9
for %%t in ([,Y,Y,-,M,M,-,D,D,]) do shift
set _vdt=
:loop1
shift
set _tmp=%_vdt%
for %%t in (1,2,3,4,5,6,7,8,9,0) do if "%1"=="%%t" set _vdt=%_vdt%%1
if not "%_vdt%"=="%_tmp%" goto loop1
set %_dt1%=%_vdt%
set _vdt=
:loop2
shift
set _tmp=%_vdt%
for %%t in (1,2,3,4,5,6,7,8,9,0) do if "%1"=="%%t" set _vdt=%_vdt%%1
if not "%_vdt%"=="%_tmp%" goto loop2
set %_dt2%=%_vdt%
set _vdt=
:loop3
shift
set _tmp=%_vdt%
for %%t in (1,2,3,4,5,6,7,8,9,0) do if "%1"=="%%t" set _vdt=%_vdt%%1
if not "%_vdt%"=="%_tmp%" goto loop3
set %_dt3%=%_vdt%
set _vdt=
:loop4
shift
set _tmp=%_vdt%
for %%t in (1,2,3,4,5,6,7,8,9,0) do if "%1"=="%%t" set _vdt=%_vdt%%1
if not "%_vdt%"=="%_tmp%" goto loop4
set _HH=%_vdt%
set _vdt=
:loop5
shift
set _tmp=%_vdt%
for %%t in (1,2,3,4,5,6,7,8,9,0) do if "%1"=="%%t" set _vdt=%_vdt%%1
if not "%_vdt%"=="%_tmp%" goto loop5
set _MN=%_vdt%
set _vdt=
:loop6
shift
set _tmp=%_vdt%
for %%t in (1,2,3,4,5,6,7,8,9,0) do if "%1"=="%%t" set _vdt=%_vdt%%1
if not "%_vdt%"=="%_tmp%" goto loop6
set _SS=%_vdt%
set _vdt=
:loop7
shift
set _tmp=%_vdt%
for %%t in (1,2,3,4,5,6,7,8,9,0) do if "%1"=="%%t" set _vdt=%_vdt%%1
if not "%_vdt%"=="%_tmp%" goto loop7
set _CS=%_vdt%
echo DTN:%_YY% %_MM% %_DD% %_HH% %_MN% %_SS% %_CS%
:endCOPY
【willsort简化版】
@echo off
if "%1"==":" goto %2 (subroutine handler at %2)
echo.exit|%comspec%/e:4096/k prompt set v=$d $t$_:>_tm.bat
call _tm.bat
echo.%v%&|%comspec%/e:4096/c %0 : Parse>_tm.bat
for %%p in (_tm.bat* _tmset.bat*) do call %%p
echo.Note that d1 d2 and d3 are in your system date order
echo.DTN:d1=%d1% d2=%d2% d3=%d3% hh=%hh% mm=%mm% ss=%ss% cs=%cs%.
for %%e in (v d1 d2 d3 hh mm ss cs) do set %%e=
for %%f in (_tm.bat* _tm.tmp* _tmset.bat*) do del %%f
goto end
:Parse (usage: call %0 : Parse +input redirect date/time)
set me=%0
set tok=d1 d2 d3 hh mm ss cs
set d1=
:NextToken
for %%v in (v1 v) do set %%v=
choice /c&0123456789 /n>_tm.tmp
for %%n in (0 1 2 3 4 5 6 7 8 9) do if errorlevel 77%%n set v=%%n
if not errorlevel 2 %me% : SetToken %tok%
find ""<_tm.tmp>nul
if not errorlevel 1 if not "%d1%"=="" call %me% : SetToken %tok%
set d1=%d1%%v%
goto NextToken
:SetToken
set tok=%4 %5 %6 %7 %8 %9
echo set %3=%d1%>> _tmset.bat
set d1=
goto end
:end (end-of-file)COPY
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

作为个人作品,在小范围内流通不需要考虑这么多。。。

当然,鼓励LZ。。。

TOP

不错的总结。
wmic path win32_operatingsystem get LocalDateTime
wmic os get LocalDateTimeCOPY
纯P的话,这个我常用
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 2楼 的帖子

确实如此。
不过等你参加工作以后,可能会发现自己的代码需要兼容各种各样的环境。
^_^
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4楼 的帖子

我在win98 MS-DOS4.10下,就不能使用%time%来引用当前时间,echo %time%的结果还是%time%。这就是环境不同的结果吧。能告诉我为什么会这样呢?

TOP

回复 5楼 的帖子

DOS系统里面没有%date%、%time%等环境变量,顶楼添加了两种在DOS系统里面的解决方案。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

很多种方法,研究一下

TOP

mark一下,明日再研究

TOP

学习了,感谢楼主。

TOP

感谢分享!!!

TOP

不错的分享
我就是我,不一样的烟火!

TOP

厉害&#128077;&#127995;

TOP

回复 4# Batcher


    主管,我想请问下关于日期的,下面这个代码是啥意思呀,可以解释一下吗
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)


这个yy我计算出来是2021,搞不懂这一句,谢谢

TOP

回复 1# Batcher


  请问方案一里的today获取的是211021,如何才能获取20211021?
谢谢

TOP

回复 14# jave000
powershell -c "'{0:yyyyMMdd}' -f (get-date)"COPY

TOP

返回列表