【问题标题】:How to initialize an empty value to a datetime variable?如何将空值初始化为日期时间变量?
【发布时间】:2017-04-29 00:13:48
【问题描述】:

我正在尝试检查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 无法将类型“字符串”隐式转换为“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() : ""
                });

【问题讨论】:

  • rdr 有 GetDateTime 方法吗?或者 GetValue 返回您可能能够转换的对象?如果一切都失败了,则将字符串传递给 DateTime.Parse()。无论如何,空值只是空值。空很容易。你是从哪里得到 null 意味着任何东西而不是空的想法?

标签: c# asp.net


【解决方案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 Fiddle 示例:Link

【讨论】:

    【解决方案2】:

    您不能将日期设置为字符串

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

    应该是

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

    【讨论】:

    • 我的持续时间为 00:00:00,我想发送一个空字符串..怎么做,更新了最新的信息代码?
    • 空字符串不能是日期时间。如果这是您想要做的,您可以将其设置为 null,但无法从原始帖子中真正看出您的意图。
    【解决方案3】:

    问题似乎是您尝试将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);
    

    然后,当您计算持续时间时,您可能需要检查 null(或 HasValue,如果是 DateTime?)。我还更改了操作数的顺序,以便从 endtime 中减去 starttime(否则您可能会得到负的 duration):

    string duration = (starttime.HasValue && endtime.HasValue) 
        ? (endtime - starttime).ToString() 
        : "0";
    

    【讨论】:

    • 这给出了一个错误Error 2 Type of conditional expression cannot be determined because there is no implicit conversion between '<null>' and 'System.DateTime'
    【解决方案4】:

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

    当使用Nullable TypesDateTime? 时,您应该使用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" });
    

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

    【讨论】:

    • 甚至不应该编译。 Parse 需要一个字符串,而不是布尔值。
    • 在当前编辑中解决了这个问题。在手机上输入代码并不是你真正应该做的事情?
    • 这会引发错误Error 2 Type of conditional expression cannot be determined because there is no implicit conversion between '<null>' and 'System.DateTime'
    • 忘记了那个 C# 怪癖。请将该空值转换为预期的DateTime? 类型或使用default(DateTime?) 以修复该错误。请参阅why it is happening。我将更新示例代码。
    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 2019-05-17
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多