如何将可为空的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方法没有重载 一个论点
答案 0 :(得分:291)
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开始,您可以使用null-conditional operator来进一步简化代码。如果DateTime?
为空,则下面的表达式将返回null。
dt2?.ToString("yyyy-MM-dd hh:mm:ss")
答案 1 :(得分:78)
尝试使用此尺寸:
您希望格式化的实际dateTime对象位于dt.Value属性中,而不是dt2对象本身。
DateTime? dt2 = DateTime.Now;
Console.WriteLine(dt2.HasValue ? dt2.Value.ToString("yyyy-MM-dd hh:mm:ss") : "[N/A]");
答案 2 :(得分:32)
你们这些人都在设计这一切并使其变得比实际更复杂。重要的是,停止使用ToString并开始使用字符串格式,如string.Format或支持字符串格式的方法,如Console.WriteLine。以下是此问题的首选解决方案。这也是最安全的。
我使用当今C#编译器的最新方法更新示例。 conditional operators& string interpolation
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://docs.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://docs.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'
''
答案 3 :(得分:30)
正如其他人所说,你需要在调用ToString之前检查null,但为了避免重复你自己,你可以创建一个扩展方法来做到这一点,如:
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'
答案 4 :(得分:24)
C#6.0宝贝:
let recognizer = UILongPressGestureRecognizer(target: mapController, action: "action:")
答案 5 :(得分:14)
制定此问题答案的问题是,当可空日期时间没有值时,您不指定所需的输出。在这种情况下,以下代码将输出DateTime.MinValue
,与当前接受的答案不同,不会抛出异常。
dt2.GetValueOrDefault().ToString(format);
答案 6 :(得分:7)
看到你确实想要提供我建议的格式,以便将这样的IFormattable接口添加到Smalls扩展方法中,这样就不会有令人讨厌的字符串格式连接。
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
}
答案 7 :(得分:5)
你可以使用dt2.Value.ToString("format")
,但当然要求dt2!= null,并且首先否定使用可空类型。
这里有几种解决方案,但最大的问题是:您希望如何设置null
日期的格式?
答案 8 :(得分:5)
这是一种更通用的方法。这将允许您对任何可以为null的值类型进行字符串格式化。我已经包含了第二种方法来允许覆盖默认字符串值,而不是使用值类型的默认值。
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;
}
}
答案 9 :(得分:5)
如此简单的事情:
String.Format("{0:dd/MM/yyyy}", d2)
答案 10 :(得分:3)
即使是C#6.0中更好的解决方案:
DateTime? birthdate;
birthdate?.ToString("dd/MM/yyyy");
答案 11 :(得分:3)
最短的答案
$"{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:
答案 12 :(得分:2)
RAZOR语法:
@(myNullableDateTime?.ToString("yyyy-MM-dd") ?? String.Empty)
答案 13 :(得分:2)
以下是Blake's excellent answer作为扩展方法。将此添加到您的项目中,问题中的调用将按预期工作
这意味着它像MyNullableDateTime.ToString("dd/MM/yyyy")
一样使用,输出与MyDateTime.ToString("dd/MM/yyyy")
相同,但如果DateTime为null,则值为"N/A"
。
public static string ToString(this DateTime? date, string format)
{
return date != null ? date.Value.ToString(format) : "N/A";
}
答案 14 :(得分:2)
我认为你必须使用GetValueOrDefault-Methode。如果实例为null,则不定义ToString(“yy ...”)的行为。
dt2.GetValueOrDefault().ToString("yyy...");
答案 15 :(得分:1)
我喜欢这个选项:
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss") ?? "n/a");
答案 16 :(得分:1)
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);
}
}
答案 17 :(得分:0)
简单的通用扩展
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;
}
}
答案 18 :(得分:-1)
你可以使用简单的行:
dt2.ToString("d MMM yyyy") ?? ""
答案 19 :(得分:-1)
也许这是一个迟到的答案,但可以帮助其他人。
简单就是:
nullabledatevariable.Value.Date.ToString("d")
或者只使用任何格式而不是&#34; d&#34;。
最佳