我正在用 C 语言编写一个具有内部 RTC 并自动递增日计数器(0-65536)的微控制器。因此,鉴于用户调整的初始日期(DD/MM/YYYY),我需要根据该计数器更新日历。也就是说,我需要知道如何计算 x 天后的日期。有谁知道这个算法?在网上找不到任何东西。
提前致谢。丹尼尔
我正在用 C 语言编写一个具有内部 RTC 并自动递增日计数器(0-65536)的微控制器。因此,鉴于用户调整的初始日期(DD/MM/YYYY),我需要根据该计数器更新日历。也就是说,我需要知道如何计算 x 天后的日期。有谁知道这个算法?在网上找不到任何东西。
提前致谢。丹尼尔
正如@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;
}
检查这个。也许它需要一些调整。有点蛮力,但即使对于微控制器,速度也应该足够了。
#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;
}