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


当前回答

最短的回答

$"{dt:yyyy-MM-dd hh:mm:ss}"

测试

DateTime dt1 = DateTime.Now;
Console.Write("Test 1: ");
Console.WriteLine($"{dt1:yyyy-MM-dd hh:mm:ss}"); //works

DateTime? dt2 = DateTime.Now;
Console.Write("Test 2: ");
Console.WriteLine($"{dt2:yyyy-MM-dd hh:mm:ss}"); //Works

DateTime? dt3 = null;
Console.Write("Test 3: ");
Console.WriteLine($"{dt3:yyyy-MM-dd hh:mm:ss}"); //Works - Returns empty string

Output
Test 1: 2017-08-03 12:38:57
Test 2: 2017-08-03 12:38:57
Test 3: 

其他回答

简单的通用扩展

public static class Extensions
{

    /// <summary>
    /// Generic method for format nullable values
    /// </summary>
    /// <returns>Formated value or defaultValue</returns>
    public static string ToString<T>(this Nullable<T> nullable, string format, string defaultValue = null) where T : struct
    {
        if (nullable.HasValue)
        {
            return String.Format("{0:" + format + "}", nullable.Value);
        }

        return defaultValue;
    }
}

你可以使用简单的线条:

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

下面是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";
}

我认为你必须使用getvalueordefault - method。如果实例为空,则不定义ToString("yy…")的行为。

dt2.GetValueOrDefault().ToString("yyy...");

这个问题的问题在于,当可为空的datetime没有值时,您没有指定所需的输出。下面的代码将输出DateTime。MinValue在这种情况下,与当前接受的答案不同,将不会抛出异常。

dt2.GetValueOrDefault().ToString(format);