标题: [数值计算] 批处理获取N天后的星期 [打印本页]
作者: 随风 时间: 2008-10-16 19:49 标题: 批处理获取N天后的星期
获取N天后的星期
比如今天是星期四 输入 2 则显示 2天前是星期二
输入 -2 则显示 2天后是 星期六
用纯p解决。
[ 本帖最后由 随风 于 2008-10-16 21:51 编辑 ]
作者: pusofalse 时间: 2008-10-16 20:14
一个链环~ 让我想起约瑟夫环的问题。
作者: 随风 时间: 2008-10-16 20:16
此题应该不难,关键是思路。。
作者: batman 时间: 2008-10-16 20:20
是不难,故先不做答,期待新人的表现。
作者: pusofalse 时间: 2008-10-16 21:33
先来抛砖:- @echo off
- :loop
- cls&setlocal enabledelayedexpansion
- for %%a in (一 二 三 四 五 六 天) do set/a n+=1&set ".!n!=%%a"
- set /p var=几天前/后?
- set/a s=var, x=4
- set/a var%%=7
- if "%var:~,1%" equ "-" (
- set "op=+"&set "str=后"
- set /a m=8,y=1
- ) else (
- set "op=-"&set "str=前"
- set /a m=0,y=7
- )
- for /l %%a in (1 1 %var:-=%) do (
- set/a x%op%=1
- if !x! equ %m% set x=%y%
- )
- echo %s:-=% 天%str%是星期!.%x%!
- endlocal
- pause>nul&goto loop
复制代码
[ 本帖最后由 pusofalse 于 2008-10-16 21:57 编辑 ]
作者: fastslz 时间: 2008-10-16 21:34
不是纯P的,在联盟我曾回复过此类日期的计算贴,本想集中到某个贴子中,只是太忙了....
- @echo off
- >星期计算.vbs Echo aDate = InputBox("请输入一个日期:", "BY: fastslz",date)
- >>星期计算.vbs Echo Wscript.Echo WeekDayName(DatePart("w", aDate))
- for /f "delims=" %%i in ('cscript.exe //nologo 星期计算.vbs') do set aDate=%%i&del 星期计算.vbs
- Echo %aDate%
- pause
复制代码
- @echo off
- >星期计算.vbs Echo a = InputBox("计算昨天请输入-1,明天输入1,后天输入2,以此类推:", "BY: fastslz")
- >>星期计算.vbs Echo aDate=FormatDateTime (DateAdd("d", a ,Date),2)
- >>星期计算.vbs Echo Wscript.Echo WeekDayName(DatePart("w", aDate))
- for /f "delims=" %%i in ('cscript.exe //nologo 星期计算.vbs') do set aDate=%%i&del 星期计算.vbs
- Echo %aDate%
- pause
复制代码
-
- @echo off
- >周计算.vbs Echo aDate = InputBox("请输入一个日期:", "BY: fastslz",date)
- >>周计算.vbs Echo Wscript.Echo "0" ^&Right(Year(aDate) ,1)^&"年" ^& DatePart("ww", aDate)^&"周"
- for /f "delims=" %%i in ('cscript.exe //nologo 周计算.vbs') do set aDate=%%i&del 周计算.vbs
- Echo %aDate%
- pause
复制代码
-
- @echo off
- >天计算.vbs Echo aDate = InputBox("请输入一个日期:", "BY: fastslz",date)
- >>天计算.vbs Echo Wscript.Echo Year(aDate) ^&"年第" ^& DatePart("y", aDate) ^& "天"
- for /f "delims=" %%i in ('cscript.exe //nologo 天计算.vbs') do set aDate=%%i&del 天计算.vbs
- Echo %aDate%
- pause
复制代码
作者: 随风 时间: 2008-10-16 21:51
用vbs就太简单了,要求是用纯p
pusofalse 的代码能达到要求,但效率有待提高,试试输入 100000 看看。。
另:不必输入今天是星期几,就以当前星期为准就好了。。
[ 本帖最后由 随风 于 2008-10-16 21:52 编辑 ]
作者: pusofalse 时间: 2008-10-16 21:55 标题: 回复 7楼 的帖子
回随风兄,代码已经修改~
作者: 随风 时间: 2008-10-16 22:03
代码也太不修饰了吧?
几天前/后? -10000
4 天后是星期一
作者: pusofalse 时间: 2008-10-16 22:12 标题: 回复 9楼 的帖子
时间差问题,我修改了两次代码,第一次修改时,你在测试我第一次贴出的未修改的代码,存在效率问题。第二次修改时你在测试我修改一次后的代码。现在修改好了。
作者: zqz0012005 时间: 2008-10-16 23:09
- @echo off
- :loop
- cls&setlocal enabledelayedexpansion
- for %%a in (一 二 三 四 五 六 天) do (set /a n+=1 & set ".!n!=%%a" & if "%date:~-1%"=="%%a" set x=!n!)
- if not defined x set /a x=4 &rem 如果%date%不包含星期,而今天是星期四,所以令x=4
- set /p var=几天前或几天后(前加-)?
- set /a "s=((var+x)%%7-7)%%7+7" &rem 确保s∈[1-7]
- if "%var:~,1%" equ "-" (set "str=前") else set "str=后"
- echo %var:-=% 天%str%是星期!.%s%!
- endlocal&echo.&pause&goto loop
复制代码
[ 本帖最后由 zqz0012005 于 2008-10-17 00:13 编辑 ]
作者: 随风 时间: 2008-10-16 23:37
各位的思路比我的清晰多了。。。
代码也比我的简洁多了。。。惭愧。!- @echo off&setlocal enabledelayedexpansion
- set "str=日六五四三二一"
- set /p day=请指定要追溯的天数:&cls
- for /f "tokens=4 delims=:\/- " %%a in ("%date%") do set "xq=%%a"
- set /a tian=day&set m=前
- if %day% lss 0 (
- set "str=一二三四五六日"
- set /a tian=~day+1&set m=后
- )
- for /l %%a in (0 1 6) do (
- if not "!str:~0,1!"=="!xq:~-1!" set "str=!str:~1!!str:~0,1!"
- )
- set /a tian=tian%%7
- for /l %%a in (1 1 %tian%) do set "str=!str:~1!!str:~0,1!"
- echo %day:-=%天%m%是 星期!str:~0,1!
- pause
复制代码
作者: lixiaodaoaaa 时间: 2008-10-17 03:03 标题: 注册了一年多,天天学批处理,还是不会写..
注册了一年多,天天学批处理,还是不会写..
看来我的脑子真的有问题
学习批处理真的需要资本,真的需要才气
看来我没有什么才气,就知道 硬一点的命令,一软,我也软了..汗..
作者: batman 时间: 2008-10-17 10:01
- @echo off&setlocal enabledelayedexpansion
- for %%a in (1一六 2二五 3三四 4四三 5五二 6六一 0天天) do (
- set "str=%%a"
- set "_!str:~,1!=!str:~1,1!"&set "_!str:~1,1!=!str:~,1!"&set ".!str:~,1!=!str:~2,1!"
- )
- set /p num=请输入向后的天数:
- if %num% lss 0 (set "x=前") else (set "x=后")
- if %num% lss -!_%date:~-1%! (set "y=.") else (set "y=_")
- set /a d2=num+_%date:~-1%&set "d2=!d2:-=!"
- set /a d2=d2%%7
- cls&echo.&echo 今天是%date:~-3%,%num:-=%天%x%是星期!%y%%d2%!
- pause>nul
复制代码
[ 本帖最后由 batman 于 2008-10-17 11:28 编辑 ]
作者: terse 时间: 2008-10-17 13:03
- @echo off&setlocal enabledelayedexpansion
- set n=-1
- for %%a in (天 一 二 三 四 五 六) do set /a n+=1 & set "%%a=!n!"&set "_!n!=%%a"
- set /p n=请指定天数:
- if %n% lss 0 (set/a d=^(7-^(~n+1^)%%7+%date:~-1%^)%%7&set x=前)else set/a d=(n+%date:~-1%)%%7&set x=后
- echo 今天是 %date:~-3% %n% 天%x% 是%date:~-3,2%!_%d%!
- pause
复制代码
作者: batman 时间: 2008-10-18 11:38
terse就是terse,写出来的代码确实是精炼简洁,不过你这个计算公式实在是有点难懂,
我都看了半天才明白,总觉得没必要写这么复杂的公式,不知兄是否认同?
作者: terse 时间: 2008-10-18 13:30
原帖由 batman 于 2008-10-18 11:38 发表
terse就是terse,写出来的代码确实是精炼简洁,不过你这个计算公式实在是有点难懂,
我都看了半天才明白,总觉得没必要写这么复杂的公式,不知兄是否认同?
呵呵 我是这样想的 N天后的星期 就是(N+当天)%%7
由此得到N天前的星期 也就是 7-(N+当天)%%7
简化的话 可以去掉里面一括号 使d=(6-~n%%7+%date:~-1%)%%7
batman兄的意见呢?
[ 本帖最后由 terse 于 2008-10-18 13:31 编辑 ]
作者: batman 时间: 2008-10-18 13:57
可不可以换个思路呢:
其实这就是个今天向后几天(这个几天是小于7的)是星期几的问题。假设今天是星期二
,那么往后n个整星期后还是星期二,而7*n+1天后是星期三,7*n+2天后是星期四....7*n+6
天就是星期一,7*n+7=7*(n+1)天后又是星期二了。所以,我解题的思路是今天是星期几如
星期五那就是从星期一向后了5天,于是向后n天便从星期一开始推算:(n+5)%%7,如余数
是0就是星期一,余数为1就是星期二.....以此类推。
当然向前就是先将星期天向前反推2天(同样是以星期五为例),然后再将反推的总天数
减去2天,公式是一样的,只是在向前天数小于5(星期数)时,一样可以用正推的方法算。
作者: terse 时间: 2008-10-18 15:00
Re:batman兄
可以说你我思路上都一样: “其实这就是个今天向后几天(这个几天是小于7的)”
只是你的"(n+5)%%7,如余数是0就是星期一" 这里的 余数是0我以为应该是星期天 当然这和SET 有关
反推的思路 也就是转为几天后 然后用7-去 比如今天星期四 2天前其实就是5天后 这里的5就是7-2得到
作者: moshou 时间: 2009-2-19 23:45
@echo off
:loop
cls
set /p=今天是%date:~-3%
setlocal enabledelayedexpansion
for %%a in (一 二 三 四 五 六 天) do (set /a n+=1&set ".!n!=%%a"
if "%date:~-1%"=="%%a" set x=!n!)
set /p var=几天前或几天后(前加-):
set /a "s=(var%%7+x-7)%%7+7"
if "%var:~,1%"=="-" (set "str=前") else set "str=后"
echo %var:-=%天%str%是星期!.%s%!
echo 按任意键返回
pause>nul&goto:loop
这些代码是参考了pusofalse版主的代码写出来的,虽然这道题不能说是很难,但在写代码时,特别是那个计算的公式,让我着实想了半天。还有楼上的各位高手的set "_!n!=%%a"类似于这样的语句,如果不是自己写,很难想的通。不得不说写这次代码让我有所收获。
作者: 狱渊 时间: 2013-5-1 10:22
好厉害啊 你们 我是新人 路过
作者: binggun 时间: 2015-11-26 14:29
@ECHO OFF
:MAIN
SET /P D=
SET /A M=1%DATE:~5,2%-100,M+=!(M/3)*12,W=(7%DATE:~8,2%+%D%+2*M+3*(M+1)/5+(Y=%DATE:~,4%-M/13)+Y/4-Y/100+Y/400)%%7+1
ECHO %W%
GOTO MAIN
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |