【问题标题】:subtract 2 datetime fields to get the days left difference减去 2 个日期时间字段以获得剩余天数
【发布时间】:2009-12-15 06:01:30
【问题描述】:

如果有人能帮我找出减去 2 个日期时间字段以获得剩余天数的差异,我将不胜感激。

【问题讨论】:

标签: c# datetime timespan


【解决方案1】:

使用 C# 很容易做到这一点。 为了比较 DateTimes,我们有一个名为 TimeSpan 的类。在这种情况下,TimeSpan 结构将被定义为两个日期时间之间的差异

假设您的 DateTimes 被称为 start 和 end。

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 结构的更多信息,请参阅this MSDN documentation(尤其是 C# 示例)。

希望我能帮上忙!

更新:一些答案​​建议一步进行减法,例如:

int days = (dt2 - dt1).Days;

int numDaysDiff = Math.Abs(date2.Subtract(date1).Days);

但是,它们与我的答案相同,只是缩短了。这是因为 DateTime.Subtract() 方法和 DateTimes 的减法运算符返回一个 TimeSpan,然后您可以从中访问天数。我专门在我的代码示例中使用了较长的方法,以便您清楚地了解 DateTime 和 TimeSpan 对象之间发生了什么以及它是如何工作的。当然,我刚才提到的其他方法也很好。

更新 #2:

之前有人问过一个非常相似的问题,可以找到here。但是,该问题的重点是为什么代码示例(基本上等同于所有答案的示例)有时提供了一个休息日的答案。我认为这对这个问题也很重要。

正如其他问题的主要答案所暗示的,您可以使用以下代码:

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.

【讨论】:

  • 顺便提一下,您的 Counting as nothing of a day(向下舍入到全天数) 答案有一个隐含的转换。 int days = (int)difference.TotalDays; 您仍然可以使用 Math 向下舍入。 int days = (int)Math.Floor(difference.TotalDays);
  • @Pantelis:如果我有差异。TotalDays=1.782323 那么这个 (int)Math.Floor(difference.TotalDays);四舍五入到 1????
【解决方案2】:

使用

TimeSpan

DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0);
DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
TimeSpan travelTime = arrival - departure;  

【讨论】:

    【解决方案3】:

    最简单的方法是使用 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;
    

    【讨论】:

      【解决方案4】:
      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;
      

      【讨论】:

        【解决方案5】:

        天数差异

        这些答案将System.TimeSpan 结构中的天数作为int,这是减去两个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 参考资料(以及更多示例代码):

        【讨论】:

          【解决方案6】:
          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
          

          您可能显然希望在这样的场景中这样做

          1. 在到期前 14 天发送通知电子邮件
          2. 在过期 14 天后发送另一个通知电子邮件

          你需要一个可能是负值的差异

          【讨论】:

            【解决方案7】:

            你应该看看TimeSpan

            【讨论】:

              【解决方案8】:

              忽略时间部分得到确切的日期

                  DateTime d1 = Convert.ToDateTime(DateTime.Now.ToShortDateString());
                  DateTime d2 = Convert.ToDateTime(DateTime.Now.AddDays(46).ToShortDateString());
              
                  var days = Convert.ToInt32(d2.Subtract(d1).TotalDays)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-11-15
                • 2013-07-15
                • 1970-01-01
                • 2014-10-18
                • 1970-01-01
                • 2020-11-14
                相关资源
                最近更新 更多