Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算C中x天后的日期_C_Date_Days_Real Time Clock - Fatal编程技术网

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

如何计算C中x天后的日期,c,date,days,real-time-clock,C,Date,Days,Real Time Clock,我正在用C语言编程一个微控制器,它有一个内部RTC并自动增加一个日计数器(0-65536)。因此,考虑到用户调整的初始日期(DD/MM/YYYY),我需要根据该计数器更新日历。也就是说,我需要知道如何计算x天后的日期。有人知道这方面的算法吗?在网上找不到任何东西 提前谢谢。 丹尼尔检查一下这个。也许它需要一些调整。有些蛮力,但速度应该足够,即使是微控制器 #include <stdio.h> static int days_in_month[] = { 0, 31, 28, 31,

我正在用C语言编程一个微控制器,它有一个内部RTC并自动增加一个日计数器(0-65536)。因此,考虑到用户调整的初始日期(DD/MM/YYYY),我需要根据该计数器更新日历。也就是说,我需要知道如何计算x天后的日期。有人知道这方面的算法吗?在网上找不到任何东西

提前谢谢。
丹尼尔检查一下这个。也许它需要一些调整。有些蛮力,但速度应该足够,即使是微控制器

#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;
}
#包括
每月[]内的静态整数天={0,31,28,31,30,31,31,31,30,31,30,31};
整数日、月、年;
未签名的短日计数器;
int是_leap(int y){
返回((y%4==0&&y%100!=0)| | y%400==0);
}
翌日
{
天数+=1;天数+计数器++;
如果(天>月内天[月]){
日=1;
月份+=1;
如果(月份>12){
月=1;
年份+=1;
如果(是闰年){
月内天数[2]=29;
}否则{
月内天数[2]=28;
}
}
}
}
设置日期(整数d、整数m、整数y)
{
m<1?m=1:0;
m>12?m=12:0;
d<1?d=1:0;
d>月内天数[m]?d=月内天数[m]:0;
if(is_leap(y)){
月内天数[2]=29;
}否则{
月内天数[2]=28;
}
d=d;
月=m;
年份=y;
}
跳过天数(整数x)
{
int i;
对于(i=0;i,正如@moooeeep在同一问题中所建议的

为了清晰和正确,您应该坚持现有的解决方案

#包括
#包括
int main()
{        
/*初始化*/
int y=1980,m=2,d=5;
struct tm t={.tm_year=y-1900,/*自1900年以来的年数*/
.tm_mon=m-1,/*个月,范围0到11*/
.tm_mday=d};
/*修改*/
t、 tm_mday+=40;
mktime&t;
/*显示结果*/
printf(“%s”,asctime(&t));/*打印日期:1980年3月16日星期日00:00:00*/
返回0;
}

除非项目要求RTC也应以月份和日期作为种子,否则我建议跳过月份和日期,并以1月1日和请求的年份作为RTC种子。这样计算起来会简单得多,而且您只需要记录年份,这样就可以在那里节省几个字节。据我所知,跳过会很困难仅用于初始日期设置,然后每天仅用于下一天()将被执行。关于效率-在16MHz微控制器上跳过100万次10000天大约需要1.5秒。这不是非常严重。您的答案是否包括闰年校正?但这似乎不能正确处理闰年。例如,在本例中,闰年(2016年)/如果加上一天,2月28日将改为2016年3月1日。正确答案当然是2016年2月29日。
#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;
}