与MaxValue的日期比较不起作用

时间:2017-06-02 08:53:09

标签: c# datetime

我有一个名为BoughtDate的可为空的Date属性。 我正在尝试以下方法:

if( item.BoughtDate.Value.Equals( DateTime.MaxValue) ) item.BoughtDate= null;

也尝试了这个:

if( item.BoughtDate.Equals( DateTime.MaxValue) ) item.BoughtDate=null;

调试时,我的BoughtDateDateTime.MaxValue似乎完全相同 - 但它说的不一样(不会将我的item.BoughtDate设置为空)

为什么我的比较不起作用?

4 个答案:

答案 0 :(得分:6)

@PaulSuart在注释中指出的问题可能是毫秒精度。 DateTime.MaxValue.TimeOfDay{23:59:59.9999999},但您的BoughtDate.TimeOfDay可能是{23:59:59.9990000},因此它们并不相同。

我要做的只是比较日期,我认为在大多数情况下这已经足够了:

if( item.BoughtDate.Value.Date.Equals( DateTime.MaxValue.Date) ) item.BoughtDate= null;

答案 1 :(得分:0)

编辑:有人指出它没有回答原来的问题,只是提供了另一种选择。

尝试使用DateTime.Compare

https://msdn.microsoft.com/pl-pl/library/system.datetime.compare(v=vs.110).aspx

public static void Main()
{
  DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
  DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0);
  int result = DateTime.Compare(date1, date2);
  string relationship;

  if (result < 0)
     relationship = "is earlier than";
  else if (result == 0)
     relationship = "is the same time as";         
  else
     relationship = "is later than";

  Console.WriteLine("{0} {1} {2}", date1, relationship, date2);
}
你的例子中的

可能就是这样:

if(DateTime.Compare(item.BoughtDate.Value,DateTime.MaxValue) == 0) item.BoughtDate=null;

答案 2 :(得分:0)

我对你的案子进行了快速测试:

static void Main(string[] args)
{
    DateTime? BoughtDate = DateTime.MaxValue;
    //subtract 100 milliseconds from it
    BoughtDate = BoughtDate.Value.AddMilliseconds(-1);

    Console.WriteLine(BoughtDate.Value.Hour); //23
    Console.WriteLine(DateTime.MaxValue.Hour); //23

    Console.WriteLine(BoughtDate.Value.Minute); //59
    Console.WriteLine(DateTime.MaxValue.Minute); //59

    Console.WriteLine(BoughtDate.Value.Second); //59
    Console.WriteLine(DateTime.MaxValue.Second); //59

    Console.WriteLine(BoughtDate.Value.Year); //9999
    Console.WriteLine(DateTime.MaxValue.Year); //9999

    Console.WriteLine(BoughtDate.Value.Month); //12
    Console.WriteLine(DateTime.MaxValue.Month); //12

    Console.WriteLine(BoughtDate.Value.Day); //31
    Console.WriteLine(DateTime.MaxValue.Day); //31

    Console.WriteLine(BoughtDate.Value.Millisecond); //998
    Console.WriteLine(DateTime.MaxValue.Millisecond); //999



    if (BoughtDate.Value.Equals(DateTime.MaxValue)) 
    {
        Console.WriteLine("equals comparison succeeded"); //doesn't get printed
    }
}

从原始值减少仅一毫秒后,它不会在if块中通过相等检查条件,但如果您在快速监视窗口中看到BoughtDate的值,它们看起来完全相同<正如你所说的那样(因为它只显示年,月,日,小时,分钟和秒)。

enter image description here

仅在展开+符号时显示毫秒部分。

因此,您的日期时间变量必须以毫秒为单位进行区分,即使它们看起来一目了然。

答案 3 :(得分:0)

如果您从SQL-Server获取日期,我认为您可以在以下链接中找到答案。 SQL-Server仅支持23:59:59.997之间的时间范围,这可能导致几个小于C#支持的小节。你可以比较@Pikoh已经提到过的日期。

https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql