如何将可空的DateTime dt2转换为格式化的字符串?

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss")); //works

DateTime? dt2 = DateTime.Now;
Console.WriteLine(dt2.ToString("yyyy-MM-dd hh:mm:ss")); //gives following error:

ToString方法没有重载 一个参数


当前回答

下面是Blake作为一种扩展方法给出的优秀答案。将此添加到项目中,问题中的调用将按预期工作。 这意味着它的使用类似MyNullableDateTime.ToString("dd/MM/yyyy"),输出与MyDateTime.ToString("dd/MM/yyyy")相同,只是如果DateTime为空,则该值将为"N/A"。

public static string ToString(this DateTime? date, string format)
{
    return date != null ? date.Value.ToString(format) : "N/A";
}

其他回答

剃须刀的语法:

@(myNullableDateTime?.ToString("yyyy-MM-dd") ?? String.Empty)

像这样简单的事情怎么样:

String.Format("{0:dd/MM/yyyy}", d2)

你可以使用简单的线条:

dt2.ToString("d MMM yyyy") ?? ""

我喜欢这个选项:

Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss") ?? "n/a");
Console.WriteLine(dt2 != null ? dt2.Value.ToString("yyyy-MM-dd hh:mm:ss") : "n/a"); 

编辑:如其他注释中所述,检查是否有一个非空值。

更新:如评论中推荐,扩展方法:

public static string ToString(this DateTime? dt, string format)
    => dt == null ? "n/a" : ((DateTime)dt).ToString(format);

从c# 6开始,您可以使用空条件操作符来进一步简化代码。如果DateTime?是零。

dt2?.ToString("yyyy-MM-dd hh:mm:ss")