Windows批处理 - 给自己写个库(2. 获取格式化的日期和时间)

来源:互联网 发布:apache mpm 配置 编辑:程序博客网 时间:2024/06/10 19:40

在系统日期和时间的处理上,批处理实在是让人头(dan)疼。可能有人会说,date和Time两个单词就能搞定的事,有啥难的。这样说一点错没有,但是程序里往往会因为直接使用date和Time而出错。

date和time两个命令可以用来获取和修改系统的时间,直接用作变量也可以,但是获取到的时间格式会因为系统设置而不同。

在某台电脑上echo %date%显示的可能是“1111/11/11”(单身狗受到2^8点伤害),但是在另一台电脑上显示的可能就是“11/11/1111”,更何况“1111年11月11日”这样带中文字的还得考虑字符长度。而echo %time%,国际通用的“小时分秒”看似结构稳定,“1:1:01”和“11:11:11”同样在字符串长度上让人不省心。

所以,以后看见用如下代码获取时间数字的,你完全可以给个差评了。。。
set Year=%date:~0,4%
set Month=%date:~5,2%
set Day=%date:~8,2%
set Hour=%time:~0,2%
set Minute=%time:~3,2%
set Second=%time:~6,2%

正确的获取8位日期和8位时间的做法(精确到ms)是:首先对日期和时间的格式进行设置,然后对不足两位的时间数进行补齐(时间在设置时补齐不一定有效果?这个问题是别人反馈的。)。

这个流程上来说是没问题了,但是,作为一个优(chu)秀(nv)的(zuo)程序猿,我不会要求别人在运行我程序时还得先去修改自己电脑上日期时间的设置,更别说有些人还不会设置。。。

所以这里的日期时间的格式设置,也需要在批处理中进行,好的是之前的经验告诉我,Control Panel上几乎所有的设置,都是通过修改注册表实现的。而注册表,是可以在批处理中使用reg命令进行操作的。于是乎在命令行中输入reg /?查到操作方式,在注册表“HKEY_CURRENT_USER\Control Panel\”下搜索“time”后。找到了可行的解决方案。(这个程序会改变你电脑当前的设置,请先不要测试。后面会解决这个问题

reg add “HKEY_CURRENT_USER\Control Panel\International” /v sLongDate /t REG_SZ /d yyyy/MM/dd /f>nul
reg add “HKEY_CURRENT_USER\Control Panel\International” /v sShortDate /t REG_SZ /d yyyy/MM/dd /f>nul
reg add “HKEY_CURRENT_USER\Control Panel\International” /v sShortTime /t REG_SZ /d HH:mm:ss /f>nul
reg add “HKEY_CURRENT_USER\Control Panel\International” /v sTimeFormat /t REG_SZ /d HH:mm:ss /f>nul
echo %date% %time%

这样输出的时间日期就会是正常的格式了(这里修改了4个值,因为我不知道哪两个值是有效的)。

不过这样胡乱对别人的系统设置进行修改,和 疼逊管家后台安装 有什么区别!!我又对程序进行了一次修正。

代码如下:DateTime.bat

reg copy "HKEY_CURRENT_USER\Control Panel\International" "HKEY_CURRENT_USER\Control Panel\InternationalCopy" /f>nulreg add "HKEY_CURRENT_USER\Control Panel\International" /v sLongDate /t REG_SZ /d yyyy/MM/dd /f>nulreg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy/MM/dd /f>nulreg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortTime /t REG_SZ /d HH:mm:ss /f>nulreg add "HKEY_CURRENT_USER\Control Panel\International" /v sTimeFormat /t REG_SZ /d HH:mm:ss /f>nulset Year=%date:~0,4%set Month=%date:~5,2%set Day=%date:~8,2%set Hour=%time:~0,2%set Minute=%time:~3,2%set Second=%time:~6,2%set Millisecond=%time:~9,2%set DateTime=%Year%%Month%%Day%%Hour%%Minute%%Second%%Millisecond%reg copy "HKEY_CURRENT_USER\Control Panel\InternationalCopy" "HKEY_CURRENT_USER\Control Panel\International" /f>nulreg delete "HKEY_CURRENT_USER\Control Panel\InternationalCopy" /f>nul

程序因为需要通过修改注册表去得到准确的时间,所以我第一步就将需要修改的注册表进行了一次备份;
然后则是修改注册表,并对时间进行设置;
然后个人经常采用日期和时间作为文件版本的后缀,所以我又把数字连起来赋值给了DateTime变量;
最后又将备份的注册表覆盖回来,然后删除备份,保证使用者的设置不会发生变动;
而reg的命令会有结果显示,使用>nul将其屏蔽。

测试代码如下: test.bat

@echo offsetlocal enabledelayedexpansionCall "XZLib\DateTime.bat"echo %Year%echo %Month%echo %Day%echo %Hour%echo %Minute%echo %Second%echo %Millisecond%echo %DateTime%pause

测试结果正常。(下面的图片链接是http://img.blog.csdn.net/20161103173038725,才发现CSDN是用16位的时间来命名图片的~~)
这里写图片描述

0 0
原创粉丝点击