【问题标题】:nullable datetimes可为空的日期时间
【发布时间】:2011-05-25 13:24:55
【问题描述】:

我有 1 个不可为空的日期时间字段和 1 个可空的。我可以将以下代码与不可为空的代码一起使用:

 c.StartDate.Day.ToString() + "/" + 
 c.StartDate.Month.ToString() + "/" + 
 c.StartDate.Year.ToString()

但是当我尝试使用可为空的执行此操作时,我得到了错误:

“System.Nullable”不包含“Day”的定义,并且找不到接受“System.Nullable”类型的第一个参数的扩展方法“Day”(您是否缺少 using 指令或程序集引用? )

如何获取可为空的日期时间的日、月、年?

【问题讨论】:

    标签: c#


    【解决方案1】:

    你必须在你的 nullable 上使用 .Value 属性:

    c.StartDate.Value.Day.ToString()  //etc
    

    检查null后,您可以:

     c.StartDate.Value.ToString("dd-MMM-yyyy");
    

    【讨论】:

    • 但如果需要先检查 HasValue
    • 为了安全起见,我还会添加一个空检查或使用 .GetValueOrDefault()。
    • 或者,您可以将一个新变量强制转换为不可为空的日期时间 - var startDate = (DateTime)c.StartDate;,然后 startDate.Day 应该可以工作。
    【解决方案2】:
    if(c.StartDate.HasValue)
    {
      DateTime sd = c.StartDate.Value;
      str = sd.Day.ToString() + "/" + sd.Month.ToString() + "/" + sd.Year.ToString()
    }
    else
      str = "some alternative for when there's no date";
    

    更简单:

    string str = c.StartDate.HasValue ? c.StartDate.value.ToString(@"d\/M\/yyyy") ? "some alternative for when there's no date";
    

    【讨论】:

      【解决方案3】:
      if(c.EndDate.HasValue)
      {
          c.EndDate.Value.Day.ToString() + ...
      }
      

      您可能还想检查日期的ToString() 并将其转换为仅具有一种格式模式且没有连接的字符串。

      【讨论】:

        【解决方案4】:

        您希望结果是什么? "//"

        您可以创建返回“”的扩展方法,但您仍然存在您希望最终结果实际是什么的问题。

        【讨论】:

          猜你喜欢
          • 2023-03-26
          • 1970-01-01
          • 2015-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-01
          • 2013-12-22
          • 2012-10-09
          相关资源
          最近更新 更多