windows command(20):date time

data命令用来显示日期;time命令用来显示时间。

Basics

date
1
2
>echo %date%
Sun 12/18/2016
time
1
2
>echo %time%
17:00:35.87

note:

  1. %可以替换为!,效果一样。
  2. 注册表里HKCU\Control Panel\International下的一些键值:
    sShortDate键值为M/d/yyyy
    sTimeFormat键值为h:mm:ss tt
    以上键值不同则输出的格式会有不同。

format output

:截取字符串

date year
1
2
>echo %date:~10,4%
2016

date后的:表示对变量作处理,~10表示从第10个字符开始取内容(从0开始计数),,4表示去4个字符。

date month
1
2
>echo %date:~4,2%
12
date day
1
2
>echo %date:~7,2%
18
time hour
1
2
>echo !time:~,2!
19
time minute
1
2
>echo !time:~3,2!
58
time second
1
2
>echo !time:~6,2!
20

for语句

for-date
1
2
3
4
>for /F "tokens=1-4 delims=/ " %i in ("%date%") do @echo %i-%j-%k-%l
Sun-12-18-2016
>for /F "tokens=1-4 delims=/ " %i in ("%date%") do @echo %l-%j-%k
2016-12-18
for-time
1
2
3
4
>for /F "tokens=1-4 delims=:." %i in ("%time%") do @echo %i-%j-%k-%l
20-29-30-71
>for /F "tokens=1-4 delims=:." %i in ("%time%") do @echo %i%j
2029

unified output format in different operation settings

由于Windows语言和日期格式设置不同,可能的输出也不同:

date format
1
2
3
4
星期日 2016-12-18
2016-12-18 星期日
12/18/2016 Sun
Sun 12/18/2016

不同的格式用上一节所述方法,在不同设置的操作系统上,会得到不同的结果,有可能是错误的结果;
通过修改注册表中的sShortDate键值来保证不同的操作系统设置都能输出正确的格式。

date.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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%
execute date.bat
1
2
>.\date.bat
2016-12-18

References:

  1. 再谈DOS批处理下格式化日期字符串的三种方法(详解)
  2. 批处理bat标准化获取当前系统日期的几种方法