找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 56442|回复: 31

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

[复制链接]
发表于 2008-10-21 18:27:34 | 显示全部楼层 |阅读模式
出题目的:
             综合运用批处理各语句,提高综合运用的水平。
加分规则:
    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 编辑 ]
发表于 2008-10-21 20:06:04 | 显示全部楼层
不知道%date%所扩展出的日期的格式吗?
如果是 2008-01-01那怎么01是mm还是dd呢
 楼主| 发表于 2008-10-21 20:24:00 | 显示全部楼层
未知%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 编辑 ]
发表于 2008-10-21 20:52:17 | 显示全部楼层
未知%date%的格式。
有可能是 10-21-2008 或 10-21-08 这样的格式吗?
 楼主| 发表于 2008-10-21 21:03:03 | 显示全部楼层

回复 4楼 的帖子

这样的格式:
星期二 2008-10-21
2008-10-21 星期二
10/21/2008 Tue
Tue 10/21/2008
只考虑用4位数表示年份,暂时不必考虑用两位数表示的年份。
发表于 2008-10-21 21:04:31 | 显示全部楼层
原帖由 pusofalse 于 2008-10-21 20:24 发表
未知%date%的格式。

第一个01当然是mm,第二个当然是dd。
如果是2008-01-01、2000-12-12这样的日期,输入mmddyyyy虽然同ddmmyyyy是一样的结果,都是01012008、12122000,但第一个01确实是月份。ddmmyyyy格式的01 ...

还是有疑惑的
我的意思的 如果 %date%的值是 2008-01-01 那么两个01要自己判断哪个是DD 哪个是MM  是这样吗?
也可以这样说 2008-01-01 第一个01 可以是 dd 也可以是mm 因为各电脑的日期格式不一,所以要代码自己判断了
这样理解对吗
 楼主| 发表于 2008-10-21 21:11:34 | 显示全部楼层

回复 6楼 的帖子

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

[ 本帖最后由 pusofalse 于 2008-10-21 21:14 编辑 ]
发表于 2008-10-21 21:39:53 | 显示全部楼层
看似一个简单的问题,居然也要这么长的代码。。。
:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p var=请输入:
  3. set .y=a&set .m=a&set .d=a&set h=ymd
  4. for /l %%a in (0 1 9) do set .%%a=a
  5. for %%i in (%date%) do (
  6.    set str=%%i&set "str=!str:~0,1!"
  7.    if defined .!str! (
  8.       for /f "tokens=1-3 delims=/\,.-: " %%a in ("%%i") do (
  9.       set str=%%a&set str=!str:~2,1!
  10.       if not defined .!str! set h=mdy
  11.       set !h:~0,1!=%%a&set !h:~1,1!=%%b&set "!h:~2,1!=%%c"
  12. )))
  13. :loop
  14. set n=%var:~0,1%
  15. if defined .%n% (
  16.    set num=!num!!%n%:~0,1!
  17.    set "%n%=!%n%:~1!"
  18. ) else set "num=%num%%n%"
  19. set "var=%var:~1%"
  20. if defined var goto loop
  21. echo\&echo %num%
  22. pause>nul
复制代码

[ 本帖最后由 随风 于 2008-10-21 21:43 编辑 ]

评分

参与人数 1PB +14 收起 理由
pusofalse + 14 精品,但如果能考虑月/年/日这样的格式就更 ...

查看全部评分

 楼主| 发表于 2008-10-21 21:43:12 | 显示全部楼层

回复 8楼 的帖子

如果%date%是这样的格式就会出错:
10/21/2008 Tue
输入yyyy mm dd,输出10~0,1~ 21 20,本该是2008 10 21。
发表于 2008-10-21 21:44:14 | 显示全部楼层

回复 9楼 的帖子

以发现,你再试试?
 楼主| 发表于 2008-10-21 21:53:04 | 显示全部楼层
是的 现在可以了!
不过如果%date%的格式是这样的呢:
月/年/日。 日/年/月。 年/日/月。
。。。而不只是年/月/日 或 月/日/年。
或许也没有这样的日期格式。。。
发表于 2008-10-21 21:57:41 | 显示全部楼层
  1. @echo off
  2. reg export "HKEY_CURRENT_USER\Control Panel\International" 1.reg >nul
  3. reg add "HKEY_CURRENT_USER\Control Panel\International" /f /v sShortDate /d "yyyy-MM-dd" >nul

  4. :shuchu
  5. set /p rqgs=请输入日期格式(按q退出):
  6. if "%rqgs%"=="mm dd yyyy" echo %date:~5,2% %date:~8,2% %date:~0,4%
  7. if "%rqgs%"=="yyyy/mm/dd" echo %date:~0,4%/%date:~5,2%/%date:~8,2%
  8. if "%rqgs%"=="mm-dd/yyyy" echo %date:~5,2%-%date:~8,2%/%date:~0,4%
  9. if "%rqgs%"=="md-md-yyyy" echo %date:~5,1%%date:~8,1%-%date:~6,1%%date:~9,1%-%date:~0,4%
  10. if "%rqgs%"=="ymydymyd" echo %date:~0,1%%date:~5,1%%date:~1,1%%date:~8,1%%date:~2,1%%date:~6,1%%date:~3,1%%date:~9,1%
  11. if "%rqgs%"=="ydmydm-yy" echo %date:~0,1%%date:~8,1%%date:~5,1%%date:~1,1%%date:~9,1%%date:~6,1%-%date:~2,1%%date:~3,1%
  12. if "%rqgs%"=="dd---/m/m/ y y y y" echo %date:~8,2%---/%date:~5,1%/%date:~6,1%/ %date:~0,1% %date:~1,1% %date:~2,1% %date:~3,1%
  13. echo.
  14. if /i not "%rqgs%"=="q" goto shuchu
  15. reg import 1.reg>nul
  16. echo OK&pause>nul
  17. exit
复制代码

评分

参与人数 1PB +2 收起 理由
pusofalse + 2 加油!以资鼓励。

查看全部评分

 楼主| 发表于 2008-10-21 22:02:44 | 显示全部楼层

回复 12楼 的帖子

回复楼上的兄弟。八个字母的排列方式太多了。
我有可能输入 ym-ym-dydy,抑或m/-yydy/myd。。。
发表于 2008-10-21 22:03:55 | 显示全部楼层

回复 11楼 的帖子

那样就无法判断 月和日 了啊?
 楼主| 发表于 2008-10-21 22:13:46 | 显示全部楼层

回复 14楼 的帖子

是的。%date%的值是日/年/月这样格式的日期我也没见过,只是个人意见而已。不管格式怎样,即使千变万化也能正确输出才能谓之完美。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:52 , Processed in 0.030274 second(s), 13 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表