好累的一天。

早上很早就起来。中午还是没有睡觉的机会,下午一下午的课。晚上还得早睡。明天 早上还是有课。

 至于今天的收获,主要是打开了几个flex工程看了下样例。

<think>我们被要求提供判断某一天是星期几的方法。根据引用,有多种方法,包括使用公式计算(引用[1]和[3])以及使用编程语言内置函数(引用[2]和[4])。下面将分别介绍这两种思路: ### 一、使用公式计算(适用于任何编程语言或手算) 引用[1]提到有很多计算公式,而引用[3]给出了一个C语言的实现。其核心思想是计算给定日期与某个已知星期几的日期(如公元1年1月1日是星期一)之间的天数差,然后对7取模得到星期几(0代表星期日,1代表星期一,...,6代表星期六,注意不同实现可能有不同约定)。 基姆拉尔森计算公式(Kim larsen calculation formula)是一种常见的星期计算公式: $$ \text{week} = (d + 2m + 3(m+1)/5 + y + y/4 - y/100 + y/400) \mod 7 $$ 其中: - $y$ 表示年份(注意,若月份为1月或2月,则需看作前一年的13月和14月,即$y$要减1) - $m$ 表示月份(3月为1,4月为2,...,12月为10,1月为11,2月为12) - $d$ 表示日 - 计算结果取整,week的值从0到6,分别对应星期日到星期六(或根据公式调整,有时0对应星期一,需注意公式约定) 另一种更直观的方法(如引用[3]的C代码)是: 1. 计算从公元1年1月1日(假设为星期一)到目标日期的总天数。 2. 总天数对7取余,余数即为星期几(注意:1年1月1日对应的余数,需要根据实际情况调整)。 引用[3]的代码就是采用累加天数的方法: - 先累加从1年到目标年份前一年的天数(闰年366天,平年365天) - 然后累加目标年份1月到目标月份前一月的天数(注意2月闰年29天) - 最后加上目标日期的天数 - 总和模7(在引用[3]中直接返回sumDay%7,但注意1年1月1日应该是星期一,而总天数可能从0开始,需要调整) 注意:在引用[3]的代码中,返回0代表星期日,1代表星期一,...,6代表星期六(因为公元1年1月1日设为星期一,那么总天数模7为0对应星期日?这里需要验证。实际中,我们通常需要知道一个参考点,比如已知1900年1月1日是星期一,然后计算与1900年1月1日的天数差)。 ### 二、使用编程语言内置函数(推荐,避免复杂计算) 引用[2]和[4]展示了JavaScript中使用Date对象的方法: 1. 创建一个Date对象,设置年月日。 2. 使用`getDay()`方法,返回0(星期日)到6(星期六)的数字。 例如引用[4]中的函数: ```javascript function oneDay(y,m,d){ var myDate=new Date(); myDate.setFullYear(y,m-1,d); // 月份0-11代表1-12月 var week = myDate.getDay(); // 然后转换为星期几的字符串 } ``` 在C语言中,可以使用标准库的`tm`结构和`mktime`函数: ```c #include <stdio.h> #include <time.h> int main() { struct tm time_struct = {0}; // 初始化结构体 time_struct.tm_year = 2024 - 1900; // 年份从1900开始计算 time_struct.tm_mon = 4; // 月份0-11,4代表5月 time_struct.tm_mday = 15; // 日期 time_t t = mktime(&time_struct); // 转换成time_t // 然后使用localtime_r或localtime得到星期几 struct tm *result = localtime(&t); int weekday = result->tm_wday; // 0代表星期日,1代表星期一,...,6代表星期六 printf("星期%d\n", weekday == 0 ? 7 : weekday); // 如果想让星期一为1,星期日为7,可以这样调整 return 0; } ``` ### 三、手算方法(蔡勒公式) 蔡勒公式(Zeller's congruence)是另一种常用公式: $$ h = \left( q + \left\lfloor \frac{13(m+1)}{5} \right\rfloor + K + \left\lfloor \frac{K}{4} \right\rfloor + \left\lfloor \frac{J}{4} \right\rfloor - 2J \right) \mod 7 $$ 其中: - $h$ 是星期(0=星期六,1=星期日,2=星期一,...,6=星期五?注意不同版本可能有差异,这里以常见版本说明) - $q$ 是日 - $m$ 是月份(3=3月,4=4月,...,14=2月,即1月和2月看作前一年的13月和14月) - $K$ 是年份后两位(即年份 mod 100) - $J$ 是世纪数(即年份前两位,如2024年的J=20,K=24) - 注意:如果月份是1月或2月,年份要减1(即2021年1月要看作2020年13月) 计算结果h取模后,再根据h的值确定星期几。通常调整后:0表示星期六,1表示星期日,2表示星期一,...,6表示星期五?但需要验证。 ### 总结 - **公式法**:通用,但需要处理闰年、月份等细节,适用于没有内置日期函数的语言环境。 - **内置函数法**:简单可靠,推荐在编程中使用。 - **手算公式**:可用于心算或理解原理。 §§相关问题§§ 1. 如何计算两个日期之间的天数差? 2. 闰年的判断规则是什么? 3. 如何在Excel中计算某一天是星期几? </think>### 判断某一天是星期几的方法 以下是几种常用的计算方法,分为公式法、编程实现和工具法三类: --- #### 一、公式法(通用数学计算) 基姆拉尔森计算公式(适用于公历日期): $$ \text{week} = \left( d + 2m + \frac{3(m+1)}{5} + y + \frac{y}{4} - \frac{y}{100} + \frac{y}{400} \right) \mod 7 $$ 其中: - $y$:年份(若月份为1或2,需看作前一年的13或14月,如2023年1月→2022年13月) - $m$:月份($3 \leq m \leq 14$) - $d$:日 - **结果说明**:计算结果为0~6,分别对应 **星期六至星期五**(0=周六,1=周日,2=周一,...,6=周五) **示例**:计算2023年10月1日 $y=2023, m=10, d=1$ $$ \text{week} = (1 + 2\times10 + \frac{3(10+1)}{5} + 2023 + \frac{2023}{4} - \frac{2023}{100} + \frac{2023}{400}) \mod 7 = 0 $$ 对应 **星期六**(与实际一致)[^1]。 --- #### 二、编程实现 ##### 1. C语言(逐日累加法) ```c #include <stdio.h> int get_weekday(int year, int month, int day) { int days = 0; for (int y = 1; y < year; y++) { // 累加年份天数 if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) days += 366; else days += 365; } for (int m = 1; m < month; m++) { // 累加月份天数 if(m == 2) { if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) days += 29; else days += 28; } else if(m == 4 || m == 6 || m == 9 || m == 11) days += 30; else days += 31; } days += day; // 加上当月天数 return days % 7; // 0=周日,1=周一,...,6=周六 } int main() { int weekday = get_weekday(2023, 10, 1); printf("Result: %d (0=Sunday)\n", weekday); // 输出0(星期日) return 0; } ``` > **说明**:返回值为0~6,对应周日到周六[^3]。 ##### 2. JavaScript(内置日期对象) ```javascript function getWeekday(y, m, d) { const date = new Date(y, m-1, d); // 月份需-1(0=Jan) const week = date.getDay(); // 返回0~6(0=周日) const weekNames = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]; return weekNames[week]; } console.log(getWeekday(2023, 10, 1)); // 输出"周日" ``` > **优势**:无需考虑闰年等细节,直接调用API[^4]。 --- #### 三、工具法 1. **Excel/Google Sheets** 公式:`=TEXT(DATE(2023,10,1),"aaaa")` → 返回"星期日" 2. **在线计算器** 如 [TimeandDate](https://www.timeanddate.com/) 输入日期自动计算星期 --- ### 方法对比 | **方法** | 精度 | 复杂度 | 适用场景 | |----------------|------------|--------|------------------------| | 数学公式 | 高 | 高 | 手算/无编程环境 | | C语言实现 | 高 | 中 | 嵌入式系统/底层开发 | | JavaScript API | 高 | 低 | 网页/快速开发 | | Excel工具 | 高 | 低 | 办公场景 | > **关键点**:所有方法均依赖 **格里高利历法规则**,需注意1582年10月之前的日期需用儒略历[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值