将 DateTime 周数计算为行

Posted

技术标签:

【中文标题】将 DateTime 周数计算为行【英文标题】:Calculate DateTime Weeks into Rows 【发布时间】:2010-09-05 19:20:13 【问题描述】:

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

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

这很好用,但是,有些月只有 5 周,在极少数情况下,只有 4 周。

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

这是我正在创建的示例:

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

在谷歌上找到的图片


这是我正在创建的示例:

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

在谷歌上找到的图片

【问题讨论】:

【参考方案1】:

这是实现它的方法:

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 部分来自定义日历周规则。我希望代码是不言自明的。

【讨论】:

【参考方案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);

【讨论】:

【参考方案3】:

请检查第一天和最后一天是哪一周?

【讨论】:

【参考方案4】:

您可以使用 DateTime.DaysInMonth(int WhichYear,int WhichMonth); 获取一个月的天数;

【讨论】:

【参考方案5】:

儒略历/公历中的月份每年都有相同的天数,除了 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;
  

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

【讨论】:

【参考方案6】:

问题不在于一个月的天数,而在于它跨越了多少周。

非闰年的 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;

【讨论】:

【参考方案7】:

试试这个,

DateTime.DaysInMonth

【讨论】:

【参考方案8】:

首先找出该月的第一天在哪个工作日。只需新建一个日期时间,第一天始终为 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;

【讨论】:

【参考方案9】:

检查Calendar.GetWeekOfYear。它应该可以解决问题。

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

【讨论】:

以上是关于将 DateTime 周数计算为行的主要内容,如果未能解决你的问题,请参考以下文章

python中根据时间获取周数,通过周数获取时间

python代码根据时间获取周数(week of the year)

如果根据当前日期获取当前周日期和当前周日期

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

C#中用当前日期算周的若干问题?