找回密码
 立即注册
查看: 272|回复: 1

求日历距今天数算法

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:436
  • 最近打卡:2025-05-03 09:53:06
已绑定手机

229

主题

328

回帖

1479

积分

金牌会员

积分
1479
发表于 2024-6-29 20:11:46 | 显示全部楼层 |阅读模式
随便指定某一天包括年份在内计算出距离今天的天数算法,能具有计算未来天数和过去的天数的能力。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:524
  • 最近打卡:2025-05-04 02:13:29

10

主题

1161

回帖

5133

积分

论坛元老

积分
5133
发表于 2024-6-30 18:43:07 | 显示全部楼层
本帖最后由 angmall 于 2024-6-30 18:54 编辑

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


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

### 示例代码

  1. #include <stdio.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. typedef  int s16;
  5. u8 is_leap_year(u16 year) {
  6.     return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
  7. }
  8. u16 days_in_month(u16 year, u8 month) {
  9.     static const u8 days_in_months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  10.     if (month == 2 && is_leap_year(year)) {
  11.         return 29;
  12.     }
  13.     return days_in_months[month - 1];
  14. }
  15. u16 days_from_epoch(u16 year, u8 month, u8 day) {
  16.     u16 days = day;
  17.     u16 y;
  18.     for (y = 0; y < year; ++y) {
  19.         days += is_leap_year(y) ? 366 : 365;
  20.     }
  21.     for (u8 m = 1; m < month; ++m) {
  22.         days += days_in_month(year, m);
  23.     }
  24.     return days;
  25. }
  26. s16 days_between(u16 year1, u8 month1, u8 day1, u16 year2, u8 month2, u8 day2) {
  27.     return days_from_epoch(year2, month2, day2) - days_from_epoch(year1, month1, day1);
  28. }
  29. void main() {
  30.     u16 year, current_year;
  31.     u8 month, day, current_month, current_day;
  32.    
  33.     // 输入指定日期
  34.     printf("输入指定日期 (年 月 日): ");
  35.     scanf("%u %hhu %hhu", &year, &month, &day);
  36.     // 获取当前日期(模拟)
  37.     current_year = 2024;
  38.     current_month = 6;
  39.     current_day = 27;
  40.     // 计算天数差
  41.     s16 diff = days_between(current_year, current_month, current_day, year, month, day);
  42.     printf("指定日期与今天相差 %d 天\n", diff);
  43. }
复制代码



### 代码解释


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 反对 0

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 04:06 , Processed in 0.134758 second(s), 51 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表