【问题标题】:DateTime.Compare how to check if a date is less than 30 days old?DateTime.Compare 如何检查日期是否小于 30 天?
【发布时间】:2010-10-06 09:58:05
【问题描述】:

我正在尝试确定帐户是否会在 30 天内到期。我是否正确使用了 DateTime 比较?

if (DateTime.Compare(expiryDate, now) < 30)

{
     matchFound = true;
}

【问题讨论】:

    标签: c# .net datetime


    【解决方案1】:

    你可以尝试这样做:

    var daysPassed = (DateTime.UtcNow - expiryDate).Days;
    if (daysPassed > 30)
    { 
        // ...
    }
    

    【讨论】:

    • 请尽量在您的解释中更具描述性。
    【解决方案2】:

    假设您要将false(如果适用)分配给matchtime,则更简单的编写方法是......

    matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
    

    【讨论】:

    • 这里的三元运算符是完全多余的,因为 ((expiryDate - DateTime.Now).TotalDays
    • @Fabio 感谢好友删除它们以通过返回类型分配布尔值。
    【解决方案3】:

    我是否正确使用了 DateTime 比较?

    没有。 Compare 仅提供有关两个日期的相对位置的信息:小于、等于或大于。你想要的是这样的:

    if ((expiryDate - DateTime.Now).TotalDays < 30)
        matchFound = true;
    

    这减去两个DateTimes。结果是一个具有TotalDays 属性的TimeSpan 对象。

    另外,条件可以直接写成:

    matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
    

    不需要if

    【讨论】:

    • 应该允许给你 2+ ;) 一个是答案,一个是简短的表达方式
    • 呃……我只是把我的答案加长了,所以请随意减去一票。 ;-)
    • 请使用TotalDays 而不是天数。
    • 它在概念上更准确。没有区别,因为DaysTimeSpan 的最大组成部分。阅读本文的人可以推断认为Seconds 属性的工作方式相同。
    • 补充到 João Portela 提出的观点,即使 Days 本身也可能是错误的。 DaysTotalDays 在这里是一样的,只是因为条件是&lt; 30,但是如果是&lt;= 30 就会有明显的区别,因为TotalDays 可能返回类似30.421Days 仍然返回30
    【解决方案4】:

    Compare 分别为大于、等于、小于返回 1、0、-1。

    你想要:

        if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0) 
        { 
            bool matchFound = true;
        }
    

    【讨论】:

      【解决方案5】:
      // this isn't set up for good processing.  
      //I don't know what data set has the expiration 
      //dates of your accounts.  I assume a list.
      // matchfound is a single variablethat returns true if any 1 record is expired.
      
      bool matchFound = false;
                  DateTime dateOfExpiration = DateTime.Today.AddDays(-30);
                  List<DateTime> accountExpireDates = new List<DateTime>();
                  foreach (DateTime date in accountExpireDates)
                  {
                      if (DateTime.Compare(dateOfExpiration, date) != -1)
                      {
                          matchFound = true;
                  }
                  }
      

      【讨论】:

      • 是不是有点复杂?
      • 问题中提到 accountExpireDates 的位置在哪里?您复制粘贴了一个错误的解决方案。 matchFound 几乎听起来像是在混合 Pattern 或 RegEx。顺便说一句,您需要在找到匹配项或继续循环时中断。如果它是-2怎么办? MSDN 没有说可能的值是 -1、0 和 1。
      【解决方案6】:

      实际上,这些答案都不适合我。我通过这样做解决了它:

        if ((expireDate.Date - DateTime.Now).Days > -30)
        {
          matchFound = true;
        }
      

      当我尝试这样做时:

      matchFound = (expiryDate - DateTime.Now).Days < 30;
      

      今天,2011 年 11 月 14 日,我的到期日期是 2011 年 10 月 17 日,我得到了 matchFound = -28。而不是 28。所以我反转了最后一次检查。

      【讨论】:

        【解决方案7】:

        Compare 是不必要的,Days / TotalDays 是不必要的。

        你只需要

        if (expireDate < DateTime.Now) {
            // has expired
        } else {
            // not expired
        }
        

        请注意,如果您决定使用几分钟或几个月甚至几年作为到期标准,这将起作用。

        【讨论】:

        • 不是一个很好的答案,因为现在您还要考虑小时、分钟和秒。 DateTime.Today 对于 OP 的情况会更正确。
        【解决方案8】:

        这将为您提供准确的结果:

        if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
            matchFound = true;
        

        【讨论】:

        • 实际上发生的事情 hr 是 eg.expryDte 是 28/4/2011 如果 U rite (expiryDate-DateTime.now) 它也需要时间 (28/4/2011 12:00:00 AM - 26/4/2011 11:47:00 AM)及以上代码取值为 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AM,这将给出准确的差异。
        【解决方案9】:

        应该是

        matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
        

        记下总天数 否则你会得到奇怪的行为

        【讨论】:

        • 这个答案是在最后一次编辑接受答案后一年多!
        • @Mitch - 这是正确答案,注意他使用的是 TotalDays 而不是 Days。
        • 接受的答案是正确的。 TotalDays 也返回一个小数部分,这在与整数比较时是多余的。
        • @MitchWheat TotalDays 在概念上是正确的使用字段。实际上,它们给出了相同的结果,但这只是因为DaysTimeSpan 的最大组成部分,如果有月或年组成部分,这将是一个不同的故事。只需尝试使用 HoursSecondsMilliseconds 看看它们是如何工作的。
        【解决方案10】:

        试试这个

        if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { 
          matchFound = true;
        }
        

        【讨论】:

        • 嗯,你需要颠倒日期的顺序或者取绝对值,除非已经过了过期日期。
        【解决方案11】:

        好吧,我会这样做:

        TimeSpan diff = expiryDate - DateTime.Today;
        if (diff.Days > 30) 
           matchFound = true;
        

        Compare 只响应一个整数,表示第一个天气较早、相同或较晚...

        【讨论】:

          【解决方案12】:

          不,这不正确,试试这个:

          DateTime expiryDate = DateTime.Now.AddDays(-31);
          if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
          {
              matchFound = true;
          }
          

          【讨论】:

            【解决方案13】:

            您要做的是减去两个 DateTimes(expiryDate 和 DateTime.Now)。这将返回一个 TimeSpan 类型的对象。 TimeSpan 有一个属性“天”。将该数字与 30 进行比较即可得出答案。

            【讨论】:

              【解决方案14】:

              不,你没有正确使用它。

              详情请见here

              DateTime t1 = new DateTime(100);
              DateTime t2 = new DateTime(20);
              
              if (DateTime.Compare(t1, t2) >  0) Console.WriteLine("t1 > t2"); 
              if (DateTime.Compare(t1, t2) == 0) Console.WriteLine("t1 == t2"); 
              if (DateTime.Compare(t1, t2) <  0) Console.WriteLine("t1 < t2");
              

              【讨论】:

                【解决方案15】:

                不,Compare 函数将返回 1、0 或 -1。 0 当两个值相等时,-1 和 1 表示小于和大于,我相信这个顺序,但我经常混淆它们。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-12-26
                  • 1970-01-01
                  • 2018-04-05
                  • 1970-01-01
                  • 2012-02-24
                  • 2017-02-09
                  • 2011-10-31
                  • 1970-01-01
                  相关资源
                  最近更新 更多