Как я могу отформатировать nullable DateTime с ToString ()?

InstanceOf является предупреждением плохого Объектно-ориентированного проектирования.

Текущие JVMs означают , instanceOf не является большой частью беспокойства производительности сам по себе. Если Вы используете его много, специально для базовой функциональности, пора, вероятно, посмотреть на дизайн. Производительность (и простота/пригодность для обслуживания) усиления рефакторинга к лучшему дизайну значительно перевесит любые фактические циклы процессора, потраченные на фактическое вызов instanceOf.

Для предоставления очень небольшого упрощенного примера программирования.

if (SomeObject instanceOf Integer) {
  [do something]
}
if (SomeObject instanceOf Double) {
  [do something different]
}

плохая архитектура, лучший выбор состоял бы в том, чтобы сделать, чтобы SomeObject был родительским классом двух дочерних классов, где каждый дочерний класс переопределяет метод (doSomething), таким образом, код выглядел бы как таковым:

Someobject.doSomething();
213
задан Edward Tanguay 2 December 2009 в 03:57
поделиться

7 ответов

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 чтобы еще больше упростить код. Приведенное ниже выражение вернет null, если DateTime? имеет значение null.

dt2?.ToString("yyyy-MM-dd hh:mm:ss")
311
ответ дан 23 November 2019 в 04:27
поделиться

Я думаю, вам нужно использовать GetValueOrDefault-Methode. Поведение с ToString ("yy ...") не определено, если экземпляр имеет значение NULL.

dt2.GetValueOrDefault().ToString("yyy...");
2
ответ дан 23 November 2019 в 04:27
поделиться

Как утверждали другие, вам необходимо проверить значение null перед вызовом ToString, но, чтобы не повторяться, вы можете создать метод расширения, который делает это, например:

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'
30
ответ дан 23 November 2019 в 04:27
поделиться

Проблема с формулировкой ответа на этот вопрос заключается в том, что вы не указываете желаемый результат, когда значение datetime, допускающее значение NULL, не имеет. Следующий код выведет DateTime.MinValue в таком случае и, в отличие от принятого в настоящее время ответа, не вызовет исключения.

dt2.GetValueOrDefault().ToString(format);
14
ответ дан 23 November 2019 в 04:27
поделиться

Вы можете использовать dt2.Value.ToString ("формат") , но, конечно, для этого требуется, чтобы dt2! = null, а это в первую очередь отрицает использование типа, допускающего значение NULL.

Здесь есть несколько решений, но главный вопрос: как вы хотите отформатировать дату null ?

5
ответ дан 23 November 2019 в 04:27
поделиться

Примерьте этот размер:

Фактический объект dateTime, который вы хотите форматировать, находится в свойстве dt.Value, а не в самом объекте dt2.

DateTime? dt2 = DateTime.Now;
 Console.WriteLine(dt2.HasValue ? dt2.Value.ToString("yyyy-MM-dd hh:mm:ss") : "[N/A]");
79
ответ дан 23 November 2019 в 04:27
поделиться

Вот более общий подход. Это позволит вам форматировать строку любого типа значения с нулевым значением. Я включил второй метод, чтобы можно было переопределить значение строки по умолчанию вместо того, чтобы использовать значение по умолчанию для типа значения.

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;
    }
}
5
ответ дан 23 November 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: