[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-028】批处理根据输入的日期格式输出当前日期

出题目的:
             综合运用批处理各语句,提高综合运用的水平。
加分规则:
    1、思路独特基分5分
    2、代码高效基分4分
    3、代码简洁基分3分
    4、代码通用基分2分
    5、无临时文件基分1分
    6、完美代码加分15分

题目内容:

根据输入的日期格式输出当天的日期。用y代表年份,m代表月份,d代表当前的日值。
比如今天日期是2008年10月21日:
输入mm dd yyyy,输出10 21 2008
输入yyyy/mm/dd,输出2008/10/21
输入mm-dd/yyyy,输出10-21/2008
输入md-md-yyyy,输出12-01-2008
输入ymydymyd,输出21020081
输入ydmydm-yy,输出221010-08
输入dd---/m/m/ y y y y, 输出21---/1/0/ 2 0 0 8

请先认真发现其中的规律。
相关条件:

1、不同的操作系统,日期格式会有不同。现在的题目中,未知%date%所扩展出的日期的格式,可以是以下的其中一种格式:
星期二 2008-10-21
2008-10-21 星期二
10/21/2008 Tue
Tue 10/21/2008
(只考虑用4位数表示的年份,暂时不必考虑用两位数表示的年份。)
获取当前标准格式的日期的方法不限,不必非要从%date%取值,可以用系统自带的reg.exe读取注册表等方法,只是不能借助第三方工具。
2、日期中各元素之间的连接符只需用/、-或空格,不必考虑用&、|、>等这类的特殊字符。
3、输入的格式中总是有4个y,2个m,2个d,不必考虑格式中只有3个y,1个m,或4个d等不合法的日期格式。而连接符(-、/或空格),可以没有,也可以有1个或多个。-、/、空格可以同时出现。
4、如果是2008-01-01、2000-12-12这样的日期,输入mmddyyyy虽然同ddmmyyyy是一样的结果,都是01012008、12122000,但第一个01确实是月份。ddmmyyyy格式的01012008,第一个01则是当前的日值。一切都以用户输入的为准。输入mdmdyyyy,输出00112008 等。。。
5、用纯批解决。

我的系统是xp_sp2,没有其他的测试环境,只能通过修改代码来测试。还请其他朋友帮忙测试答题人的代码。

[ 本帖最后由 pusofalse 于 2008-10-21 22:56 编辑 ]
心绪平和,眼藏静谧。

未知%date%的格式。

第一个01当然是mm,第二个当然是dd。
如果是2008-01-01、2000-12-12这样的日期,输入mmddyyyy虽然同ddmmyyyy是一样的结果,都是01012008、12122000,但第一个01确实是月份。ddmmyyyy格式的01012008,第一个01则是当前的日值。
一切都以用户输入的为准。
输入mdmdyyyy,输出00112008 等。。。

[ 本帖最后由 pusofalse 于 2008-10-21 20:59 编辑 ]
心绪平和,眼藏静谧。

TOP

回复 4楼 的帖子

这样的格式:
星期二 2008-10-21
2008-10-21 星期二
10/21/2008 Tue
Tue 10/21/2008
只考虑用4位数表示年份,暂时不必考虑用两位数表示的年份。
心绪平和,眼藏静谧。

TOP

回复 6楼 的帖子

回复terse前辈,可以这样理解。
但不必非要从%date%中读取日期,也可以用其他的方法,比如读取注册表提取当前日期。。。方法不限,只是不能借助第三方工具。

[ 本帖最后由 pusofalse 于 2008-10-21 21:14 编辑 ]
心绪平和,眼藏静谧。

TOP

回复 8楼 的帖子

如果%date%是这样的格式就会出错:
10/21/2008 Tue
输入yyyy mm dd,输出10~0,1~ 21 20,本该是2008 10 21。
心绪平和,眼藏静谧。

TOP

是的 现在可以了!
不过如果%date%的格式是这样的呢:
月/年/日。 日/年/月。 年/日/月。
。。。而不只是年/月/日 或 月/日/年。
或许也没有这样的日期格式。。。
心绪平和,眼藏静谧。

TOP

回复 12楼 的帖子

回复楼上的兄弟。八个字母的排列方式太多了。
我有可能输入 ym-ym-dydy,抑或m/-yydy/myd。。。
心绪平和,眼藏静谧。

TOP

回复 14楼 的帖子

是的。%date%的值是日/年/月这样格式的日期我也没见过,只是个人意见而已。不管格式怎样,即使千变万化也能正确输出才能谓之完美。
心绪平和,眼藏静谧。

TOP

回复 16楼 的帖子

sorry,刚刚脑子短路了。。。
因为我的代码是先获取一个yyyymmdd格式的标准格式的日期(所谓标准,即是别的机子上也是如此),所以没有考虑太过关于日/年/月格式该如何区分日、月的问题就说了出来。
依次看来,随风兄的代码算得上完美代码了,期待更多好代码的出现。
心绪平和,眼藏静谧。

TOP

回复 17楼 的帖子

VBS那里能知道个大概意思。lp1标签里的变量嵌套实在太经典了。
出这题的有一部分目的也在于熟悉“变量的嵌套”吧。
心绪平和,眼藏静谧。

TOP

回复 20楼 的帖子

有变化的判断为日?
特意把日期改为10月1日后再运行,虽然也能正确输出。但“有变化的判断为日”这种说法是否不严谨?因为10月1日前一天是9月30日,月份也变化了。或许是我误解了。
------------------------------------------------------------------
明白了~只看到-1,没看到+1。

[ 本帖最后由 pusofalse 于 2008-10-21 23:49 编辑 ]
心绪平和,眼藏静谧。

TOP

贴出我的代码,可能存在通用性问题。希望大家测试并指出其中问题:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%a in ('wmic path win32_operatingsystem get localdatetime') do set "CurrentDate=%%a"
  3. rem 用wmic获取日期标准格式(yyyymmdd),代码、思路来自于论坛巡查BATCHER。
  4. rem 标准化获取当前日期:http://www.cn-dos.net/forum/viewthread.php?tid=41857&fpage=1&highlight=%2Bhat
  5. set "CurrentDate=%CurrentDate:~0,8%"
  6. set "Format=yyyymmdd"
  7. for %%a in (Y M D) do set "%%a=defined"
  8. for %%a in (4 2 2) do call :LOOP %%a
  9. set /p DateFormat=Input the format:
  10. :LP
  11. set "Char=%DateFormat:~,1%"
  12. if defined !Char! (
  13.    set /a !Char! += 1
  14.    <nul call call set /p=%%%%!Char!%%!Char!%%%%%%
  15.    ) else (
  16.    <nul set /p=!DateFormat:~,1!
  17. )
  18. set "DateFormat=!DateFormat:~1!"
  19. if defined DateFormat goto :LP
  20. pause>nul &exit /b
  21. :LOOP
  22. for /l %%a in (1 1 %1) do (
  23.      set "!Format:~,1!%%a=!CurrentDate:~,1!"
  24.      for %%i in (Format CurrentDate) do set "%%i=!%%i:~1!"
  25. )
复制代码

[ 本帖最后由 pusofalse 于 2008-10-22 17:43 编辑 ]
心绪平和,眼藏静谧。

TOP

返回列表