在 C# 中的 DateCompare 就像在 SQL 中一样

Posted

技术标签:

【中文标题】在 C# 中的 DateCompare 就像在 SQL 中一样【英文标题】:DateCompare in C# like in SQL 【发布时间】:2013-01-16 22:58:58 【问题描述】:

C# 中有没有一种方法可以比较日期,如 SQL DateDiff 方法,包括时间部分参数?

例如我有两个日期:

DateTime early = "2013.02.01 07:31:15";
DateTime soon = "2013.02.01 23:48:35";

if (Compare(early, soon, DAY) == true)

   //I want to be here

我想得到这两个对象在年月日相等的信息;其余的对我来说并不重要。

【问题讨论】:

您可以随时添加 using Microsoft.VisualBasic 并使用 VB.NET 程序集进行比较.. 有些相关:***.com/questions/683037/… 你听说过Kiss Method Keep It Simple Stupid 这里有一个简单的解决方案if (String.Format("0:ddMMyyyyHHmmss", early) == String.Format("0:ddMMyyyyHHmmss", soon)) // success @DJKRAZE:该解决方案引入了文化、性能问题,并且不像提供的其他一些解决方案那么简单。 【参考方案1】:

你可以使用DateTime.Date:

if(early.Date == soon.Date)

 

如果您想要精确的小时数:

if(early.Date == soon.Date && early.Hour == soon.Hour)

 

但是,使用此解决方案,您将获得“12/03/1857 23:59”!=“13/03/1857 00:00”。如果你想检查他们的“距离”:

if(early.Substract(soon).Duration() <= TimeSpan.FromHours(1))


.Duration() 获取时间跨度的“绝对”值(因为early.Substract(soon) 可以是“正”或“负”)。

【讨论】:

是的,你说得对 :) 但是如果我想比较 DateTime 的准确性和小时数呢? @Bruno.cf: DateDay 不同。 Bruno.cf 如果月份不同,则需要查看 Date,然后日期不相等..所以您的评论使 0 有意义 @AshBurlaczenko I want to get info that these two objects are equal in year, month and day; the rest is not important to me.。该陈述的哪一部分使您得出此解决方案错误的结论?【参考方案2】:

您可以使用DateTimes 的Date 属性来获取日期部分。

在您的情况下,您可以使用:

if (early.Date == soon.Date)

    ....

【讨论】:

【参考方案3】:

您可以使用DateTime.Subtract方法来查找差异。

System.TimeSpan diff1 = date2.Subtract(date1);

编辑

如果你想比较是否相等,你可以简单地使用相等运算符 ==

if(date1 == date2)


【讨论】:

加法和减法运算符为DateTime 重载以返回TimeSpan,因此date2 - date1 将是等效的替代方案。【参考方案4】:

如果你想知道是否是同一天,你不能使用日期差异......

试试这个代码:

if(new TimeSpan(early.Ticks).TotalDays() == new TimeSpan(soon.Ticks).TotalDays())
     // Equal

【讨论】:

【参考方案5】:

如果您想明确说明如何比较两个日期,我认为有点冗长没有什么问题:

public static bool YearMonthDayHourDateCompare(DateTime one, DateTime two)

    return (one.Year  == two.Year  &&
            one.Month == two.Month &&
            one.Day   == two.Day   &&
            one.Hour  == two.Hour  && 
            ...);

以描述您的比较的方式命名方法。更好的是,这可能是一种扩展方法:

public static bool CompareDateAndHour(this DateTime one, DateTime two)

    return (one.Date == two.Date &&
            one.Hour == two.Hour && 
            ...);

可以这样使用:

bool datesAreEqual = soon.CompareDateAndHour(two);

【讨论】:

+1 表示明确是一件好事。但是请原谅我……“明确表达没有错”然后你把它隐藏在MyCustomDateComparer? ;) @J.Steen:好的,函数的名字很臭——这只是一个例子。也许示例代码根本不包含在函数中会更好。你同意吗? 我并没有认真,虽然我仍然一直提倡具有描述性名称的方法和变量。在这个相当冗长的情况下,一个描述性的方法名称会更好 - 在我看来 - 比完全不包装条件。 =) 哎哟。是的,到了极点。 =) 完全没有冒犯的意思。 @J.Steen:好点。我应该更加小心Stack Overflow 上的示例代码。【参考方案6】:
var diff=soon-early;
diff.TotalHours or diff.TotalMinutes etc...

【讨论】:

【参考方案7】:

要将两个日期与小时的准确性进行比较,请使用以下内容:

bool match = (soon - early).TotalHours < *your diff limit*;

【讨论】:

以上是关于在 C# 中的 DateCompare 就像在 SQL 中一样的主要内容,如果未能解决你的问题,请参考以下文章

如何使回车键将光标移动到 Android Studio 中的行尾,就像在 Eclipse 中一样

如何禁用活动中的主页按钮单击 - 就像在锁屏应用程序中一样?

如何获得完整的 unicode 支持,包括 VCL 控件中的中文字符或 XP 上的 Windows 通用控件,就像在 Win7 中一样

托管 C++ 中的逐字字面量? (就像 C# 的 @"blah")

TextField 没有被键盘顺利推上,就像在 Whatsapp 和环聊中一样

有没有办法强制 phpinfo() 输出其内容而不进行格式化。就像在 CLI 模式下一样?