ToString ()을 사용하여 nullable DateTime을 어떻게 포맷 할 수 있습니까?


226

nullable 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에 대한 과부하는 하나의 인수를 취하지 않습니다.


3
안녕하세요, 승인 된 답변과 현재 답변을 검토 하시겠습니까? 보다 관련성이 높은 오늘의 답변이 더 정확할 수 있습니다.
iuliu.net

답변:


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

편집 : 다른 의견에서 언급했듯이 null이 아닌 값이 있는지 확인하십시오.

업데이트 : 의견에서 권장하는 확장 방법 :

public static string ToString(this DateTime? dt, string format)
    => dt == null ? "n/a" : ((DateTime)dt).ToString(format);

그리고 C # 6부터는 null 조건부 연산자 를 사용하여 코드를 더욱 단순화 할 수 있습니다 . 아래 식은가 null 인 경우 null을 반환합니다 DateTime?.

dt2?.ToString("yyyy-MM-dd hh:mm:ss")

26
이것은 확장 방법을 요구하는 것 같습니다.
David Glenn

42
.Value가 핵심이다
stuartdotnet


3
준비가 되셨나요? dt? .ToString ( "dd / MMM / yyyy") ?? ""C # 6의 큰 장점
Tom McDonough

오류 CS0029 : 'string'형식을 'System.DateTime'으로 암시 적으로 변환 할 수 없습니까? (CS0029). .Net Core 2.0
Oracular Man

80

크기에 대해 이것을 시도하십시오 :

포맷하려는 실제 dateTime 객체는 dt2 객체 자체가 아니라 dt.Value 속성에 있습니다.

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

36

너희들은이 모든 것을 엔지니어링하고 실제로보다 복잡하게 만듭니다. 중요한 것은 ToString 사용을 중지하고 string.Format과 같은 문자열 형식을 사용하거나 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://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'
''

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'

28

C # 6.0 아기 :

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


2
이 답변이 C # 6.0의 기존 허용 답변과 동일하도록 다음 버전을 제안합니다. Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss" ?? "n/a");
Can Bud

15

이 질문에 대한 답변을 공식화 할 때의 문제점은 널 입력 가능 날짜 시간에 값이 없을 때 원하는 출력을 지정하지 않는다는 것입니다. 이 경우 다음 코드가 출력 DateTime.MinValue되며 현재 허용되는 답변과 달리 예외가 발생하지 않습니다.

dt2.GetValueOrDefault().ToString(format);

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   
}


5

을 사용할 수는 dt2.Value.ToString("format")있지만 dt2! = null이 필요하며 처음에는 nullable 유형의 사용을 무효화합니다.

여기에는 몇 가지 해결책이 있지만 큰 문제는 다음과 같습니다. null날짜 형식을 어떻게 지정 하시겠습니까?


5

보다 일반적인 접근 방식은 다음과 같습니다. 이를 통해 널 입력 가능 값 유형을 문자열 형식화 할 수 있습니다. 값 유형에 기본값을 사용하는 대신 기본 문자열 값을 무시할 수있는 두 번째 방법을 포함 시켰습니다.

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

4

최단 답변

$"{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: 


4

면도기 구문 :

@(myNullableDateTime?.ToString("yyyy-MM-dd") ?? String.Empty)

2

GetValueOrDefault-Methode를 사용해야한다고 생각합니다. 인스턴스가 null 인 경우 ToString ( "yy ...")의 동작은 정의되지 않습니다.

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

1
ToString ( "전년 동기 대비 ...")와 함께 동작 한다 GetValueOrDefault ()가 DateTime.MinValue 반환하기 때문에 인스턴스가 NULL의 경우, 정의
루카스

2

확장 방법으로서의 Blake의 탁월한 답변 은 다음과 같습니다 . 이것을 프로젝트에 추가하면 질문의 전화가 예상대로 작동합니다.
의미 는 DateTime이 null 인 경우 값이된다는 점을 제외하고 MyNullableDateTime.ToString("dd/MM/yyyy")와 같은 출력으로 사용 MyDateTime.ToString("dd/MM/yyyy")됩니다 "N/A".

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

1

IFormattable에는 사용할 수있는 형식 공급자도 포함되어 있으며 dotnet 4.0에서는 IFormatProvider의 두 형식이 모두 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");

이전 버전의 닷넷에서는 많은 과부하가 발생합니다.

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

1

나는이 옵션을 좋아한다 :

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

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

-2

아마도 답은 늦었지만 다른 사람을 도울 수 있습니다.

간단하다 :

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

또는 "d"가 아닌 다른 형식을 사용하십시오.

베스트


1
nullabledatevariable.Value가 null 인 경우 오류가 발생합니다.
John C

-2

간단한 줄을 사용할 수 있습니다.

dt2.ToString("d MMM yyyy") ?? ""
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.