DateTime.Compare如何检查日期是否少于30天?


Answers:


232

我是否正确使用DateTime比较?

编号Compare仅提供有关两个日期的相对位置的信息:更少,相等或更大。您想要的是这样的:

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

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

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

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

没有if必要的。


2
应该允许给您2+;)一个答案,一个简短的表达方式
CheGueVerra

4
嗯...我只是想把答案延长一些,所以可以减去一票假想的票。;-)
Konrad Rudolph,2009年

1
请使用,TotalDays而不是几天。
若昂里斯本

2
从概念上讲,它更准确。没什么不同,因为它Days是的最大组成部分TimeSpan。阅读此书的人可以推断出,认为该Seconds物业的运作方式相同。
若昂里斯本

2
再加上若昂·波特拉(JoãoPortela)提出的观点,甚至Days本身也可能是错误的。Days并且TotalDays在这里只是因为条件是相同的< 30,但是如果是这样的话,将会有明显的区别<= 30,因为TotalDays可能返回类似于30.421while的Days返回30
Racil Hilan 2014年

15

应该

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

记下总天数,否则您将出现异常行为


上次修改为接受的答案后,此答案已超过一年!
米奇·麦特

@Mitch-这是正确的答案,请注意他使用的是TotalDays而不是Days。
Marcelo Mason

接受的答案是正确的。TotalDays也返回小数部分,与整数比较时是多余的。
米奇·

1
@MitchWheatTotalDays概念上是正确使用的字段。在实践中,它们给出相同的结果,但仅仅是因为Days是的最大组成部分TimeSpan,如果存在“月”或“年”部分,而这将是另外一个故事。只需尝试使用HoursSecondsMilliseconds查看它们如何工作。
若昂里斯本

7

好吧,我会这样做:

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

比较仅以整数表示天气,第一个是较早,相同或较晚。


6

试试这个

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

1
嗯,除非到期日期已经过去,否则您需要反转日期顺序或采用绝对值。
康拉德·鲁道夫

3

比较分别返回大于,等于,小于的1、0,-1。

你要:

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

1

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

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

实际上,hr发生了什么,例如expryDte是28/4/2011如果U rite(expiryDate-DateTime.now)也会花费时间(28/4/2011 12:00:00 AM-26/4/2011 11 :47:00 AM)及以上代码的取值为2011年4月28日12:00:00 AM -26/4/2011 12:00:00 AM,这将导致准确的差异。
Jayant

1

比较是不必要的,天数/天数是不必要的。

所有你需要的是

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

请注意,如果您决定使用分钟或数月甚至数年作为到期标准,则此方法将起作用。


1
这不是一个很好的答案,因为现在您还需要考虑小时,分钟和秒。DateTime.Today对于OP的情况会更正确。
JL。

1

假设您要分配false(如果适用)matchtime,则将是一种更简单的编写方式。

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

这里的三元运算符是完全多余的,因为(((expiryDate-DateTime.Now).TotalDays <30)已经返回一个布尔值。
法比奥

@Fabio感谢伙伴删除了它们,以通过返回类型分配布尔值。
Magic Mick

0

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


0

不,您没有正确使用它。

有关详细信息,请参见此处

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");

0

您要执行的操作是减去两个DateTime(expiryDate和DateTime.Now)。这将返回TimeSpan类型的对象。TimeSpan具有属性“天”。将该数字与30进行比较。


0

不,这是不正确的,请尝试以下操作:

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

0

实际上,这些答案都不对我有用。我这样做是解决了这个问题:

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

当我尝试这样做时:

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

今天是2011-11-14,我的到期日期是2011-10-17,我得到了matchFound = -28。而不是28。所以我推了最后一张支票。


0
// 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;
            }
            }

1
有点复杂吗?
2012年

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

0

您可以尝试这样做:

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

6
请尝试在说明中更具描述性。
borchvm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.