以下代码返回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);
如何计算两个日期之间的确切天数?
答案 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:00
而dtToDateDate
将为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返回指定月份和年份的天数。由于October在Gregorian 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 year,days
数组将等于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
。