【问题标题】:How to convert DateTime? to DateTime如何转换日期时间?到日期时间
【发布时间】:2019-12-05 19:16:58
【问题描述】:

我想将一个可为空的 DateTime (DateTime?) 转换为一个 DateTime,但我收到了一个错误:

无法隐式转换类型“System.DateTime?”至 '系统。日期时间'。存在显式转换(您是否缺少 演员?)

我尝试了以下方法:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate;

【问题讨论】:

    标签: c# .net datetime


    【解决方案1】:

    您想使用专门为此目的而设计的null-coalescing operator

    使用它你会得到这个代码。

    DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
    

    【讨论】:

    • 这是我在 Presenter 中使用的一个 sn-p,它使用可为空的日期/时间填充视图:memDateLogin = m.memDateLogin ?? DateTime.MinValue
    • '日期时间?'不包含“UpdatedDate”的定义
    【解决方案2】:

    MS 已经为此制定了一种方法,因此您不必使用 null 合并运算符。功能上没有区别,但非专业人士更容易一目了然。

    DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now);
    

    【讨论】:

      【解决方案3】:

      试试这个

      DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
      

      【讨论】:

      • 这里的关键是 null-coalescing 运算符,请参阅 chills42 的回答更多信息。
      【解决方案4】:

      您可以使用简单的演员表:

      DateTime dtValue = (DateTime) dtNullAbleSource;
      

      正如 Leandro Tupone 所说,您必须先检查 var 是否为空

      【讨论】:

      • 如果您在 +1 之前检查 var 是否为空,那就完美了
      【解决方案5】:

      您需要调用可空日期时间的Value 属性。这将返回一个 DateTime。

      假设UpdatedDateDateTime?,那么这应该可以:

      DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;

      为了使代码更易于阅读,您可以使用HasValue 属性而不是null 检查:

      DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue
                                ? _objHotelPackageOrder.UpdatedDate.Value
                                : DateTime.Now;
      

      这样可以更简洁:

      DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
      

      【讨论】:

        【解决方案6】:

        以下内容如何:

        DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue ? _objHotelPackageOrder.UpdatedDate.value : DateTime.Now;
        

        【讨论】:

          【解决方案7】:

          这是我在 Presenter 中使用的 sn-p,它使用可为空的日期/时间填充视图

          memDateLogin = m.memDateLogin ?? DateTime.MinValue
          

          【讨论】:

            【解决方案8】:

            你也可以试试Nullable(T) Properties:

            DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue 
                ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
            

            【讨论】:

              【解决方案9】:

              考虑使用以下比接受的答案更好的答案

              DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
                  ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;
              

              【讨论】:

              • 想说为什么更好?
              【解决方案10】:

              试试这个:

              DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
              

              【讨论】:

                【解决方案11】:
                DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;
                

                【讨论】:

                • 通常被认为是解释您的建议/答案的好方法。即使在技术上是正确的,仅代码的答案也可能会令人惊讶地缺乏信息。
                • @MaximilianAst 是的,你是对的,你会尝试按照你建议的方式实施 :)
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-10-05
                • 2014-01-24
                • 2011-11-11
                相关资源
                最近更新 更多