How to manage parsing an null object for DateTime

2020-08-13 11:43发布

I have two DateTime objects, BirthDate and HireDate. They are correctly formatted as a string and when I pass them through to my data access layer, they need to be parsed into a DateTime object.

DateTime hD = DateTime.Parse(hire);            
DateTime bD = DateTime.Parse(birth);

//incase of a datestring being passed through
dateStringPassed = "7/2/1969";

But sometimes, the strings hire and birth are null or empty "", if the code is run like this, I get a FormatException error from Parsing a empty string. How can I manage empty parses and allow the DateTime, if empty or null, be accepted as DBNull.Value?

I still cannot manage incase the user does not pass through a DateTime string, then the parse crashes my code.

My parameter for birth date is as follows and checks the variable if null, then use DBNull.Value.

3条回答
迷人小祖宗
2楼-- · 2020-08-13 12:00

The Parse method can't handle empty strings, but you can use nullable DateTime and do something like this:

DateTime? hD = String.IsNullOrEmpty(hire) ? (DateTime?)null : DateTime.Parse(hire)

But even safer would be using TryParse instead:

DateTime? hD = null;
DateTime.TryParse(hire, out hD);

Then for storing this value, you can test hD.HasValue:

if(hD.HasValue) { /* use hD */ }
else { /* else use DBNull.Value */ }

Since C# 7, you can use shorter syntax for inline out parameters and you can avoid nullable type altogether:

if (DateTime.TryParse(hire, out var hD)) { /* use hD */ }
else { /* use DBNull.Value */ }
查看更多
不美不萌又怎样
3楼-- · 2020-08-13 12:08

If you use this method, any thing that is not a correct date will return a DBNull.Value:

/// <summary>
/// Parses a date string and returns
/// a DateTime if it is a valid date,
/// if not returns DBNull.Value
/// </summary>
/// <param name="date">Date string</param>
/// <returns>DateTime or DBNull.Value</returns>
public static object CreateDBDateTime(string date)
{
    DateTime result;
    if (DateTime.TryParse(date, out result))
    {
        return result;
    }
    return DBNull.Value;
}
查看更多
仙女界的扛把子
4楼-- · 2020-08-13 12:24

You need to use nullable date times - the shortcut syntax would be DateTime? (note the ? at the end).

DateTime? hD = null;
if(!string.IsNullOrWhitespace(hire )) // string.IsNullOrEmpty if on .NET pre 4.0
{
   hD = DateTime.Parse(hire);            
}

You can test for hD.HasValue and if it doesn't use DbNull.Value instead.

查看更多
登录 后发表回答