如果有人能帮我找出减去 2 个日期时间字段以获得剩余天数的差异,将不胜感激。
8 回答
使用 C# 很容易做到这一点。为了比较 DateTimes,我们有一个名为TimeSpan的类。在这种情况下, TimeSpan 结构将被定义为两个 datetimes 之间的差异。
假设您的 DateTimes 被称为开始和结束。
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);
我们将日期时间确定为 2009 年 6 月 14 日和 2009 年 12 月 14 日。
现在,让我们找出两者之间的区别。为此,我们创建了一个 TimeSpan:
TimeSpan difference = end - start;
使用此 TimeSpan 对象,您可以用许多不同的方式表达时间差异。但是,您特别要求了天数的差异,因此您可以通过以下方式获得:
Console.WriteLine("Difference in days: " + difference.Days);
因此,该属性称为TimeSpan.Days。
最终代码
//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);
TimeSpan difference = end - start; //create TimeSpan object
Console.WriteLine("Difference in days: " + difference.Days); //Extract days, write to Console.
有关使用 TimeSpan 结构的更多信息,请参阅此 MSDN 文档(尤其是 C# 示例)。
希望我有所帮助!
更新:一些答案建议一步进行减法,例如:
int days = (dt2 - dt1).Days;
或者
int numDaysDiff = Math.Abs(date2.Subtract(date1).Days);
但是,它们与我的答案相同,只是缩短了。这是因为DateTime.Subtract() 方法和 DateTimes 的减法运算符返回一个 TimeSpan,然后您可以从中访问天数。我在我的代码示例中专门使用了较长的方法,以便您清楚地了解DateTime 和 TimeSpan 对象之间发生了什么以及它是如何工作的。当然,我刚才提到的其他方法也很好。
更新#2:
之前有人问过一个非常相似的问题,可以在这里找到。但是,该问题的重点是为什么代码示例(基本上等同于所有答案的示例)有时会提供一个休息日的答案。我认为这对这个问题也很重要。
正如另一个问题的主要答案所暗示的,您可以使用以下代码:
int days = (int)Math.Ceiling(difference.TotalDays);
此代码使用 Math.Ceiling,根据 MSDN,它是:
返回大于或等于指定双精度浮点数的最小整数值。
你想如何计算日子?
因此,我们现在遇到了如何计算天数的问题。您想将一天中的部分时间(例如一天中的 0.5 天)计算为:
- 一整天- 这将使用 Math.Ceiling 来四舍五入 TimeSpan.TotalDays,以便您计算开始天数。
- 一天的一部分- 您可以将 TimeSpan.TotalDays(未四舍五入)作为小数返回(在双精度数据类型中)
- 什么都没有- 你可以忽略一天中的那部分,只返回 TimeSpan.Days。
以下是上述代码示例:
算作一整天(使用 Math.Ceiling() 进行四舍五入):
//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);
TimeSpan difference = end - start; //create TimeSpan object
int days = (int)Math.Ceiling(difference.TotalDays); //Extract days, counting parts of a day as a full day (rounding up).
Console.WriteLine("Difference in days: " + days); //Write to Console.
作为一天的一部分计数(不使用 Math.Ceiling(),而是以十进制形式作为一天的一部分):
//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);
TimeSpan difference = end - start; //create TimeSpan object
double days = difference.TotalDays; //Extract days, counting parts of a day as a part of a day (leaving in decimal form).
Console.WriteLine("Difference in days: " + days); //Write to Console.
不算一天(四舍五入到全天数):
//establish DateTimes
DateTime start = new DateTime(2009, 6, 14);
DateTime end = new DateTime(2009, 12, 14);
TimeSpan difference = end - start; //create TimeSpan object
int days = difference.TotalDays; //Extract days, counting parts of a day as nothing (rounding down).
Console.WriteLine("Difference in days: " + days); //Write to Console.
利用
DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0);
DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
TimeSpan travelTime = arrival - departure;
最简单的方法是使用 TimeSpan()。这个减法函数将根据时间跨度返回两个日期之间的差异。现在您可以获取天、月等字段。要访问天,您可以使用以下示例代码;
VB.Net代码;
Dim tsTimeSpan As TimeSpan
Dim ldDate1 as Date
Dim ldDate2 as Date
'Initialize date variables here
tsTimeSpan = ldDate1 .Subtract(ldDate2)
Dim NumberOfDays as integer = tsTimeSpan.days
C#.Net 代码;
DateTime lDate1;
DateTime lDate2;
TimeSpan tsTimeSpan ;
int NumberOfDays;
//Initialize date variables here
tsTimeSpan = ldDate1 .Subtract(ldDate2);
NumberOfDays = tsTimeSpan.days;
DateTime dt1 = new DateTime(2009,01,01,00,00,00);
DateTime dt2 = new DateTime(2009,12,31,23,59,59);
int days = (dt2 - dt1).Days;
天数差异
这些答案将天数作为减去两个字段的结果int
的结构......System.TimeSpan
System.DateTime
快速回答- 获取天数差异。
int numDaysDiff = date2.Subtract(date1).Days;
替代答案- 使用 Math.Abs 确保它不是负数,以防万一日期可能以任一顺序提供。
int numDaysDiff = Math.Abs( date2.Subtract(date1).Days );
一些示例数据来完成它的using System
命名空间:
// sample data
DateTime date1 = DateTime.Now;
DateTime date2 = DateTime.Now.AddDays(10);
MSDN 参考资料(以及更多示例代码):
DateTime theDate = DateTime.Today;
int datediff = theDate.Subtract(expiryDate).Negate().Days;
if expiryDate > theDate then you get Negative value: -14
expiryDate is less than theDate then you get positive value: 14
您可能显然希望在诸如
- 在到期前 14 天发送通知电子邮件
- 到期后 14 天发送另一份通知电子邮件
你需要一个可能是负值的差异
你应该看看TimeSpan。
要获得忽略时间部分的确切日期
DateTime d1 = Convert.ToDateTime(DateTime.Now.ToShortDateString());
DateTime d2 = Convert.ToDateTime(DateTime.Now.AddDays(46).ToShortDateString());
var days = Convert.ToInt32(d2.Subtract(d1).TotalDays)