返回列表 发帖
15# batman

set /a "_2=^!(%%a%%4)&^!(^!(^!%%a%%100))|^!(%%a%%400)+28"
笔误了
技术问题请到论坛发帖求助!

TOP

16# 随风
确实是的
***共同提高***

TOP

本帖最后由 zm900612 于 2011-6-7 12:19 编辑

这个思路可以有掌声吧?...
@echo off&setlocal enabledelayedexpansion
set min=19900612
set max=20121125
for /l %%a in (31 -1 1) do (
set tmp=0%%a
set md=!md! !tmp:~-2!
)
::先将个位数转换为0开头,避免在循环中计算
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
::进行一些计算,这里的s1和s2是最重要的两个值,直接关系到后文“砍头去尾”的算法
(for /l %%a in (%y2% -1 %y1%) do (
set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
for %%b in (%md:*13 =%) do (
for %%c in (%md%) do (
echo %%a%%b%%c
)
)
))>tmp 2>nul
::简单输出所有可能正确的日期
more +%s2% tmp|sort|more +%s1%|findstr /e "[^2].. 12.. 02[0-1]. 022[0-8] [02468][048]0229 [13579][26]0229"|findstr /ve "0[2469]31 0230 1131 [02468][048]000229 [13579][26]000229 %pr%">pr.txt
::整个代码最关键的部分,先用more+sort砍头去尾,削除不在要求之内的日期,再用findstr双向筛选排除非法日期
pauseCOPY
日期多的时候,速度相当快

TOP

对于日期处理,用VBS的函数比较方便

DateAdd 函数
返回已添加指定时间间隔的日期。

DateAdd(interval, number, date)
---学无止境---

TOP

19# broly


初学乍练,不是很懂,帮忙写个代码吧。

TOP

15楼的结果:73050行,还没有看到错误的日期。
c:\Test>timeit test.bat
Elapsed Time:     0:00:34.590
Process Time:     0:00:23.212
@echo off&setlocal enabledelayedexpansion
set start=1810-01-01
set end=2010-01-01
set /a sy=%start:~,4%,sm=1%start:~5,2%%%100,sd=1%start:~8,2%%%100,ey=%end:~,4%,em=1%end:~5,2%%%100,ed=1%end:~8,2%%%100,a=31
for %%a in (1 3 5 7 8 10 12 4 6 9 11) do (
  if %%a equ 4 set /a a-=1
  set /a _%%a=a
)
(for /l %%a in (%sy%,1,%ey%) do (
  set /a "_2=^!(%%a%%4)&^!(^!(%%a%%100))|^!(%%a%%400)+28"
  set /a a=1,b=12
  if "%%a" equ "%sy%" set /a a=sm
  if "%%a" equ "%ey%" set /a b=em
  for /l %%b in (!a!,1,!b!) do (
    set /a c=1,d=_%%b
    if "%%a%%b" equ "%sy%%sm%" set /a c=sd
    if "%%a%%b" equ "%ey%%em%" set /a d=ed
    for /l %%c in (!c!,1,!d!) do (
      for %%d in (%%b %%c) do set ".%%d=0%%d"&set ".%%d=!.%%d:~-2!"
      echo %%a-!.%%b!-!.%%c!
    )
  )
))>15.txtCOPY

TOP

18# zm900612


生成的那个tmp文件包含74772行,我等了一个多小时,还是没有执行完排除非法日期那部分,能否帮忙看看?
@echo off&setlocal enabledelayedexpansion
set min=18100101
set max=20100101
for /l %%a in (31 -1 1) do (
        set tmp=0%%a
        set md=!md! !tmp:~-2!
)
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
(for /l %%a in (%y2% -1 %y1%) do (
        set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
        for %%b in (%md:*13 =%) do (
                for %%c in (%md%) do (
                        echo %%a%%b%%c
                )
        )
))>tmp 2>nul
more +%s2% tmp|sort|more +%s1%|findstr /e "[^2].. 12.. 02[0-1]. 022[0-8] [02468][048]0229 [13579][26]0229"|findstr /ve "0[2469]31 0230 1131 [02468][048]000229 [13579][26]000229 %pr%">a.txtCOPY
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

来个Perl的,200年,2秒多点。
use Date::Calc qw( Delta_Days Add_Delta_Days );
@start = (1810,1,1);
@stop  = (2010,1,1);
$j = Delta_Days(@start,@stop);
for ( $i = 0; $i <= $j; $i++ )
{
    @date = Add_Delta_Days(@start,$i);
    printf("%4d-%02d-%02d\n", @date);
}COPY
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

more 好像只能处理6万多行,会被卡住。可以打开a.txt查看最后一行
隐藏秘密最好的方法是把秘密当笑话说给所有人听。

TOP

还真是...测试了下,具体是65535行,看来只能改用for了,不过那效率...
---------- TMP: 74772
more处理后:
---------- TMP2: 65535COPY

TOP

面对大于一百七十多年的情况,修改后是这样:
@echo off&setlocal enabledelayedexpansion
set min=18100101
set max=20100101
for /l %%a in (31 -1 1) do (
        set tmp=0%%a
        set md=!md! !tmp:~-2!
)
::先将个位数转换为0开头,避免在循环中计算
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
::进行一些计算,这里的s1和s2是最重要的两个值,直接关系到后文“砍头去尾”的算法
(for /l %%a in (%y2% -1 %y1%) do (
        set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
        for %%b in (%md:*13 =%) do (
                for %%c in (%md%) do (
                        echo %%a%%b%%c
                )
        )
))>tmp 2>nul
::简单输出所有可能正确的日期
if %s2% gtr 0 set skip1="skip=%s2%"
(for /f %skip1% %%a in (tmp) do echo %%a)>tmp2
sort tmp2 >tmp
if %s1% gtr 0 set skip2="skip=%s1%"
(for /f %skip2% %%a in (tmp) do echo %%a)>tmp2
findstr /e "[^2].. 12.. 02[0-1]. 022[0-8] [02468][048]0229 [13579][26]0229" tmp2|findstr /ve "0[2469]31 0230 1131 [02468][048]000229 [13579][26]000229 %pr%">pr.txt
::整个代码最关键的部分,先用more+sort砍头去尾,削除不在要求之内的日期,再用findstr双向筛选排除非法日期
pauseCOPY

TOP

26# zm900612


我希望把年月日用减号分开,应该修改哪些地方?

TOP

本帖最后由 zm900612 于 2011-6-11 14:11 编辑

27# DAIC
[code]@echo off&setlocal enabledelayedexpansion
set min=18100101
set max=20100101
echo %time%
for /l %%a in (31 -1 1) do (
        set tmp=0%%a
        set md=!md! !tmp:~-2!
)
::先将个位数转换为0开头,避免在循环中计算
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
::进行一些计算,这里的s1和s2是最重要的两个值,直接关系到后文“砍头去尾”的算法
(for /l %%a in (%y2% -1 %y1%) do (
        set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
        for %%b in (%md:*13 =%) do (
                for %%c in (%md%) do (
                        echo %%a-%%b-%%c
                )
        )
))>tmp 2>nul
::简单输出所有可能正确的日期
if %s2% gtr 0 set skip1="skip=%s2%"
(for /f %skip1% %%a in (tmp) do echo %%a)>tmp2
sort tmp2 >tmp
if %s1% gtr 0 set skip2="skip=%s1%"
(for /f %skip2% %%a in (tmp) do echo %%a)>tmp2
findstr /e "[^2]-.. 12-.. 02-[0-1]. 02-2[0-8] [02468][048]-02-29 [13579][26]-02-29" tmp2|findstr /ve "0[2469]-31 02-30 11-31 [02468][048]00-02-29 [13579][26]00-02-29 %pr%">pr.txt
::整个代码最关键的部分,先用more+sort砍头去尾,削除不在要求之内的日期,再用findstr双向筛选排除非法日期
echo %time%
pauseCOPY
少于17年的话,用这个更快
@echo off&setlocal enabledelayedexpansion
set min=18100101
set max=20100101
echo %time%
for /l %%a in (31 -1 1) do (
        set tmp=0%%a
        set md=!md! !tmp:~-2!
)
::先将个位数转换为0开头,避免在循环中计算
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
::进行一些计算,这里的s1和s2是最重要的两个值,直接关系到后文“砍头去尾”的算法
(for /l %%a in (%y2% -1 %y1%) do (
        set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
        for %%b in (%md:*13 =%) do (
                for %%c in (%md%) do (
                        echo %%a-%%b-%%c
                )
        )
))>tmp 2>nul
::简单输出所有可能正确的日期
more +%s2% tmp|sort|more +%s1%|findstr /e "[^2]-.. 12.. 0-2[0-1]. 02-2[0-8] [02468][048]-02-29 [13579][26]-02-29"|findstr /ve "0[2469]-31 02-30 11-31 [02468][048]00-02-29 [13579][26]00-02-29 %pr%">pr.txt
::整个代码最关键的部分,先用more+sort砍头去尾,削除不在要求之内的日期,再用findstr双向筛选排除非法日期
echo %time%
pauseCOPY

TOP

28楼的结果:
Elapsed Time:     0:00:19.345
Process Time:     0:00:11.778
@echo off&setlocal enabledelayedexpansion
set min=18100101
set max=20100101
for /l %%a in (31 -1 1) do (
        set tmp=0%%a
        set md=!md! !tmp:~-2!
)
set /a y1=%min:~0,-4%,y2=%max:~0,-4%,m1=1%min:~-4,2%-100,m2=1%max:~-4,2%-100,d1=1%min:~-2%-100,d2=1%max:~-2%-100,s1=~-m1*31+d1-1,s2=(13-m2)*31-d2
(for /l %%a in (%y2% -1 %y1%) do (
        set /a "1/(%%a%%3200)"||set pr=!pr! %%a0229
        for %%b in (%md:*13 =%) do (
                for %%c in (%md%) do (
                        echo %%a-%%b-%%c
                )
        )
))>tmp 2>nul
if %s2% gtr 0 set skip1="skip=%s2%"
(for /f %skip1% %%a in (tmp) do echo %%a)>tmp2
sort tmp2 >tmp
if %s1% gtr 0 set skip2="skip=%s1%"
(for /f %skip2% %%a in (tmp) do echo %%a)>tmp2
findstr /e "[^2]-.. 12-.. 02-[0-1]. 02-2[0-8] [02468][048]-02-29 [13579][26]-02-29" tmp2|findstr /ve "0[2469]-31 02-30 11-31 [02468][048]00-02-29 [13579][26]00-02-29 %pr%">28.txtCOPY

TOP

再次求助:http://bbs.bathome.net/viewthrea ... muid=38107#pid49141
这个代码看不懂,能否教一下怎么设置开始日期和结束日期?

TOP

返回列表