C#如何获取指定周的日期范围

本文介绍了一种计算每年各周起止日期的方法,并提供了两种不同情况下的C#实现:一种是不允许周跨越年度的情况,另一种是允许年末的最后一周跨越到下一年的情况。通过具体的代码示例展示了如何计算指定年份中特定周的起始与结束日期。

1. 不允许跨年

  1) 第一周的第一天从每年的第一天开始,最后一周的最后一天为每年的最后一天

static void Main(string[] args)
{
    DateTime first, last;
    int[] years = new int[] { 2015, 2016, 2017, 2018 };
    int[] weeks = new int[] { 1, 52, 53 };
    foreach (int y in years)
    {
        foreach (int w in weeks)
        {
            bool result = CalcWeekDay(y, w, out first, out last);
            Console.WriteLine("{0}第{1}周({2:yyyy-MM-dd} ~ {3:yyyy-MM-dd}) --{4}", y, w, first, last, result);
        }
        Console.WriteLine();
    }
}
 
public static bool CalcWeekDay(int year, int week, out DateTime first, out DateTime last)
{
    first = DateTime.MinValue;
    last = DateTime.MinValue;
    //年份超限
    if (year < 1700 || year > 9999) return false;
    //周数错误
    if (week < 1 || week > 53) return false;
    //指定年范围
    DateTime start = new DateTime(year, 1, 1);
    DateTime end = new DateTime(year, 12, 31);
    int startWeekDay = (int)start.DayOfWeek;
 
    if (week == 1)
    {
        first = start;
        last = start.AddDays(6 - startWeekDay);
    }
    else
    {
        //周的起始日期
        first = start.AddDays((7 - startWeekDay) + (week - 2) * 7);
        last = first.AddDays(6);
        if (last > end)
        {
            last = end;
        }
    }
    return (first <= end);
}

2) 程序执行结果

 blob.png


2. 允许跨年

  1) 每年的尾周剩余天数计入下一年第一周

public static bool CalcWeekDay(int year, int week, out DateTime first, out DateTime last)
{
    first = DateTime.MinValue;
    last = DateTime.MinValue;
    //年份超限
    if (year < 1700 || year > 9999) return false;
    //周数错误
    if (week < 1 || week > 53) return false;
    //指定年范围
    DateTime start = new DateTime(year, 1, 1);
    DateTime end = new DateTime(year, 12, 31);
    int startWeekDay = (int)start.DayOfWeek;
    //周的起始日期
    first = start.AddDays((7 - startWeekDay) + (week - 2) * 7);
    last = first.AddDays(6);
    //结束日期跨年
    return (last <= end);
}


2) 程序执行结果
 blob.png 

C#中,根据年份和计算对应的日期范围(即该的起始日和结束日),需要考虑一些关键因素,如一的起始日(通常是一或周日)以及不同文化区域对数的定义。可以通过`DateTime`结构和`Calendar`类实现这一功能。 以下是一个完整的示例方法,用于根据指定年份和计算出该的开始和结束日: ```csharp using System; using System.Globalization; public class WeekCalculator { public static void GetWeekStartDateEndDate(int year, int weekOfYear, out DateTime startOfWeek, out DateTime endOfWeek) { // 获取指定年份的1月1日 DateTime jan1 = new DateTime(year, 1, 1); // 根据当前文化信息确定一的开始是几 int firstDayOfWeek = (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; // 计算jan1是几 int dayOfWeekJan1 = (int)jan1.DayOfWeek; // 计算1月1日所在是否为第1的一部分 int daysOffset = (firstDayOfWeek - dayOfWeekJan1 + 7) % 7; DateTime firstWeekMonday = jan1.AddDays(daysOffset); // 如果指定数是第1,但1月1日所在属于上一年的第53,则调整 if (weekOfYear == 1 && jan1.AddDays(6).Year < year) { firstWeekMonday = firstWeekMonday.AddDays(7); } // 计算目标一 DateTime targetMonday = firstWeekMonday.AddDays((weekOfYear - 1) * 7); // 开始日为该一,结束日周日 startOfWeek = targetMonday; endOfWeek = targetMonday.AddDays(6); } public static void Main() { int year = 2024; int week = 10; GetWeekStartDateEndDate(year, week, out DateTime start, out DateTime end); Console.WriteLine($"{year}年第{week} : {start:yyyy年MM月dd日} ~ {end:yyyy年MM月dd日}"); } } ``` ### 说明 1. 该方法首先确定指定年份的第一天是星几,并据此计算出第一一。 2. 如果某年的1月1日所在被视为上一年的最后一(如ISO 8601标准下),则进行调整。 3. 根据指定数,计算出该一,并将开始日设为一,结束日设为周日。 4. 输出格式化为`yyyy年MM月dd日`,并按照`"第X : yyyy年MM月dd日 ~ yyyy年MM月dd日"`格式输出。 ### 日期范围示例 假设输入年份为`2024`,数为`10`,则输出为: ``` 2024年第10 : 2024年03月04日 ~ 2024年03月10日 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值