計算下一天日期需處理:月份天數差異、閏年判斷、年末跨年邊界條件。
// 閏年條件:能被4整除但不能被100整除,或能被400整除
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 閏年二月調整為29天
if (isLeapYear(year)) daysInMonth[1] = 29;
#include <stdio.h>
#include <stdbool.h>
bool isValidDate(int y, int m, int d) {
if (m < 1 || m > 12 || d < 1) return false;
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(y)) days[1] = 29;
return d <= days[m-1];
}
void nextDay(int y, int m, int d, int *ny, int *nm, int *nd) {
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(y)) days[1] = 29;
d++;
if (d > days[m-1]) {
d = 1;
m++;
if (m > 12) {
m = 1;
y++;
}
}
*ny = y; *nm = m; *nd = d;
}
int main() {
int y, m, d, ny, nm, nd;
printf("輸入日期 (年 月 日): ");
scanf("%d %d %d", &y, &m, &d);
if (!isValidDate(y, m, d)) {
printf("日期非法!\n");
return 1;
}
nextDay(y, m, d, &ny, &nm, &nd);
printf("隔天日期: %04d-%02d-%02d\n", ny, nm, nd);
return 0;
}
| 輸入 | 輸出 | 說明 |
|---|---|---|
| 2023 12 31 | 2024-01-01 | 跨年 |
| 2024 02 28 | 2024-02-29 | 閏年二月 |
| 2023 02 28 | 2023-03-01 | 平年二月 |
| 2024 01 31 | 2024-02-01 | 大月結束 |
| 2024 04 30 | 2024-05-01 | 小月結束 |
可封裝為 Date 結構體,實現日期加減運算、星期計算(蔡勒公式)、日期差值等功能,構建完整日期時間庫。