C语言实现日期和一年中的天数的相互转化

 
#include <stdio.h>

static char daytab[2][13]= {
	{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
	{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

/************************************************************************/
/* day_of_year : set day of year from month & day 
/************************************************************************/
int day_of_year(int year, int month, int day){
	int i, leap;

	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

	for (i = 1; i < month ; i++) {
		day += daytab[leap][i];
	}
	return day;
}

/************************************************************************/
/* set month, day from day of year
/************************************************************************/
void month_day(int year, int yearday, int *pmonth, int *pday){
	int i, leap;

	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
	for (i = 1; yearday > daytab[leap][i]; i ++) {
		yearday -= daytab[leap][i];
	}
	*pmonth = i;
	*pday = yearday;
}

int main(){
	int month, day;
	printf("%d\n", day_of_year(2011, 9, 29));
	
	month_day(2011, 272, &month, &day);
	printf("%d\t%d\n", month, day);
	return 0;
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将公历日期转换为农历日期,需要使用农历算法。以下是一个基于以下假设的简单算法: 1. 农历1900年正月初一是公历1900年1月31日。 2. 农历每年有12个月,每个月有29或30天。 3. 农历闰月可能存在,而且可能在1月到12月之间的任何一个月。 4. 农历闰月的月份和闰月的天数可以通过一定的计算得到。 根据这个算法,以下是将公历日期转换为农历日期C语言代码示例: ```c #include <stdio.h> // 通过公历年份计算该年份对应的农历年份 int getLunarYear(int year) { return year - 1900 + 36; } // 判断指定公历年份是否为闰年 int isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; } // 计算指定公历年份指定月份的天数 int getDaysOfMonth(int year, int month) { static const int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (month == 2 && isLeapYear(year)) { return 29; } else { return days[month - 1]; } } // 计算指定公历日期对应的累计天数 int getDaysSince1900(int year, int month, int day) { int days = 0; for (int y = 1900; y < year; ++y) { days += isLeapYear(y) ? 366 : 365; } for (int m = 1; m < month; ++m) { days += getDaysOfMonth(year, m); } days += day - 1; return days; } // 计算指定公历月份的闰月月份和闰月天数 void getLunarLeapMonth(int year, int* leapMonth, int* leapDays) { // 农历每19年有7个闰月 static const int leapMonths[19] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; *leapMonth = leapMonths[year % 19]; if (*leapMonth == 0) { *leapDays = 0; } else if (*leapMonth <= 12) { // 闰月在前面,闰月天数等于前一个月的天数 *leapDays = getDaysOfMonth(year, *leapMonth) == 29 ? 29 : 30; } else { // 闰月在后面,闰月天数等于后一个月的天数 *leapDays = getDaysOfMonth(year, *leapMonth - 1) == 29 ? 30 : 29; } } // 将指定公历日期转换为农历日期 void convertToLunar(int year, int month, int day, int* lunarYear, int* lunarMonth, int* lunarDay) { int daysSince1900 = getDaysSince1900(year, month, day); int lunarDays = daysSince1900 + 49; // 基准日是1900年1月31日,加上偏移量49天 int lunarYearDays = 0; int i; for (i = 1900; lunarDays > 0; ++i) { lunarYearDays = isLeapYear(i) ? 366 : 365; if (lunarDays >= lunarYearDays) { lunarDays -= lunarYearDays; } else { break; } } *lunarYear = getLunarYear(i - 1); int leapMonth, leapDays; getLunarLeapMonth(*lunarYear, &leapMonth, &leapDays); int j; for (j = 1; j <= 12; ++j) { int monthDays = getDaysOfMonth(i - 1, j); if (j == leapMonth) { monthDays = leapDays; } if (lunarDays >= monthDays) { lunarDays -= monthDays; } else { break; } } *lunarMonth = j; *lunarDay = lunarDays + 1; } int main() { int year = 2021, month = 4, day = 13; int lunarYear, lunarMonth, lunarDay; convertToLunar(year, month, day, &lunarYear, &lunarMonth, &lunarDay); printf("%d年%d月%d日是农历%d年%d月%d日\n", year, month, day, lunarYear, lunarMonth, lunarDay); return 0; } ``` 在这个示例,`convertToLunar`函数接受一个公历日期,计算出对应的农历日期并存储在输出参数。可以更改`year`、`month`和`day`变量以测试不同的日期
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值