DateTime. 날짜가 30 일 미만인지 확인하는 방법을 비교합니까?


86

계정이 30 일 이내에 만료되는지 알아 보려고합니다. DateTime Compare를 올바르게 사용하고 있습니까?

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

{
     matchFound = true;
}

답변:


234

DateTime Compare를 올바르게 사용하고 있습니까?

아니요. Compare두 날짜의 상대적 위치에 대한 정보 만 제공합니다 : 작거나 같거나 큰 날짜. 당신이 원하는 것은 다음과 같습니다.

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

이것은 두 개의 DateTimes를 뺍니다 . 결과는 속성 TimeSpan을 가진 객체입니다 TotalDays.

또한 조건문은 다음과 같이 직접 작성할 수 있습니다.

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

if필요 하지 않습니다.


2
당신에게 2+를 줄 수 있어야합니다;) 하나는 대답을위한 것이고 다른 하나는 그것을 표현하는 짧은 방법입니다
CheGueVerra

4
어 .. 방금 답을 더 길게 만들었으니 상상의 표를 빼도됩니다. ;-)
Konrad Rudolph

1
TotalDays일 대신 사용하십시오 .
João Portela 2013

2
개념적으로 더 정확합니다. Days의 가장 큰 구성 요소 이기 때문에 차이가 없습니다 TimeSpan. 이것을 읽는 사람들은 Seconds재산이 같은 방식으로 작동 한다고 생각하기 위해 그것을 추론 할 수 있습니다 .
João Portela 2013

2
João Portela가 만든 요점에 추가하면 Days그 자체도 틀릴 수 있습니다. Days그리고 TotalDays조건이있는 경우에만 있기 때문에 여기에 같은입니다 < 30,하지만 그것이 경우에 분명한 차이가있을 것입니다 <= 30, 때문에 TotalDays같은 5 월 반환 뭔가 30.421동안 Days여전히 반환 30.
Racil Hilan 2014-04-16

15

해야한다

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

총 일수를 기록하십시오. 그렇지 않으면 이상한 행동이 나타납니다.


이 답변은 수락 된 답변에 대한 마지막 수정 후 1 년이 넘었습니다!
Mitch Wheat

@Mitch-정답입니다. Days가 아닌 TotalDays를 사용하고 있습니다.
Marcelo Mason

수락 된 답변이 맞습니다. TotalDays는 정수와 비교할 때 중복되는 분수 부분도 반환합니다.
Mitch Wheat

1
@MitchWheat TotalDays개념적 으로 사용하기에 올바른 필드입니다. 실제로는 동일한 결과를 제공 Days하지만는의 가장 큰 구성 요소 이기 때문에 TimeSpan월 또는 년 구성 요소가 있었고 이것은 다른 이야기가되었을 것입니다. 그냥와 시도 Hours, Seconds또는 Milliseconds그들이 어떻게 작동하는지 볼 수 있습니다.
João Portela 2013

7

대신 다음과 같이 할 것입니다.

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

비교는 첫 번째 날씨가 더 빠르거나 같거나 늦음을 나타내는 정수로만 응답합니다.


6

대신 이것을 시도하십시오

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

1
흠, 만료 날짜가 이미 지나지 않은 경우 날짜 순서를 반대로하거나 절대 값을 가져와야합니다.
Konrad Rudolph

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;

실제로 일어나는 일은 예를 들어, expryDte는 2011 년 4 월 28 일입니다. : 47 : 00 AM) 및 위 코드는 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AM으로 값을 취하며 정확한 차이를 제공합니다.
Jayant

1

비교 는 불필요하며 Days / TotalDays 는 불필요합니다.

필요한 것은

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

@Fabio Thanks 친구는 반환 유형을 통해 부울 값을 할당하기 위해 제거했습니다.
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에는 "Days"속성이 있습니다. 답을 위해 그 숫자를 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이고 내 expiryDate는 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
조금 복잡하지 않나요?
Max

질문에서 accountExpireDates에 대한 언급은 어디에 있습니까? 잘못된 솔루션을 복사하여 붙여 넣었습니다. matchFound는 Pattern 또는 RegEx를 믹싱하는 것처럼 들립니다. Btw, 일치하는 항목이 발견되거나 계속 반복되면 중단해야합니다. -2라면 어떨까요? MSDN은 가능한 값이 -1, 0 및 1이라고 말하지 않습니다.
Mukus

0

다음과 같이 시도 할 수 있습니다.

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

6
설명에 좀 더 구체적으로 설명해주세요.
borchvm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.