如何将空值初始化为datetime变量?

时间:2017-04-29 00:13:49

标签: c# asp.net

我正在尝试检查DateTime变量"starttime""endtime"是否有null值,然后尝试初始化为empty值,如下所示,但我遇到了编译错误。实现这一目标的最佳方法是什么?

string htmllink = "";
DateTime? starttime = null;
DateTime? endtime = null;
htmllink = (dbNullCheck.isColumnNull(rdr, "html_link")) ? "" : rdr.GetString(3);
starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? "" : rdr.GetString(4);
endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? "" : rdr.GetString(5);

results.htmllist.Add(new gethtmllist() { resulthtmllink = htmllink, 
    duration = (starttime - endtime).ToString() });

错误:

  

错误2无法将类型'string'隐式转换为'System.DateTime?'

更新: -

                string htmllink = "";
                htmllink = (dbNullCheck.isColumnNull(rdr, "html_link")) ? "" : rdr.GetString(3);                    
                DateTime? starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? new DateTime() : rdr.GetDateTime(4);
                DateTime?  endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? new DateTime() : rdr.GetDateTime(5);

               results.htmllist.Add(new gethtmllist()
                {
                    resulthtmllink = htmllink,
                    duration = starttime.HasValue && endtime.HasValue ? (endtime.Value - starttime.Value).ToString() : ""
                });

4 个答案:

答案 0 :(得分:1)

问题似乎是您尝试将starttimeendtime设置为字符串值,当您最初将它们声明为DateTime?类型时。要解决此问题,您需要将它们声明为字符串以开始,或者在赋值期间将值转换为有效的DateTime?类型。

DateTime? starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) 
    ? null 
    : rdr.GetDateTime(4);

DateTime? endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) 
    ? null 
    : rdr.GetDateTime(5);

然后,当您计算持续时间时,您可能需要检查空值(或HasValue的{​​{1}})。我还更改了操作数的顺序,以便从DateTime?中减去starttime(否则您可能会有endtime的负数):

duration

答案 1 :(得分:1)

您无法将日期设置为字符串

loaded_epoch = sess.run(global_step)//(batch_size*num_train_records)

应该是

starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? "" : rdr.GetString(4);
endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? "" : rdr.GetString(5);

答案 2 :(得分:1)

请使用DateTime.Parse方法将字符串转换为有效的DateTime对象。

使用DateTime?之类的Nullable Types时,您应该使用HasValue属性检查是否存在值,要获取值,请使用Value属性。

string htmllink = "";
htmllink = (dbNullCheck.isColumnNull(rdr, "html_link")) ? "" : rdr.GetString(3);
DateTime? starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? default(DateTime?) : DateTime.Parse(rdr.GetString(4));
DateTime? endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? (DateTime?)null : DateTime.Parse(rdr.GetString(5));

results.htmllist.Add(new gethtmllist() { resulthtmllink = htmllink, 
duration = starttime.HasValue && endtime.HasValue ? (starttime.Value - endtime.Value).ToString() : "there is no duration" });

为了在具有可空类型的trenary表达式中使用null,请记住使用(DateTime?)nulldefault(DateTime?)将其强制转换为预期类型。请参阅why this is needed

答案 3 :(得分:1)

我尝试使用string.Empty来测试:starttime = string.IsNullOrEmpty(str) ? (DateTime?)null : DateTime.Now;

它成功了。所以你的代码可能是:

starttime = (dbNullCheck.isColumnNull(rdr, "start_time")) ? (DateTime?)null : rdr.GetDateTime(4);
    endtime = (dbNullCheck.isColumnNull(rdr, "end_time")) ? (DateTime?)null: rdr.GetDateTime(5);

更新1: string.Empty的.Net小提琴示例:Link