如何将可空的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方法没有重载 一个参数


当前回答

你可以使用简单的线条:

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

其他回答

您可以使用dt2. value . tostring ("format"),但当然这需要dt2 != null,这首先就否定了可空类型的使用。

这里有几个解决方案,但最大的问题是:您希望如何格式化空日期?

c# 6.0宝贝:

dt2 ? . ToString(“dd / MM / yyyy”);

试试这个尺寸:

您希望格式化的实际dateTime对象在dt中。Value属性,而不是dt2对象本身。

DateTime? dt2 = DateTime.Now;
 Console.WriteLine(dt2.HasValue ? dt2.Value.ToString("yyyy-MM-dd hh:mm:ss") : "[N/A]");

你们把事情搞得太复杂了。重要的是,停止使用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'
''

我喜欢这个选项:

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