我怎样才能格式可空的DateTime与ToString()?

如何将可空的DateTime dt2转换为格式化的string?

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"); 

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

试试这个大小:

你想要格式化的实际dateTime对象是在dt.Value属性中,而不是在dt2对象本身。

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

正如其他人所说,你需要在调用ToString之前检查null,但为了避免重复你自己,你可以创build一个扩展方法来做到这一点,就像:

 public static class DateTimeExtensions { public static string ToStringOrDefault(this DateTime? source, string format, string defaultValue) { if (source != null) { return source.Value.ToString(format); } else { return String.IsNullOrEmpty(defaultValue) ? String.Empty : defaultValue; } } public static string ToStringOrDefault(this DateTime? source, string format) { return ToStringOrDefault(source, format, null); } } 

可以像这样调用:

 DateTime? dt = DateTime.Now; dt.ToStringOrDefault("yyyy-MM-dd hh:mm:ss"); dt.ToStringOrDefault("yyyy-MM-dd hh:mm:ss", "n/a"); dt = null; dt.ToStringOrDefault("yyyy-MM-dd hh:mm:ss", "n/a") //outputs 'n/a' 

你们已经完成了所有的工作,并使之变得更加复杂。 重要的是,停止使用ToString,并开始使用string格式,如string.Format或支持string格式如Console.WriteLine的方法。 这是这个问题的首选解决scheme。 这也是最安全的。

 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); 

输出:(我把单引号,所以你可以看到,它返回为空string时为空)

 '2014-01-22 09:41:32' '' 

C#6.0宝贝:

dt2?.ToString("dd/MM/yyyy");

解决这个问题的答案的问题是,当可空的date时间没有值时,您不指定所需的输出。 在这种情况下,下面的代码将输出DateTime.MinValue ,而不像当前接受的答案,不会抛出exception。

 dt2.GetValueOrDefault().ToString(format); 

看到你实际上想要提供的格式,我build议将IFormattable接口添加到Smalls扩展方法像这样,这样你就没有讨厌的string格式连接。

 public static string ToString<T>(this T? variable, string format, string nullValue = null) where T: struct, IFormattable { return (variable.HasValue) ? variable.Value.ToString(format, null) : nullValue; //variable was null so return this value instead } 

你可以使用dt2.Value.ToString("format") ,但是当然这需要dt2!= null,并且首先否定使用可为空的types。

这里有几个解决scheme,但最大的问题是:你想如何格式化一个nulldate?

这是一个更通用的方法。 这将允许您对任何可以为null的值types进行string格式化。 我已经包括第二种方法,以允许覆盖默认的string值,而不是使用值types的默认值。

 public static class ExtensionMethods { public static string ToString<T>(this Nullable<T> nullable, string format) where T : struct { return String.Format("{0:" + format + "}", nullable.GetValueOrDefault()); } public static string ToString<T>(this Nullable<T> nullable, string format, string defaultValue) where T : struct { if (nullable.HasValue) { return String.Format("{0:" + format + "}", nullable.Value); } return defaultValue; } } 

那么简单的事情呢?

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

我认为你必须使用GetValueOrDefault-Methode。 如果实例为null,则未定义ToString(“yy …”)的行为。

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

IFormattable还包括一个可以使用的格式提供程序,它允许IFormatProvider的格式在dotnet 4.0中为null,这将是

 /// <summary> /// Extentionclass for a nullable structs /// </summary> public static class NullableStructExtensions { /// <summary> /// Formats a nullable struct /// </summary> /// <param name="source"></param> /// <param name="format">The format string /// If <c>null</c> use the default format defined for the type of the IFormattable implementation.</param> /// <param name="provider">The format provider /// If <c>null</c> the default provider is used</param> /// <param name="defaultValue">The string to show when the source is <c>null</c>. /// If <c>null</c> an empty string is returned</param> /// <returns>The formatted string or the default value if the source is <c>null</c></returns> public static string ToString<T>(this T? source, string format = null, IFormatProvider provider = null, string defaultValue = null) where T : struct, IFormattable { return source.HasValue ? source.Value.ToString(format, provider) : (String.IsNullOrEmpty(defaultValue) ? String.Empty : defaultValue); } } 

与命名参数一起使用,您可以执行:

dt2.ToString(defaultValue:“n / a”);

在旧版本的dotnet中,你会得到很多重载

 /// <summary> /// Extentionclass for a nullable structs /// </summary> public static class NullableStructExtensions { /// <summary> /// Formats a nullable struct /// </summary> /// <param name="source"></param> /// <param name="format">The format string /// If <c>null</c> use the default format defined for the type of the IFormattable implementation.</param> /// <param name="provider">The format provider /// If <c>null</c> the default provider is used</param> /// <param name="defaultValue">The string to show when the source is <c>null</c>. /// If <c>null</c> an empty string is returned</param> /// <returns>The formatted string or the default value if the source is <c>null</c></returns> public static string ToString<T>(this T? source, string format, IFormatProvider provider, string defaultValue) where T : struct, IFormattable { return source.HasValue ? source.Value.ToString(format, provider) : (String.IsNullOrEmpty(defaultValue) ? String.Empty : defaultValue); } /// <summary> /// Formats a nullable struct /// </summary> /// <param name="source"></param> /// <param name="format">The format string /// If <c>null</c> use the default format defined for the type of the IFormattable implementation.</param> /// <param name="defaultValue">The string to show when the source is null. If <c>null</c> an empty string is returned</param> /// <returns>The formatted string or the default value if the source is <c>null</c></returns> public static string ToString<T>(this T? source, string format, string defaultValue) where T : struct, IFormattable { return ToString(source, format, null, defaultValue); } /// <summary> /// Formats a nullable struct /// </summary> /// <param name="source"></param> /// <param name="format">The format string /// If <c>null</c> use the default format defined for the type of the IFormattable implementation.</param> /// <param name="provider">The format provider (if <c>null</c> the default provider is used)</param> /// <returns>The formatted string or an empty string if the source is <c>null</c></returns> public static string ToString<T>(this T? source, string format, IFormatProvider provider) where T : struct, IFormattable { return ToString(source, format, provider, null); } /// <summary> /// Formats a nullable struct or returns an empty string /// </summary> /// <param name="source"></param> /// <param name="format">The format string /// If <c>null</c> use the default format defined for the type of the IFormattable implementation.</param> /// <returns>The formatted string or an empty string if the source is null</returns> public static string ToString<T>(this T? source, string format) where T : struct, IFormattable { return ToString(source, format, null, null); } /// <summary> /// Formats a nullable struct /// </summary> /// <param name="source"></param> /// <param name="provider">The format provider (if <c>null</c> the default provider is used)</param> /// <param name="defaultValue">The string to show when the source is <c>null</c>. If <c>null</c> an empty string is returned</param> /// <returns>The formatted string or the default value if the source is <c>null</c></returns> public static string ToString<T>(this T? source, IFormatProvider provider, string defaultValue) where T : struct, IFormattable { return ToString(source, null, provider, defaultValue); } /// <summary> /// Formats a nullable struct or returns an empty string /// </summary> /// <param name="source"></param> /// <param name="provider">The format provider (if <c>null</c> the default provider is used)</param> /// <returns>The formatted string or an empty string if the source is <c>null</c></returns> public static string ToString<T>(this T? source, IFormatProvider provider) where T : struct, IFormattable { return ToString(source, null, provider, null); } /// <summary> /// Formats a nullable struct or returns an empty string /// </summary> /// <param name="source"></param> /// <returns>The formatted string or an empty string if the source is <c>null</c></returns> public static string ToString<T>(this T? source) where T : struct, IFormattable { return ToString(source, null, null, null); } } 

最短的答案

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

testing

 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: 

我喜欢这个选项:

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

这是Blake作为扩展方法的出色答案 。 将其添加到您的项目中,问题中的调用将按预期工作。 因为它像MyNullableDateTime.ToString("dd/MM/yyyy") ,与MyDateTime.ToString("dd/MM/yyyy")具有相同的输出,除非值为"N/A" DateTime为空。

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

简单的通用扩展

 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; } } 

也许这是一个迟到的答案,但可能会帮助其他人。

简单的是:

 nullabledatevariable.Value.Date.ToString("d") 

或者只是使用任何格式而不是“d”。

最好

你可以使用简单的线条:

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