如何检查DateTime是否今天发生?


110

是否有更好的.net方法来检查DateTime是否已“今天”发生,然后再检查以下代码?

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
纪尧姆

Answers:


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

}
else
{

}

应该做到的。


3
...如果newsStory.Date实际上只是日期部分,没有时间。;)
Lucero

14
…如果newsStory是DateTime,则是这样
stevemegson

18
好吧,DateTime是.NET Framework类库的一部分,因此虽然OP 可能创建了自己的共享相同名称的类,但您可能想知道为什么他会问StackOverflow如何使用自定义类他创造并期望我们神奇地知道它是如何工作的。;)
Brian Schroth 2009年

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 ExtensionMethods;

然后,使用扩展方法:

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
为什么不只返回datetime1.Date == datetime2.Date?
Sergiu Mindras

@SergiuMindras是正确的,将两个都比较就足够了Date,因为它TimeSpan始终是00:00:00。
GoRoS 2014年

5

仅供参考

newsStory.Date == DateTime.Today

将返回与编码相同的比较结果

newsStory == DateTime.Today

哪里newsStoryDateTime物体

.NET足够聪明,可以确定您仅希望基于Date进行比较,并将其用于内部Compare。不知道为什么,实际上很难找到有关此行为的文档。




1

好吧,DateTime具有“日期”属性,您可以根据此属性进行比较。但是从文档来看,似乎获得该属性实际上会实例化一个新的datetime,并将时间组件设置为午夜,因此,尽管访问起来更加整洁且可读性强,但它可能比访问每个单独的组件都要慢。


我认为减速(如果存在)会很小,所以在几乎所有情况下都没有关系。当然是过早优化的情况。
Esben Skov Pedersen

同意-这些天,我发现摆脱过早的优化变得越来越困难,因为现代编码世界更多地关注可读性和可维护性。旧习难改!
彼得·布里奇


-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日,而新闻故事是2008年10月21日-它将返回true(在这里我没有考虑leap年)。
菲利普·华莱士

2
这不会在新的DateTime(2009,10,01).DayOfYear ==新的DateTime(1900,10,01).DayOfYear之间进行区分。
戴夫D
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.