将DateTime Weeks计算为行

时间:2008-08-13 13:38:56

标签: c# asp.net

我目前正在ASP.Net C#中编写一个小日历。目前为了生成周的行,我做了以下循环:

var iWeeks = 6;
for (int w = 0; w < iWeeks; w++) {

这样可以正常工作,但是,某些月只有5周,在极少数情况下只有4周。

如何计算特定月份所需的行数?

这是我正在创建的一个例子:

enter image description here

正如您在上个月所看到的那样,只需要5行。本月(2008年8月)开始于星期六,星期一结束于第6周/每周。

在Google上找到的图片


这是我正在创建的一个例子:

enter image description here

正如您在上个月所看到的那样,只需要5行。本月(2008年8月)开始于星期六,星期一结束于第6周/每周。

在Google上找到的图片

9 个答案:

答案 0 :(得分:6)

以下是执行此操作的方法:

public int GetWeekRows(int year, int month)
{
    DateTime firstDayOfMonth = new DateTime(year, month, 1);
    DateTime lastDayOfMonth = new DateTime(year, month, 1).AddMonths(1).AddDays(-1);
    System.Globalization.Calendar calendar = System.Threading.Thread.CurrentThread.CurrentCulture.Calendar;
    int lastWeek = calendar.GetWeekOfYear(lastDayOfMonth, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    int firstWeek = calendar.GetWeekOfYear(firstDayOfMonth, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    return lastWeek - firstWeek + 1;
}

您可以通过修改System.Globalization.CalendarWeekRule.FirstFourDayWeek部分来自定义日历周规则。我希望代码是自我解释的。

答案 1 :(得分:2)

嗯,这取决于您正在使用的文化,但我们假设您可以使用Thread.CurrentThread.CurrentCulture,那么获取今天一周的代码将是:

Culture culture = Thread.CurrentThread.CurrentCulture;
Calendar cal = culture.Calendar;
Int32 week = cal.GetWeekOfYear(DateTime.Today,
    culture.DateTimeFormat.CalendarWeekRule,
    culture.DateTimeFormat.FirstDayOfWeek);

答案 2 :(得分:0)

如何查看第一天和最后一天将在哪一周?

答案 3 :(得分:0)

朱利安/公历中的月份每年的天数相同,除了2月份,根据一年的飞跃,可以有28天或29天。您可以在http://en.wikipedia.org/wiki/Gregorian_calendar的“说明”部分找到天数。

正如@darkdog所说,你有DateTime.DaysInMonth。就这样做:

var days = DateTime.DaysInMonth(year, month) + 
           WhatDayOfWeekTheMonthStarts(year, month);    
int rows = (days / 7);  
if (0 < days % 7)  
{  
    ++rows;
}  

考虑到全球化/本地化目的,世界上某些地方使用不同的日历/年度组织方法。

答案 4 :(得分:0)

试试这个,

DateTime.DaysInMonth

答案 5 :(得分:0)

检查Calendar.GetWeekOfYear。应该这样做。

它存在问题,它不遵循ISO 8601的4天规则,但除此之外它很整洁。

答案 6 :(得分:0)

你可以使用DateTime.DaysInMonth(int WhichYear,int WhichMonth)获得一个月的日子;

答案 7 :(得分:0)

问题不在于该月的天数,而是跨越多少周。

2月非闰年将有28天,如果该月的第一天是星期一,2月将完全跨越4周的数字。

但是,如果该月的第一天是星期二或一周中的任何其他日期,则2月将会有5周的数字。

31个月的月份可以以相同的方式持续5或6周。如果月份从星期一开始,31天给你5周的数字。如果月份从星期六或星期日开始,它将持续6周的数字。

因此,获得此数字的正确方法是找到该月第一天和最后一天的周数。


编辑#1 :以下是计算给定月份的周数的方法: 编辑#2 :修正了代码中的错误

public static Int32 GetWeekForDateCurrentCulture(DateTime dt)
{
    CultureInfo culture = Thread.CurrentThread.CurrentCulture;
    Calendar cal = culture.Calendar;
    return cal.GetWeekOfYear(dt,
        culture.DateTimeFormat.CalendarWeekRule,
        culture.DateTimeFormat.FirstDayOfWeek);
}

public static Int32 GetWeekSpanCountForMonth(DateTime dt)
{
    DateTime firstDayInMonth = new DateTime(dt.Year, dt.Month, 1);
    DateTime lastDayInMonth = firstDayInMonth.AddMonths(1).AddDays(-1);
    return
        GetWeekForDateCurrentCulture(lastDayInMonth)
        - GetWeekForDateCurrentCulture(firstDayInMonth)
        + 1;
}

答案 8 :(得分:0)

首先找出当月第一天的工作日。只需新的第一天的日期时间,总是1,以及有问题的年份和月份,就会有一周中的某一天属性。

然后,从这里开始,您可以使用当月的天数DateTime.DaysInMonth,以确定除以7的周数,然后添加第一天的1天的天数上。例如,

public static int RowsForMonth(int month, int year)
{
    DateTime first = new DateTime(year, month, 1);

    //number of days pushed beyond monday this one sits
    int offset = ((int)first.DayOfWeek) - 1;

    int actualdays = DateTime.DaysInMonth(month, year) +  offset;

    decimal rows = (actualdays / 7);
    if ((rows - ((int)rows)) > .1)
    {
        rows++;
    }
    return rows;
}