简体   繁体   English

如何在C#中获取该年的周开始日期(星期一)和结束日期(星期日)列表

[英]How to get the list of week start date (Monday) and end date (Sunday) for the year in C#

I want to get only weeks for the whole year where I want to get the start date (Monday) and end date (Friday) in C#. For example: 1/52 = 02 Jan (Monday) - 09 Jan (Sunday) 2/52 = 10 Jan (Monday) - 17 Jan (Sunday) and so on.我只想获得全年的几周,我想在 C# 中获得开始日期(星期一)和结束日期(星期五)。例如: 1/52 = 02 Jan (Monday) - 09 Jan (Sunday) 2/52 = 10 Jan (Monday) - 17 Jan (Sunday)等等。 I can get current week dates but no idea how to get for the year.我可以获得当前周的日期,但不知道如何获得这一年的日期。

// We Set the Monday as the first day of the week.
DayOfWeek day = datetime.DayOfWeek;
int days = day - DayOfWeek.Monday;
if (days == -1)
{
    days = 6;  // this is when we have sunday as a DayOfWeek day
}

DateTime start = datetime.AddDays(-days);
DateTime end = start.AddDays(6);

Without making it complicated you can simply use while like below.在不让它变得复杂的情况下,您可以像下面这样简单地使用while

while (datetime.DayOfWeek != DayOfWeek.Monday)
{
    datetime= datetime.AddDays(1);
}

DateTime start = datetime;
DateTime end = start.AddDays(6);

Or you want to find week from the week index 1/52 for any year then write function like below.或者你想从任何year的周索引1/52中找到周,然后像下面这样写 function。 Use it like GetWeek(1, 2020) to get 06.01.2020 - 12.01.2020 .GetWeek(1, 2020)一样使用它来获取06.01.2020 - 12.01.2020 Format it as per your requirement.根据您的要求对其进行格式化。

public DateTime GetNextMonday(DateTime datetime)
{        
    return datetime.AddDays((7 - (int)datetime.DayOfWeek + (int)DayOfWeek.Monday) % 7);
}

public string GetWeek(int week, int year) 
{
    var start = GetNextMonday(new DateTime(year, 1, 1).AddDays((week-1)*7));
    var end = start.AddDays(6);
    return start.ToShortDateString() + " - " + end.ToShortDateString();
}

You can use methods below to calculate start day of any week of any year您可以使用以下方法计算任何一年中任何一周的开始日期

public static DateTime StartOfNthWeekOfYear(int year, int weekNumber, DayOfWeek firstDayOfWeek)
{
    if(weekNumber < 1)
    {
        throw new ArgumentOutOfRangeException(nameof(weekNumber));
    }
    DateTime startOfWeek = StartOfFirstWeekOfYear(year, firstDayOfWeek).AddDays((weekNumber - 1) * 7);
    DateTime endOfWeek = startOfWeek.AddDays(6);
    if(endOfWeek.Year != year || startOfWeek.Year != year)
    {
        throw new ArgumentOutOfRangeException(nameof(weekNumber));
    }
    return startOfWeek;
}

public static DateTime StartOfFirstWeekOfYear(int year, DayOfWeek firstDayOfWeek)
{
    DateTime startOfYear = new DateTime(year, 1, 1);
    if (startOfYear.DayOfWeek != firstDayOfWeek)
    {
        return StartOfWeek(startOfYear, firstDayOfWeek).AddDays(7);
    }
    return startOfYear;
}

public static DateTime StartOfWeek(DateTime value, DayOfWeek firstDayOfWeek)
{
    if (value.DayOfWeek != firstDayOfWeek)
    {
        return value.AddDays(-((7 + (int)value.DayOfWeek - (int)firstDayOfWeek) % 7));
    }
    return value;
}

As far as I have understood, probably this will help, I tried the below and it displayed for me the start and end dates for the specified years:据我所知,这可能会有所帮助,我尝试了以下操作,它为我显示了指定年份的开始和结束日期:

            DateTime starting = new DateTime(2020, 1, 1);
            DateTime ending = new DateTime(2020, 12, 1);
            DateTime currentDay = starting;
            DateTime start = currentDay;
            DateTime end = currentDay;
            while (ending.Year >= currentDay.Year)
            {
                if (currentDay.DayOfWeek == DayOfWeek.Monday)
                {
                    start = currentDay;
                    end = start.AddDays(6);
                    currentDay = end;
                    Console.WriteLine(start + "(" + start.DayOfWeek + ")");
                    Console.WriteLine(end + "(" + end.DayOfWeek + ")");
                }
                else
                {
                    currentDay = currentDay.AddDays(1);
                }
            }

I think this should work for Gregorian calendars and takes into account different cultures:我认为这应该适用于公历并考虑到不同的文化:

public static IList<DateTime> GetFirstDayOfWeekDates(CultureInfo cultureInfo, int year)
{
    var lastDateOfYear = new DateTime(year, 12, 31);
    var firstDate = new DateTime(year, 1, 1);
    var dayOfWeek = cultureInfo.DateTimeFormat.FirstDayOfWeek;

    while (firstDate.DayOfWeek != dayOfWeek)
    {
        firstDate = firstDate.AddDays(1);
    }
        
    var numberOfWeeksInYear = cultureInfo.Calendar.GetWeekOfYear(lastDateOfYear, cultureInfo.DateTimeFormat.CalendarWeekRule, dayOfWeek);

    var firstDayOfWeekDates = new List<DateTime>();
    firstDayOfWeekDates.Add(firstDate);

    var currentDate = firstDate;

    for (int i = 0; i < numberOfWeeksInYear; i++)
    {
        var weekLater = currentDate.AddDays(7);

        if (weekLater.Year == year)
        {
            currentDate = weekLater;
            firstDayOfWeekDates.Add(currentDate);
        }
    }

    return firstDayOfWeekDates;
}

You can test this with a console app like this (make the method static):您可以使用这样的控制台应用程序对此进行测试(使方法静态化):

static void Main(string[] args)
{
    var ci = new CultureInfo("en-GB");

    var dates = GetFirstDayOfWeekDates(ci, DateTime.Now.Year);

    foreach (var dt in dates)
    {
        Console.WriteLine("Date: " + dt.ToShortDateString());
    }

    Console.ReadLine();
}

It brings back the following:它带回以下内容:

在此处输入图像描述

If you want to include the end date of the week as well then you can tweak this slightly by adding a new class called WeekDate:如果您还想包括一周的结束日期,那么您可以通过添加一个名为 WeekDate 的新 class 来稍微调整一下:

public class WeekDate
{
    public DateTime StartOfWeek { get; set; }
    public DateTime EndOfWeek { get; set; }
}

GetFirstDayOfWeekDates then becomes: GetFirstDayOfWeekDates 然后变成:

    public static IList<WeekDate> GetFirstDayOfWeekDates(CultureInfo cultureInfo, int year)
    {
        var lastDateOfYear = new DateTime(year, 12, 31);
        var firstDate = new DateTime(year, 1, 1);
        var dayOfWeek = cultureInfo.DateTimeFormat.FirstDayOfWeek;

        while (firstDate.DayOfWeek != dayOfWeek)
        {
            firstDate = firstDate.AddDays(1);
        }
        
        var numberOfWeeksInYear = cultureInfo.Calendar.GetWeekOfYear(lastDateOfYear, cultureInfo.DateTimeFormat.CalendarWeekRule, dayOfWeek);

        var firstDayOfWeekDates = new List<WeekDate>();
        firstDayOfWeekDates.Add(new WeekDate { StartOfWeek = firstDate, EndOfWeek = firstDate.AddDays(6) });

        var currentDate = firstDate;

        for (int i = 0; i < numberOfWeeksInYear; i++)
        {
            var weekLater = currentDate.AddDays(7);

            if (weekLater.Year == year)
            {
                currentDate = currentDate.AddDays(7);
                firstDayOfWeekDates.Add(new WeekDate { StartOfWeek = currentDate, EndOfWeek = currentDate.AddDays(6) });
            }
        }

        return firstDayOfWeekDates;
    }

Which returns:哪个返回:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何通过使用星期数和年份来获取星期的开始和结束日期并将这些日期插入C#中的mysql表中 - How to get start and end date of week by using week number and year and insert those dates into mysql table in c# 如何使用 SSRS 表达式获取下周星期一日期和下周星期日日期? - How to get Next Week Monday Date and Next Week Sunday Date using SSRS Expresion? 给出C#中的周数和年份,计算一周的开始和结束日期(基于ISO规范) - Calculate the start and end date of a week given the week number and year in C# (based on the ISO specification) 如何确定C#中不同文化中的周开始是星期一或星期日 - How can I determine that the start of week is Monday or Sunday in different culture in C# 从星期几开始的指定日期获取星期数 - Get Week number from a given date when week start on Sunday 如何根据当前日期在 C# 中获取会计年度的开始和结束? - 使用 SSIS 脚本任务 - How to get the start and end of Fiscal Year in C# based on current date? - Using SSIS Script Task 如何在C#中以正确的时间检索当前周的开始日期和结束日期? - How to retrieve start date and end date with correct time for current week in C#? 如何从年,月,月中的星期几和星期几中获取日期? C# - How to get a date from year, month, week of month and Day of week ? C# 获取给定日期的开始周的日期 c# - Get the date of the start week of a given date c# 获取给定周,给定月份和给定周的开始和结束日期 - Get the start and end date of a given week year, given month & given week
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM