【问题标题】:DateCompare in C# like in SQL在 C# 中的 DateCompare 就像在 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 程序集进行比较..
  • 你听说过Kiss Method Keep It Simple Stupid 这里有一个简单的解决方案if (String.Format("{0:ddMMyyyyHHmmss}", early) == String.Format("{0:ddMMyyyyHHmmss}", soon)) { // success }
  • @DJKRAZE:该解决方案引入了文化、性能问题,并且不像提供的其他一些解决方案那么简单。

标签: c# .net sql datetime


【解决方案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*;
        

        【讨论】:

          猜你喜欢
          • 2011-02-27
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-09
          • 2021-06-20
          • 1970-01-01
          相关资源
          最近更新 更多