取某一天是该月的第几周

   

 //取得某dd天在某mm月份是第几周 (c#)

 protected int WeekOfMonth(int yyyy,int mm, int dd)
    {
        DateTime FirstDay = new DateTime(yyyy, mm, 1);
        DateTime OneDay = new DateTime(yyyy, mm, dd);
        int FirstWeek = (int)FirstDay.DayOfWeek;
        int Week = dd - 1 + FirstWeek;
        return (Week / 7) + 1;
    }
 

要计算给定日期是一年中的第几天,你可以使用Zeller's congruence算法或者更现代的方法,如直接调用C标准库函数`mktime()`。这里我将介绍Zeller's congruence算法,这是一种古老但有效的方法。 Zeller's congruence算法步骤如下: 1. 将年份转换为世纪数(整数),例如2023年就是21世纪。 2. 计算月份的值(从3开始计数): - 如果是2(非闰年),则为2=0;如果是闰年,则为2=1。 3. 初始化其他变量: - `day`:给定的日期 - `month`:经过调整后的月份 - `century`:世纪数 - `divisor`:根据世纪和是否是闰年来确定的除数 - `hundreds`:当前年份的百位数(对于公元后,即100、200等) - `thousands`:当前年份的千位数(比如1000年是1) 4. 应用Zeller's congruence公式: ``` q = day + ((13 * (month + 1)) / 5) + hundreds + (thousands * century) m = (q % 7) + 1 ``` 5. 如果m大于7,那么这一天实际上是上一年的天数加上一周的天数(7)减去1,因为一周的第一天是星期日(我们通常认为1号是第一天)。 下面是一个简单的C函数实现这个算法: ```c #include <stdio.h> int zellers_congruence(int year, int month, int day) { int century = year / 100; year %= 100; // 获取个位和十位 if(month == 2 && !((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)))) { // 非闰年的2 month = 1; } else if(month == 2) { // 闰年的2 month = 2; } int q = day + (13 * (month + 1)) / 5 + (year / 100) + year; int m = q % 7 + 1; if(m > 7) { return (zellers_congruence(year - 1, 12, 31) + m - 8); } else { return m; } } int main() { int year, month, day; printf("Enter the date (YYYY-MM-DD): "); scanf("%d-%d-%d", &year, &month, &day); int day_of_year = zellers_congruence(year, month, day); printf("The given date is the %dth day of the year.\n", day_of_year); return 0; } ``` 请注意,这个方法并不适用于所有的日期,特别是涉及到世纪过渡或闰年的复杂情况时。如果需要精确无误的结果,建议使用`mktime()`函数或其他现代库函数。此外,此算法不处理每的总天数差异(如二有28天或29天)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值