列出一年的周数,并注明日期



我一直在为这件事绞尽脑汁,但现在已经是周五晚了,我在兜圈子。

我需要为下拉列表创建工作周的列表,以周数为值。因此代码将输出:

8月22日星期一- 9月26日星期五
8月29日星期一- 9月2日星期五
9月5日星期一- 9月9日星期五

等。

为全年。你知道我该怎么做吗?

谢谢。

我认为下面的代码符合ISO 8601:

var jan1 = new DateTime(DateTime.Today.Year , 1, 1);
//beware different cultures, see other answers
var startOfFirstWeek = jan1.AddDays(1 - (int)(jan1.DayOfWeek));
var weeks=
    Enumerable
        .Range(0,54)
        .Select(i => new {
            weekStart = startOfFirstWeek.AddDays(i * 7)
        })
        .TakeWhile(x => x.weekStart.Year <= jan1.Year)
        .Select(x => new {
            x.weekStart,
            weekFinish=x.weekStart.AddDays(4)
        })
        .SkipWhile(x => x.weekFinish < jan1.AddDays(1) )
        .Select((x,i) => new {
            x.weekStart,
            x.weekFinish,
            weekNum=i+1
        });

请记住,在不同的文化中,周的计算方法是不同的,如果您看到周数为53,则不会有错误!

using System.Globalization;
CultureInfo cultInfo = CultureInfo.CurrentCulture;
int weekNumNow = cultInfo.Calendar.GetWeekOfYear(DateTime.Now,
                     cultInfo.DateTimeFormat.CalendarWeekRule,
                         cultInfo.DateTimeFormat.FirstDayOfWeek); 

只是更新了Spender放的东西,因为我想让你的Datetimes输出更接近你想要的。

DateTime jan1 = new DateTime(DateTime.Today.Year, 1, 1);
//beware different cultures, see other answers
DateTime startOfFirstWeek = jan1.AddDays(1 - (int)(jan1.DayOfWeek));
var weeks=
    Enumerable
        .Range(0,54)
        .Select(i => new {
            weekStart = startOfFirstWeek.AddDays(i * 7)
        })
        .TakeWhile(x => x.weekStart.Year <= jan1.Year)
        .Select(x => new {
            x.weekStart,
            weekFinish=x.weekStart.AddDays(4)
        })
        .SkipWhile(x => x.weekFinish.Year < jan1.Year)
        .Select((x,i) => new {
            WeekStart = x.weekStart.ToString("dddd, d, MMMM"),
            WeekFinish = x.weekFinish.ToString("dddd, d, MMMM"),
            weekNum=i+1
        });

在匿名对象的最后一个选择中更改格式以纠正您想要的格式

您可以使用。net的Time Period库的Week类:

DateTime start = DateTime.Now.Date;
DateTime end = start.AddYears( 1 );
Week week = new Week( start );
while ( week.Start < end )
{
  Console.WriteLine( "week " + week );
  week = week.GetNextWeek();
}

您可能需要稍微调整一下,但它应该可以满足您的需求:

static void Main(string[] args)
    {
        List<DateTime[]> weeks = new List<DateTime[]>();
        DateTime beginDate = new DateTime(2011, 01, 01);
        DateTime endDate = new DateTime(2012, 01, 01);
        DateTime monday = DateTime.Today;
        DateTime friday = DateTime.Today;
        while (beginDate < endDate)
        {
            beginDate = beginDate.AddDays(1);
            if (beginDate.DayOfWeek == DayOfWeek.Monday)
            {
                monday = beginDate;
            }
            else if (beginDate.DayOfWeek == DayOfWeek.Friday)
            {
                friday = beginDate;
            }
            else if (beginDate.DayOfWeek == DayOfWeek.Saturday)
            {
                weeks.Add(new DateTime[] { monday, friday });
            }
        }
        for (int x = 0; x < weeks.Count; x++)
        {
            Console.WriteLine(weeks[x][0].Date.ToShortDateString() + " - " + weeks[x][1].Date.ToShortDateString());
        }
        Console.ReadLine();
    }

最新更新