我有一个扭曲的任务,我不知道从哪里开始。我需要编写一个函数,它会在给定日期(dd / mm / yyyy)中添加天数,并在结果中返回日期,但问题是,年份不一定需要格鲁吉亚,例如。它可以有13个月,其中第13个月有40天。我不需要代码,我需要某种算法来知道,从哪里开始。我试图使用Julian Day Number,但我无法根据自己的需要对其进行编辑。如果有人有任何建议,他们将不胜感激。我不能使用像time_t
这样的包装器答案 0 :(得分:1)
您可以编写2个函数:
int DateToDay(const Date& date);
Date DayToDate(int day);
哪会将日期转换为自00/00/00以来的日期并返回到您的日历中(这很简单,可以用通用公式表示 - 您需要知道每年的月份,以及每个月定义的日期日历+闰年的一些逻辑)。之后,您可以通过
添加日期Date result_date = DayToDate(DateToDay(start_date)+days_to_add);
答案 1 :(得分:0)
首先,考虑存储描述日历的信息的好方法,即如何存储一年中的monthes数和每月的天数。找到问题的答案:是否有闰年,与非飞跃有什么不同?
然后,设计所需操作的逻辑,如 http://alcor.concordia.ca/~gpkatch/gdate-algorithm.html 但具有你的特异性
答案 2 :(得分:0)
在最基本的形式中,年份都具有相同的天数,并且每个月也有指定的天数。因此,例如,i
个月有d_i
天,一年有n
个月。我们可以将其视为一个表格:
month | 1 | 2 | 3 | ... | n
days | d1| d2| d3| ... | dn
这一年将有d1+d2+d3+...+dn
天。
现在,如前所述,将日期(dd/mm/yyyy
)转换为天数的算法只是使用上表来获取自某个日期以来经过的天数,例如,自01/01/1000。
number of days in whole years = (yyyy - 1000) * days_in_year
number of days in whole months = sum(d_i) for all i < mm
number of days in current month = dd
total number of days = sum of the three numbers you get above
反之亦然,您有自该特定日期以来经过的天数(d
),并且您希望从中获取日历日期,因此您需要找到:< / p>
how many years have passed = floor(d / days_in_year)
yyyy = 1000 + how_many_years_have_passed
等等mm
和dd
。
如果您还想考虑闰年,您只需要稍微调整算法以考虑闰年的逻辑。例如,如果闰年每5年发生一次,那么您需要找出在1000
和yyyy
之间有多少闰年,并为每个闰年增加一天。此外,您需要告诉反向算法哪个月将在闰年中有额外的一天。
格里高利历中的闰年有一个非常奇怪的模式:它们每四年发生一次(如果年份可以被4整除,那就是闰年),但如果年份可以被100整除则不会。但是,如果年份是可以被400整除,那么它是闰年。因此,您可能需要考虑算法中的复杂情况。