QQ624353765 发表于 2024-6-29 20:11:46

求日历距今天数算法

随便指定某一天包括年份在内计算出距离今天的天数算法,能具有计算未来天数和过去的天数的能力。

angmall 发表于 2024-6-30 18:43:07

本帖最后由 angmall 于 2024-6-30 18:54 编辑

在51单片机上实现一个计算给定日期与当前日期之间的天数差的算法,可以通过简化的日期计算方法来实现。由于51单片机的资源有限,我们不能使用标准库函数,而需要手动编写日期计算函数。


下面是一个示例程序,该程序计算给定日期与当前日期之间的天数差:

### 示例代码


#include <stdio.h>

typedef unsigned char u8;
typedef unsigned int u16;
typedefint s16;

u8 is_leap_year(u16 year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

u16 days_in_month(u16 year, u8 month) {
    static const u8 days_in_months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 2 && is_leap_year(year)) {
      return 29;
    }
    return days_in_months;
}

u16 days_from_epoch(u16 year, u8 month, u8 day) {
    u16 days = day;
    u16 y;
    for (y = 0; y < year; ++y) {
      days += is_leap_year(y) ? 366 : 365;
    }
    for (u8 m = 1; m < month; ++m) {
      days += days_in_month(year, m);
    }
    return days;
}

s16 days_between(u16 year1, u8 month1, u8 day1, u16 year2, u8 month2, u8 day2) {
    return days_from_epoch(year2, month2, day2) - days_from_epoch(year1, month1, day1);
}

void main() {
    u16 year, current_year;
    u8 month, day, current_month, current_day;
   
    // 输入指定日期
    printf("输入指定日期 (年 月 日): ");
    scanf("%u %hhu %hhu", &year, &month, &day);

    // 获取当前日期(模拟)
    current_year = 2024;
    current_month = 6;
    current_day = 27;

    // 计算天数差
    s16 diff = days_between(current_year, current_month, current_day, year, month, day);
    printf("指定日期与今天相差 %d 天\n", diff);
}



### 代码解释


1. **`is_leap_year` 函数**:
   - 判断给定年份是否是闰年。


2. **`days_in_month` 函数**:
   - 返回给定年份和月份的天数。
   - 考虑到2月的闰年情况。


3. **`days_from_epoch` 函数**:
   - 计算从公元0年1月1日到指定日期的总天数。
   - 累积每年的天数,考虑闰年。
   - 累积每个月的天数,考虑当前年的闰年情况。


4. **`days_between` 函数**:
   - 计算两个日期之间的天数差值。


5. **`main` 函数**:
   - 模拟输入指定日期和当前日期。
   - 调用 `days_between` 函数计算两个日期之间的天数差值,并输出结果。


### 注意事项


1. 该代码假设输入的日期是有效的。
2. 在实际应用中,可以从外部模块或系统中获取当前日期。
3. `scanf` 和 `printf` 是 C 标准库函数,如果在51单片机上使用需要确保标准库的支持,或者使用单片机特定的输入输出函数。




页: [1]
查看完整版本: 求日历距今天数算法