回复 48# plp626
这里不考虑 terse 提出的历法变化问题,
42 楼给出的测试方式是 假定一个 简单易懂易实现的 日期生成 算法 是正确的, 用它从 某个日期 开始依次生成某范围内所有后续的日期.
这样生成的一个日期序列的序号对应着整数序列的一部分,
index = date2index(测试起始日期)
loop (简单算法生成 y.m.d, 直到测试终止日期, (y.m.d)++) {
y.m.d -> i = date2index(y.m.d) -> yy.mm.dd = index2date(i)
上过程中: (i ≠ index) 或者 (yy.mm.dd ≠ y.m.d) 即发现错误
index++
}
bat 测试确实很慢, 还好没事开着不管它, 写成高级语言的也容易, 下面是已经完成测试过的 bat:- @echo off & setlocal enabledelayedexpansion
- REM Index := date2index(1.1.1);
- set /a "y=1,m=1,d=1"
- set /a "m+=9, m%%=12,y-=m/10, i=365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + d - 1"
- set /a "Index=i"
-
- for /l %%y in (1 1 20000) do (
- set "y=%%y"
- set /a "leap = (^!(%%y %% 4) & ^!^!(%%y %% 100)) | ^!(%%y %% 400)"
- if "!leap!"=="1" (set "eFeb=29") else set "eFeb=28"
- for %%t in ("1 31" "2 !eFeb!" "3 31" "4 30" "5 31" "6 30" "7 31" "8 31" "9 30" "10 31" "11 30" "12 31") do (
- for /f "tokens=1,2" %%m in ("%%~t") do (
- set "m=%%m"
- for /l %%d in (1 1 %%n) do (
- set "d=%%d"
-
- REM testing...
- REM if date2index(y.m.d) <> Index (
- REM error
- REM )
- REM if index2date(date2index(y.m.d)) <> y.m.d (
- REM error
- REM )
- REM Index += 1;
-
- set /a "m+=9, m%%=12,y-=m/10, i=365*y + y/4 - y/100 + y/400 + (m*306 + 5)/10 + d - 1"
-
- if "!i!" neq "!Index!" ((echo error at %%y.%%m.%%d date2index(y.m.d^)=!i!^<^> !Index!) & pause)
-
- set /a "y=(i*99+145)/36159,y+=i-365*y-y/4+y/100-y/400>>31,d=i-365*y-y/4+y/100-y/400,m=(5*d+2)/153,d+=1-(153*m+2)/5,y+=m/10,m=(m+2)%%12+1"
-
- set /a "error=(y-%%y)|(m-%%m)|(d-%%d)"
- if "!error!" neq "0" ((echo error at %%y.%%m.%%d index2date(date2index(y.m.d^)^)=!y!.!m!.!d!) & pause)
-
- echo %%y.%%m.%%d Index=!Index!
- set /a "Index+=1"
- )
- )
- )
- )
- pause
- exit
复制代码
|