我怎样才能格式可空的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,但最大的问题是:你想如何格式化一个null
date?
这是一个更通用的方法。 这将允许您对任何可以为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") ?? ""