夏至日的计算公式

夏至日并不固定在一年的阴历或阳历的某一天,而只能说比较接近于阳历的 6 月20号作用,比如 2016 年的夏至日是就是今天 2016 年阳历的 6月21.

夏至日与具体的年份有关,一个近似的计算公式如下:

YD+CY4

  • Y :年份的后两位,
  • D:常数,0.2422
  • C :世纪常数,21世纪 21.37, 20世纪 22.20
  • L4:表示本世纪经历的闰年数;

2016年夏至日期=[16×0.2422+21.37]-[16/4]=25-4=21,6月21日夏至。
例外:1928年的计算结果加1日。

在C++中,计算两个期之间相差的天数通常会涉及一些期处理技巧,因为单纯的加减运算可能无法准确考虑到每个月份的不同天数。以下是一种手动实现的方式,不依赖于特定库,但比较繁琐: ```cpp #include <iostream> // 定义一个结构体模拟期 struct Date { int day; int month; int year; // 判断是否是闰年 bool is_leap_year() { if (year % 4 != 0) return false; else if (year % 100 == 0) return year % 400 == 0; else return true; } // 计算该月有多少天 int days_in_month() { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; default: // 二月 return is_leap_year() ? 29 : 28; } } }; // 计算两个Date对象之间的天数差 int days_between_dates(Date& startDate, Date& endDate) { int yearsDiff = endDate.year - startDate.year; int monthsDiff = endDate.month - startDate.month; // 如果月份差是负的,则需要考虑上个月的情况 if (monthsDiff < 0) { startDate.month += 12; yearsDiff--; monthsDiff++; } // 然后加上剩余的天数差 int daysDiff = endDate.day - startDate.day; while (daysDiff < 0) { daysDiff += startDate.days_in_month(); startDate.day = 1; startDate.month++; // 考虑闰年的影响 if (startDate.is_leap_year() && startDate.month > 2) { startDate.days_in_month -= 1; // 二月减少一天 } monthsDiff++; if (monthsDiff > 12) { // 滞后的月份超过了12个,需要回到下一年 startDate.year++; monthsDiff -= 12; } } return yearsDiff * 365 + (yearsDiff / 4) - (yearsDiff / 100) + (yearsDiff / 400) + monthsDiff * 30 + daysDiff; } int main() { // 创建期对象并设置初始值 Date date1 = {1, 7, 1921}; Date date2 = {1, 1, 2020}; int difference = days_between_dates(date1, date2); std::cout << "相差了 " << difference << " 天.\n"; return 0; } ``` 注意,这个示例仅适用于公历,且不考虑季节变化(如冬至夏至等)。在实际应用中,可能需要引入更复杂的期处理库来获得更准确的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值