오늘 DateTime이 발생하는지 확인하는 방법은 무엇입니까?


110

DateTime이 '오늘'발생했는지 확인하는 더 나은 .net 방법이 있습니까?

if ( newsStory.WhenAdded.Day == DateTime.Now.Day &&
     newsStory.WhenAdded.Month == DateTime.Now.Month &&
     newsStory.WhenAdded.Year == DateTime.Now.Year )
{ 
    // Story happened today
}
else
{ 
    // Story didn't happen today
}

14
newStory.Date == DateTime.Now.Date
Guillaume

답변:


222
if (newsStory.WhenAdded.Date == DateTime.Today)
{

}
else
{

}

트릭을해야합니다.


3
... newsStory.Date가 실제로 시간이없는 날짜 부분 인 경우. ;)
Lucero

14
... newsStory가 DateTime 인 경우
stevemegson

18
음, DateTime은 .NET Framework 클래스 라이브러리의 일부이므로 OP가 동일한 이름을 공유하는 자체 클래스를 만들었을 가능성 이 있지만 StackOverflow에 사용자 지정 클래스를 사용하는 방법을 묻는 이유가 궁금 할 것입니다. 그는 창조했고 우리가 그것이 어떻게 작동하는지 마술처럼 알기를 기대합니다. ;)
Brian Schroth

2
@Lucero는 가능하지만 질문 제목은 '두 개의 DateTimes'입니다. ;) 그것이 우리가 누락 된 유형을 얻은 곳이라고 생각합니다.
pyrocumulus

1
@HansPetterNaumann 논리적입니다. :) DateTime.AddHours ()는 새 DateTime 객체를 반환하므로 실제로 시간 구성 요소가 없었던 .Today 작업을 효과적으로 취소합니다.
pyrocumulus 2013

29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}

5
추가하고 싶습니다 .DateTime을 DateTime.Today와 비교하는 것은 매우 일반적이며 버그를 발견하기 어렵습니다.
JL.

16

시험

if (newsStory.Date == DateTime.Now.Date) 
{ /* Story happened today */ }
else
{ /* Story didn't happen today */ }

14

내 솔루션 :

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}

7

NewsStory가 DateTime도 사용하고 있었다면 Date 속성을 비교하기 만하면됩니다.

그러나 이것은 "오늘"이 실제로 의미하는 바에 따라 다릅니다. 자정 직전에 게시 된 내용은 잠시 후 "오래된"상태가됩니다. 따라서 정확한 스토리 날짜 (시간 포함, 가급적 UTC 포함)를 유지하고 24 시간 미만 (또는 기타)이 지 났는지 확인하는 것이 가장 좋을 것입니다. 이는 간단합니다 (날짜를 뺄 수 있으므로 TotalHours가 포함 된 TimeSpan을 얻을 수 있음). 또는 TotalDays 속성).


5

DateTime 확장 메서드를 구현할 수 있습니다.

확장 메서드에 대한 새 클래스를 만듭니다.

namespace ExtensionMethods
{
    public static class ExtensionMethods
    {
        public static bool IsSameDay( this DateTime datetime1, DateTime datetime2 )
        {
            return datetime1.Year == datetime2.Year 
                && datetime1.Month == datetime2.Month 
                && datetime1.Day == datetime2.Day;
        }
    }
}

이제 코드의 모든 곳에서이 테스트를 수행 할 위치에 using을 포함해야합니다.

using ExtensionMethods;

그런 다음 확장 방법을 사용하십시오.

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
왜 datetime1.Date == datetime2.Date를 반환하지 않습니까?
Sergiu Mindras 2013

@SergiuMindras가 맞습니다 . 항상 00:00:00 Date이기 때문에 두 가지를 비교하는 것으로 충분 TimeSpan합니다.
GoRoS 2014 년

5

참고로,

newsStory.Date == DateTime.Today

코딩과 동일한 비교 결과를 반환합니다.

newsStory == DateTime.Today

개체 newsStory는 어디에 있습니까DateTime

.NET은 날짜만을 기준으로 비교를 결정하고이를 내부 비교에 사용합니다. 이유를 모르고 실제로이 동작에 대한 문서를 찾는 데 문제가 있습니다.




1

음, DateTime에는 "Date"속성이 있으며이를 기반으로 비교할 수 있습니다. 그러나 문서를 보면 해당 속성을 얻는 것이 실제로 시간 구성 요소를 자정으로 설정하여 새 날짜 시간을 인스턴스화하는 것처럼 보이므로 훨씬 깨끗하고 읽기 쉽지만 각 개별 구성 요소에 액세스하는 것보다 느릴 수 있습니다.


감속 (존재하는 경우)이 너무 작아서 거의 모든 경우에 문제가되지 않는다고 생각합니다. 확실히 조기 최적화의 경우입니다.
Esben Skov Pedersen

동의합니다. 요즘에는 현대적인 코딩 세계가 가독성과 유지 보수성에 더 중점을두기 때문에 조기 최적화를 제거하기가 점점 더 어려워지고 있습니다. 오래된 습관은 몹시 죽습니다!
Peter Bridger

0

if (newsStory.ToShortDateString() == DateTime.Today.ToShortDateString()) return "Todtay";


-4

어때

if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
{ // Story happened today
}

그러나 이것은 2008 년 1 월 1 일과 2009 년 1 월 1 일에 대해서도 true로 반환되며, 원하는 것이 아닐 수도 있습니다.


-6

당신은 사용할 수 있습니다 DateTime.Now.DayOfYear

 if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
 { // story happened today

 }
 else
 { // story didn't happen today

 }

1
나는 이것이 작동하지 않을 것이라고 생각합니다. 오늘이 2009 년 10 월 21 일이고 newsStory가 2008 년 10 월 21 일이면 사실이 반환됩니다 (여기에서는 윤년을 고려하지 않았습니다).
Philip Wallace

2
연도를 구분하지 않습니다. new DateTime (2009, 10, 01) .DayOfYear == new DateTime (1900, 10, 01) .DayOfYear;
Dave D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.