我的目标是计算给定日期之间和之前的天数0000.00.00 00:00:00,然后执行相反的操作。
我在“索引模式”中指定了月份和日期,所以它们是“ 00”;至于是哪一年,我不知道与它签订的协议。
在一年中的序数日和月/日之间进行转换很简单,因此问题被简化为只有年/序数日。
计算天数是一个小问题,解决起来几乎不难:
isLeap = (yr % 4==0) and (yr % 100!=0) or (yr % 400==0)
result = (yr*365 + yr//4 - yr//100 + yr//400 + int(yr>0)*(not isLeap)) + dy + 1
但把一切都变回来让我感到不安。
头疼了几天,用测试调试,还是没有解决。
例如:
带有索引的年份207 561和带有索引的有序日137都是75 810 237天。
这个数字包括闰年的调整;这也是逆变换的一个问题。
我的智力只能根据天数计算出当年的指数,即:
num = num - 1
num = num - num//146097
num = num - num//-36525
num = num - num//1461
result = num//365
给定天数,如何计算一年中的第几天?
我试图自己解决这个问题,甚至成功了……但由于我不知道的原因,36 600一年后我的方法失效了,每年每100年就会少发行一个。
这是我最接近的解决方案:
type
HDivModResult=record
year,day:Int64;
end;
function AbsoluteDaysToYearLinearDivMod(num:Int64):HDivModResult;
var
tmp:Int64;
tgl:Boolean;
begin
Result.year:=0;
Result.day:=0;
if num<1 then
Exit;
num:=num-1;
tmp:=num-(num div 146097);
tmp:=tmp-(tmp div -36525);
tmp:=tmp-(tmp div 1461);
Result.year:=tmp div 365;
tgl:=(Result.year mod 4=0)and(Result.year mod 100<>0)or(Result.year mod 400=0);
tmp:=((num+Byte(tgl))-(Result.year div 4-Result.year div 100+Result.year div 400));
Result.day:=tmp mod 365;
if (tgl)and(Result.day=0) then
begin
tmp:=tmp div 365;
Result.day:=365*Byte(tmp<>Result.year);
end;
end;
我理解错了什么?
朱利安约会来帮助你。或者“算法。就像 2x2 一样”一本书- 那里甚至有一个代码。所有“一次走一天”的建议,考虑到所有闰年和月份的长度,只会给出非常混乱的代码。
以下是这些神奇的公历来回翻译功能。
从好的方面来说,必须记住,直到 1918 年,我们都有儒略历(我们称之为旧式日历)。新的功能已经给出。
因此,自 1529 年左右以来,这些函数就适用于欧洲(甚至不是所有……)。
代码是用C++编写的,但我想你可以理解。
只是我不会看这么远,几千年……在那里,连公历也已经开始失效了,所以如果人类还活着,历法肯定会改变。