当前位置: 首页 > news >正文

关于日期的一些计算

闰年的判断方法

在我们目前使用的格里高利历(Gregorian Calendar)中,闰年的确定遵循着一套精确的规则,具体来说,这些规则如下:

  • 任何能被4整除的年份通常被认为是闰年。这意味着每四年,我们会增加一天,即2月29日,使得该年有366天而非常规的365天。
  • 如果一个年份能被100整除,那么它通常不被认定为闰年,但是它既能被100整除,同时也能被400整除,那么它就是闰年。

以2000年和1900年为例,2000年是闰年,因为它能被400整除(2000 ÷ 400 = 5),而1900年虽然能被100整除(1900 ÷ 100 = 19),但不能被400整除(1900 ÷ 400 ≠ 整数),因此1900年不是闰年。

bool isLeapYear(int year) { return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); }

给定年份的某个月有几天

主要涉及到闰年要调整2月份的天数

int daysInMonth(int year, int month) {assert(month >= 1 && month <= 12);  // 月份范围检查// 每个月的天数(非闰年)const int daysInMonthTable[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 判断是否为闰年if (month == 2 && isLeapYear(year)) {return 29;} else {return daysInMonthTable[month];}
}

判断给定的日期是给定年份的第几天

要计算给定的日期是给定年份的第几天,可以遍历从1月到给定月份之前的所有月份,累加每个月的天数到dayOfYear,最后,将给定月份的天数加到dayOfYear上即可。要特别注意2月,因为闰年和平年的天数不同,在累加月份天数时,如果年份是闰年且当前月份是2月,则2月有29天;否则,2月有28天。

int dayOfYear(int year, int month, int day) {int doy = 0;for (int m = 1; m < month; ++m) doy += daysInMonth(year, m);doy += day;return doy;
}

判断给定的日期是星期几

要判断给定日期是星期几,可以使用蔡勒公式(Zeller’s Congruence)。该公式通过数学计算将日期转换为星期几,适用于格里高利历(公历)。以下是实现步骤:

  • 调整月份和年份:例如,2020年1月转换为2019年13月,以便公式处理。
  • 分解年份:将年份分解为世纪数J和后两位K,如2023年分解为J=20,K=23。
  • 蔡勒公式计算:公式中的各项计算对应日期参数,最终结果h取模7得到0-6的值,分别对应星期六到星期五。
int dayOfWeek(int year, int month, int day) {// 处理1月和2月,视为上一年的13月和14月if (month < 3) {month += 12;year--;}// 分解年份为世纪数(J)和年份后两位(K)int j = year / 100, k = year % 100;// 蔡勒公式计算int h = (day + (13 * (month + 1)) / 5 + k + (k / 4) + (j / 4) + 5 * j) % 7;return (h == 0) ? 6 : (h == 1) ? 7 : h - 1;  // 转换为ISO星期(周一=1)
}

不过,蔡勒公式只适合于1582年(中国明朝万历十年)10月15日之后的情形。

判断当前日期为当前年份周数

在中国,周数的计算通常遵循以下规则:

  • 每周从星期一开始,到星期日结束;
  • 1月1日所在的周通常被认为是第1周;
int week(int year, int month, int day) {int daysOfRemain = dayOfYear(year, month, day) - (7 - dayOfWeek(year, 1, 1) + 1);if (daysOfRemain == 0) {return 1;}int week = std::ceil(static_cast<double>(daysOfRemain) / 7);return week + 1;
}
http://www.xdnf.cn/news/103213.html

相关文章:

  • 0-1背包的运算规则
  • 《重塑AI应用架构》系列: Serverless与MCP融合创新,构建AI应用全新智能中枢
  • (09)Vue脚手架的使用(Vite、vue-cli、create-vue)
  • 利用Python爬虫实现百度图片搜索的PNG图片下载
  • C++ 中 std::thread 的高级应用
  • [实战]zynq7000设备树自动导出GPIO
  • 基于 Spring Boot 瑞吉外卖系统开发(六)
  • ElasticSearch深入解析(三):Elasticsearch 7的安装与配置、Kibana安装
  • spark和Hadoop之间的对比与联系
  • 确保电力作业安全:安全工器具的检查与使用指南
  • 比较:AWS VPC peering与 AWS Transit Gateway
  • 云原生后端架构:重塑后端开发的新范式
  • Linux服务器:在ufw防火墙设置这套规则sudo ufw allow from 172.0.0.0/8,为什么容器就可以访问宿主机的服务了?
  • ReAct Agent 实战:基于DeepSeek从0到1实现大模型Agent的探索模式
  • leetcode-哈希表
  • 容器修仙传 我的灵根是Pod 第8章 护山大阵(DaemonSet)
  • React-实现切换tab高亮显示和排序
  • 【Python爬虫详解】第四篇:使用解析库提取网页数据——BeautifuSoup
  • 240423 leetcode exercises
  • 【Java】HQL查询初步
  • AI健康小屋:解锁健康管理新密码
  • node.js 实战——(概念以及Buffer 知识点学习)
  • AndroidAutomotive模块介绍(四)VehicleHal介绍
  • Minio Linux 安装 systemctl启动配置
  • “信号魔方”大扭转RS232 瞬变 PROFINET 激活交通脉络
  • 文件属性隐写
  • else if 在 C 语言中的使用
  • OJ笔试强训_25至48天_每天三道OJ
  • Vscode已经打开的python项目,如何使用已经建立的虚拟环境
  • TFTP服务调试