如何在C语言中计算x天后的日期

4
我正在使用C语言编程一款具有内部RTC并自动递增日期计数器(0-65536)的微控制器。因此,根据用户调整的初始日期(DD/MM/YYYY),我需要根据该计数器保持日历更新。也就是说,我需要知道如何计算x天后的日期。有人知道这方面的算法吗?在网上找不到任何相关信息。
提前感谢。 Daniel

除非项目要求RTC也应该播种月份和日期,否则我建议跳过月份和日期,并以1月1日和所请求的年份播种RTC。这样计数会简单得多,而且你只需要跟踪年份,因此可以节省几个字节。 - Some programmer dude
2个回答

3
如同 @moooeeeep 在他的回答中建议的那样,为了清晰和正确,你应该坚持使用现有的解决方案。
#include <stdio.h>
#include <time.h>

int main()
{        
    /* initialize */
    int y=1980, m=2, d=5;    
    struct tm t = { .tm_year=y-1900, /* The number of years since 1900   */ 
                    .tm_mon=m-1,  /* month, range 0 to 11 */
                    .tm_mday=d };
    /* modify */
    t.tm_mday += 40;
    mktime(&t);
    /* show result */
    printf("%s", asctime(&t)); /* prints: Sun Mar 16 00:00:00 1980 */
    return 0;
}

0

请检查一下。可能需要进行一些调整。有点暴力,但速度应该足够快,即使对于微控制器也是如此。

#include <stdio.h>

static int days_in_month[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int day, month, year;

unsigned short day_counter;

int is_leap(int y) {
    return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0);
}

next_day()
{
    day += 1; day_counter++;
    if (day > days_in_month[month]) {
        day = 1;
        month += 1;
        if (month > 12) {
            month = 1;
            year += 1;
            if (is_leap(year)) {
                days_in_month[2] = 29;
            } else {
                days_in_month[2] = 28;
            }
        }
    }
}

set_date(int d, int m, int y) 
{
    m < 1 ? m = 1 : 0;
    m > 12 ? m = 12 : 0;
    d < 1 ? d = 1 : 0;
    d > days_in_month[m] ? d = days_in_month[m] : 0;
    if (is_leap(y)){
        days_in_month[2] = 29;
    } else {
        days_in_month[2] = 28;
    }
    day = d;
    month = m;
    year = y;
}

skip_days(int x)
{
    int i;
    for (i=0;i<x;i++) next_day();
}

print_date()
{
    printf ("day: %d month: %d year: %d\n", day, month, year);
}

int main(int argc, char **argv)
{
    int i;

    set_date(5, 2, 1980);

    skip_days(10000);
    day_counter = 0;
    /* after this call next_day each day */

    print_date();

    return 0;
}

据我理解,跳过操作仅在初始日期设置时使用,然后每天只执行next_day()函数。关于效率 - 在1600万赫兹的微控制器上,跳过10000天一百万次大约需要1.5秒钟,这并不算极慢。您的回答是否包括闰年校正? - J X
然而,这似乎不能正确处理闰年的日期。例如,在这种情况下,闰年(2016)/2月/28日如果加上一天,将变为2016年3月1日。正确的答案当然是2016年2月29日。 - Mehrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接