如何将可空的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方法没有重载
一个参数
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")
你们把事情搞得太复杂了。重要的是,停止使用ToString,开始使用字符串格式,比如string。支持字符串格式的格式或方法,如Console.WriteLine。下面是这个问题的最佳解决方案。这也是最安全的。
更新:
我用当前c#编译器的最新方法更新了示例。条件操作符和字符串插值
DateTime? dt1 = DateTime.Now;
DateTime? dt2 = null;
Console.WriteLine("'{0:yyyy-MM-dd hh:mm:ss}'", dt1);
Console.WriteLine("'{0:yyyy-MM-dd hh:mm:ss}'", dt2);
// New C# 6 conditional operators (makes using .ToString safer if you must use it)
// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators
Console.WriteLine(dt1?.ToString("yyyy-MM-dd hh:mm:ss"));
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss"));
// New C# 6 string interpolation
// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated
Console.WriteLine($"'{dt1:yyyy-MM-dd hh:mm:ss}'");
Console.WriteLine($"'{dt2:yyyy-MM-dd hh:mm:ss}'");
输出:(我在里面放了单引号,所以你可以看到它返回为空字符串时为null)
'2019-04-09 08:01:39'
''
2019-04-09 08:01:39
'2019-04-09 08:01:39'
''