Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查日期时间是否发生在今天?_C#_.net_Datetime - Fatal编程技术网

C# 如何检查日期时间是否发生在今天?

C# 如何检查日期时间是否发生在今天?,c#,.net,datetime,C#,.net,Datetime,有没有更好的.net方法来检查DateTime是否发生在“今天”,然后检查下面的代码 if ( newsStory.WhenAdded.Day == DateTime.Now.Day && newsStory.WhenAdded.Month == DateTime.Now.Month && newsStory.WhenAdded.Year == DateTime.Now.Year ) { // Story happened today

有没有更好的.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
}
试一试

应该做到这一点。

根据建议,比较
Date
属性的值:

newStory.Date == DateTime.Now.Date

如果NewsStory也使用DateTime,只需比较Date属性,就完成了


然而,这取决于“今天”的实际含义。如果某物在午夜前不久被发布,它将在短时间后成为“旧的”。因此,最好保留确切的报道日期(包括时间,最好是UTC),并检查是否少于24小时(或任何时间),这很简单(可以减去日期,这将为您提供一个带有TotalHours或TotalDays属性的时间跨度)。

您可以使用
DateTime.Now.DayOfYear

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

 }
 else
 { // story didn't happen today

 }
试试这个:

newsStory.Date == DateTime.Today
怎么样

if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
{ // Story happened today
}
但对于2008年1月1日和2009年1月1日,这也将返回真值,这可能是您想要的,也可能不是您想要的。

好吧,DateTime有一个“Date”属性,您可以根据它进行比较。但从文档来看,获取该属性实际上实例化了一个新的日期时间,时间组件设置为午夜,因此它可能比访问每个单独的组件要慢,尽管更干净、更可读。

FYI

newstory.Date==DateTime.Today

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

newstory==DateTime.Today

其中,
newstory
是一个
DateTime
对象

.NET非常聪明,可以确定您只希望基于日期进行比较,并将其用于内部比较。不确定原因,实际上很难找到有关此行为的文档。

我的解决方案:

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

您可以实现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);
if(newstory.ToShortDateString()==DateTime.Today.ToShortDateString())

返回“Todday”

您可以比较newStory.Date==DateTime.Now.Date…如果newStory.Date实际上只是日期部分,而没有时间。。。也就是说,如果newsStory是DateTimewell,DateTime是.NET Framework类库的一部分,因此,虽然OP可能创建了自己的类,而该类恰好共享相同的名称,但您可能想知道为什么他会问StackOverflow如何使用他创建的自定义类,并希望我们神奇地知道它是如何工作的@卢塞罗:这是可能的,但是问题的标题是“两个日期时间”。)我想这就是我们从中得到丢失类型的原因。@Hanspeternaumann这是合乎逻辑的:)DateTime.AddHours()返回一个新的DateTime对象,从而有效地取消了确实没有时间组件的.Today操作。我认为这行不通。如果今天是2009年10月21日,而新闻故事是2008年10月21日,那么它将返回真值(我在这里没有考虑闰年)。这不会区分新日期时间(2009年10月1日)。DayOfYear==新日期时间(1900年10月1日)。DayOfYear;我认为经济放缓(如果存在的话)将是如此之小,几乎在所有情况下都无关紧要。当然是早熟优化的例子。同意-这些天我发现摆脱早熟优化越来越困难,因为现代编码世界更注重可读性和可维护性。旧习难改!我想补充一点,这是一个非常常见的错误(而且很难发现错误)-只是将DateTime与DateTime.Today进行比较。为什么不直接返回datetime1.Date==datetime2.Date?@SergiuMindras是对的,比较这两个日期就足够了,因为它的
TimeSpan
总是00:00。
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);