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

[日期时间] 批处理版简明公历万年历

本帖最后由 neorobin 于 2012-4-2 02:34 编辑

  1. @echo off & setlocal enabledelayedexpansion
  2. set /a "wid=6, cols=wid*7" & mode con lines=13 cols=!cols!
  3. for /l %%i in (1 1 !wid!) do for /l %%j in (1 1 7) do set "sps= !sps!"
  4. for %%w in (!wid!) do (
  5.   REM for %%a in (S M T W T F S) do set "w=!sps!%%a" & set "weekTitle=!weekTitle!!w:~-%%w!"
  6.   for %%a in (日 一 二 三 四 五 六) do set "w=!sps!%%a " & set "weekTitle=!weekTitle!!w:~-%%w,-1!"
  7.   set "ds32=!sps!" & for /l %%i in (1 1 32) do set "d=!sps!%%i"&set "ds32=!ds32!!d:~-%%w!"
  8. )
  9. call :today
  10. :doCom
  11. set /a "y=ys, ms=(ms-1)%%12+1, m=ms, mf=ms+100"
  12. set /a "p=y-1+400,m-=1,d1=1,di=d1+y*365+1-97+p/4-p/100+p/400+m*31+(~(m-4)>>31)+(~(m-6)>>31)+(~(m-9)>>31)+(~(m-11)>>31)+((~(m-2)>>31)&-2-(^!^!(y&3)|(^!^!(y&0xf)&^!0x!y:~-2!)))"
  13. set /a "wk=(di+5)%%7, wk+=(wk>>31)&7, pos=(7-wk)*wid+2" & rem (di+5)%%7 取正余数方能得到对应的星期值
  14. set /a "m=ms,trunc=wid*(-1-(^!(m-4)|^!(m-6)|^!(m-9)|^!(m-11))-^!(m-2)*(3-(^!(y&3)&^!^!(y%%100)|^!(y%%400))))"
  15. cls & title !y!.!m!& <nul set /p "=!weekTitle:~2!!sps:~-2!!sps: =-!"
  16. if "!today: 0= !"=="!ys! !ms! !d!" for %%d in (!d!) do set "ds32=!ds32:  %%d =★%%d !"
  17. for /f "tokens=1-2" %%p in ("!pos! !trunc!") do (echo !ds32:~%%p,%%q!!sps:~-%%p!!sps:~%%q!)& set "ds32=!ds32:★=  !"
  18. set "com=." &echo,&echo,!sps:~-16!!today!&set /p "com=-[W] !ys! [S]+!sps:~-16!-[A] !mf:~1! [D]+[SPACE] to today: "
  19. for /l %%i in (0 1 100) do (
  20.   if "!com:~%%i,1!"=="" goto :doCom
  21.   if /i "!com:~%%i,1!"=="W" set /a "ys-=1"
  22.   if /i "!com:~%%i,1!"=="S" set /a "ys+=1"
  23.   if /i "!com:~%%i,1!"=="A" set /a "ms-=1, ys-=^!ms, ms+=(ms-1>>31)&12"
  24.   if /i "!com:~%%i,1!"=="D" set /a "ms+=1, ys+=^!(ms-13), ms-=(12-ms>>31)&12"
  25.   if /i "!com:~%%i,1!"==" " call :today
  26.   echo !com!|findstr "^[0-9]" && for /f "tokens=1-2" %%a in ("!com!") do set /a "ys=%%a,ms=%%b"&goto :doCom
  27. )
  28. goto :doCom
  29. exit
  30. :today
  31. for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate^|find/i"sSh"') do (
  32.   >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "yyyy MM dd" /f
  33.   set /a "ys=!date:~0,4!,ms=1!date:~5,2!-100,d=1!date:~-2!-100" & set "today=!date!"
  34.   >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "%%~b" /f
  35. )
  36. exit /b
复制代码
W, S 键切换年份, A, D 键切换月份, 空格键 回到当前月份; 也可直接输入年和月(请用空格分隔): yyyy m. 例如: 2000 8
支持查询直到公元 0 年(尽管公元纪年的起点是公元1年, 并沒有「公元0年」),  代码不足 40 行, 没有农历及别的功能.
2

评分人数

好,不错,最好能突出显示(不同颜色或其它标记)当天日期,这样看起来比较爽。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

本帖最后由 neorobin 于 2012-4-2 01:28 编辑

回复 2# cjiabing

日期截取上有一个问题: M d 格式 得不到没有前导 0 的月和日, 在 得到的数字不大于 7 时, 不出错, 但大于 7 后, 因为前导 0 会使 8 和 9 成为 非法的 八进制数, 从而出错.
故截取的日期数要参与计算时, 好的方式是 形如 "yyyy MM dd" 的日期格式, 配合
set /a "y=!date:~0,4!,m=1!date:~5,2!-100,d=1!date:~-2!-100"

顶楼代码已作出修改, 另外 "今天" 的地方加上了一个标记五角星.

TOP

这个可以有,如果将cmd改成全屏幕就是一个屏幕保护了

TOP

外观很好看啊

TOP

回复 1# neorobin


    厉害了
天天向上

TOP

回复 3# neorobin


    怎么做成全屏
天天向上

TOP

返回列表