Comparing nullable DateTime?

前端 未结 5 992
星月不相逢
星月不相逢 2020-12-10 10:03

Looking for a better way to compare a nullable date time than the following:

Any suggestions?

// myobject.ExpireDatetime is of DateTime?
//
if (!myob         


        
相关标签:
5条回答
  • 2020-12-10 10:43

    I would recommend you to use the following:

    int y = Nullable.Compare<DateTime>(DateTime.UtcNow, x); 
    
    // x is the nullable date time object.
    // y will be '-1' if x is greater than DateTime.UtcNow
    
    0 讨论(0)
  • 2020-12-10 10:50

    If ExpireDateTime is a Nullable<DateTime>i would do following instead:

    if (ExpireDateTime.HasValue && ExpireDateTime < DateTime.Now.ToUniversalTime())
    { 
    }
    
    0 讨论(0)
  • 2020-12-10 10:56

    The compiler lifts variables and generates code to check for nulls.

    > new DateTime?()
    null
    > DateTime.Now > null
    false
    > DateTime.Now < null
    false
    
    > new int?()
    null
    > 10 >= null
    false
    > 10 =< null
    false
    > 10 == null
    false
    > 10 != null
    true
    

    Knowing this you can write simple code.

    // d is a DateTime? 
    DateTime now = DateTime.Now;
    
    bool after = d > now;
    bool before = d < now;
    bool today = d?.Date == now.Date;
    

    If d is null everything will be false, else it will work like normal DateTime comparison.

    0 讨论(0)
  • 2020-12-10 10:59

    Use the Value property of the nullable:

    objet.ExpireDateTime.Value
    

    if (!object.ExpireDateTime.IsNull() 
        && DateTime.Compare(objet.ExpireDateTime.Value, 
                            DateTime.Now.ToUniversalTime()) < 0)
    { 
    }    
    
    0 讨论(0)
  • 2020-12-10 11:06

    Your question is not quite clear to me, but if we have

    DateTime? ExpireDateTime;  // could be a variable or a property
    

    it's OK to say just

    if (ExpireDateTime < DateTime.UtcNow)
    {
      ...
    }
    

    This will be OK if ExpireDateTime is null (HasValue is false). Some inexperienced developers will struggle to understand lifted operators, so to make it more clear, you could write

    if (ExpireDateTime < (DateTime?)DateTime.UtcNow)
    {
      ...
    }
    

    It's the same, but easier to read and understand.

    Never write .Value if the nullable might be null, of course. You will get an InvalidOperationException "Nullable object must have a value" if you do so.

    0 讨论(0)
提交回复
热议问题