两个日期和.NET函数DaysInMonth之间的差异

时间:2015-01-29 05:38:09

标签: c# datetime

以下代码返回30天而不是31天。

DateTime dtFromDate   = Convert.ToDateTime("2015-01-01");
DateTime dtToDateDate = Convert.ToDateTime("2015-01-31");     
NoOfDays  =  (int) (dtToDateDate- dtFromDate).TotalDays;

以下代码返回31天。

NoOfDays = (int)DateTime.DaysInMonth(2015,1);   

如何计算两个日期之间的确切天数?

3 个答案:

答案 0 :(得分:1)

在第一个中,您从“2015-01-31”日期“2015-01-01”之前和之后省略了所有日期。这在逻辑上是30(包括2015/1/31)

在第二个你只是要求1月份的天数是31

这里没有什么不正常

答案 1 :(得分:1)

那是因为这一天从00:00:00(午夜)开始,因此对于31/1所以它不会被包括在内,但是如果你添加了小时数,你将得到有效的天数。或者您可以将结束日期改为" 1/2/2015 00:00:00"你也会得到有效的数字。

答案 2 :(得分:1)

我知道这已经很晚了,但是如果你们让我的话,我想写更多的解释!

让我们逐行查看您的示例;

DateTime dtFromDate   = Convert.ToDateTime("2015-01-01");
DateTime dtToDateDate = Convert.ToDateTime("2015-01-31");   

通过此对话,您的dtFromDate将为01/01/2015 00:00:00dtToDateDate将为31/01/2015 00:00:00,因为您没有写任何时间部分,它将被分配给默认为午夜。

使用dtToDateDate- dtFromDate行,您将获得一个TimeSpan 完全 30天,为{30.00:00:00}。为什么? ,简单;

+---------------------+---------------------+----------------+
|      FirstDate      |      LastDate       | Day Difference |
+---------------------+---------------------+----------------+
| 01/01/2015 00:00:00 | 01/01/2015 00:00:00 | 0              |
| 01/01/2015 00:00:00 | 02/01/2015 00:00:00 | 1              |
| 01/01/2015 00:00:00 | 03/01/2015 00:00:00 | 2              |
| ...                 | ...                 | ...            |
| ...                 | ...                 | ...            |
| 01/01/2015 00:00:00 | 31/01/2015 00:00:00 | 30             |
+---------------------+---------------------+----------------+

DateTime.DaysInMonth(2015, 1)怎么样?

DaysInMonth method返回指定月份和年份的天数。由于OctoberGregorian Calender内有31天,因此会返回31

来自wikipedia;

  

十月是朱利安和格里高利一年中的第十个月   日历和七个月中的一个,长度为31天

但是这种方法并没有使用任何DateTime差异来计算它们。这是implemented

的结果
public static int DaysInMonth(int year, int month)
{
    // IsLeapYear checks the year argument
    int[] days = IsLeapYear(year)? DaysToMonth366: DaysToMonth365;
    return days[month] - days[month - 1];
}

由于2015不是leap yeardays数组将等于DaysToMonth365,其定义为;

private static readonly int[] DaysToMonth365 =
{
   0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
};

我们提供了month参数1,此方法返回

days[1] - days[0]

等于

31 - 0

等于31