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

Posted EZhex1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows批处理 - 给自己写个库(2. 获取格式化的日期和时间)相关的知识,希望对你有一定的参考价值。

在系统日期和时间的处理上,批处理实在是让人头(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>nul

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

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%
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>nul
reg delete "HKEY_CURRENT_USER\\Control Panel\\InternationalCopy" /f>nul

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

测试代码如下: test.bat

@echo off
setlocal enabledelayedexpansion

Call "XZLib\\DateTime.bat"
echo %Year%
echo %Month%
echo %Day%
echo %Hour%
echo %Minute%
echo %Second%
echo %Millisecond%
echo %DateTime%

pause

测试结果正常。(下面的图片链接是https://image.cha138.com/20221213/80024276db5b43079f651983701bfb53.jpg,才发现CSDN是用时间来命名图片的~~)

注:因为文章经过了几次修改,但是没有重新截图,所以示例图片和代码的实际运行会有一点差别(无非就是多了个Millisecond而已),有代码不理解的可以询问,但是总想着别人的代码拿过来就和自己需求的一样,这不是一个好的学习态度(何况如果不考虑上面的注册表修改,获取时间数字的代码真的已经很基础了)。

以上是关于Windows批处理 - 给自己写个库(2. 获取格式化的日期和时间)的主要内容,如果未能解决你的问题,请参考以下文章

Windows批处理 - 给自己写个库(4. 简易的Debug工具)

Windows批处理 - 给自己写个库(3. INI文件的读取)

windows消息处理机制

Linux系统上用QT编写ARM9继电器控制程序的问题。 想写个QT界面程序到arm板子上,通过界面的按钮来控制继电

怎么写个windows脚本一键启动mysql服务

用C#自己动手写个操作系统,爽!