Как я могу преобразовать обнуляемый 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 принимает один аргумент
c#
datetime
formatting
nullable
Эдвард Тангей
источник
источник
Ответы:
РЕДАКТИРОВАТЬ: Как указано в других комментариях, проверьте, что есть ненулевое значение.
Обновление: как рекомендуется в комментариях, метод расширения:
И начиная с C # 6, вы можете использовать нулевой условный оператор, чтобы еще больше упростить код. Выражение ниже вернет ноль, если
DateTime?
ноль.источник
Попробуйте это для размера:
Фактический объект dateTime, который вы хотите отформатировать, находится в свойстве dt.Value, а не в самом объекте dt2.
источник
Вы, ребята, уже спроектировали все это и сделали его намного сложнее, чем на самом деле. Важная вещь, прекратите использовать ToString и начните использовать форматирование строк, например string.Format или методы, которые поддерживают форматирование строк, например Console.WriteLine. Вот предпочтительное решение этого вопроса. Это также самый безопасный.
Обновить:
Я обновляю примеры современными методами сегодняшнего компилятора C #. условные операторы и интерполяция строк
Вывод: (я поместил в него одинарные кавычки, чтобы вы могли видеть, что он возвращается как пустая строка, когда ноль)
источник
Как уже говорили другие, перед вызовом ToString необходимо проверить наличие нуля, но чтобы избежать повторения, вы можете создать метод расширения, который делает это, что-то вроде:
Который может быть вызван как:
источник
C # 6.0 детка:
dt2?.ToString("dd/MM/yyyy");
источник
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss" ?? "n/a");
Проблема с формулировкой ответа на этот вопрос заключается в том, что вы не указываете желаемый результат, если значение даты и времени, обнуляемое значением, не имеет значения. Следующий код выведет
DateTime.MinValue
в таком случае и, в отличие от принятого в настоящее время ответа, не сгенерирует исключение.источник
Видя, что вы на самом деле хотите предоставить формат, я бы предложил добавить интерфейс IFormattable в метод расширения Smalls следующим образом, чтобы у вас не было конкатенации форматов с неприятными строками.
источник
Как насчет чего-то такого простого:
источник
Вы можете использовать
dt2.Value.ToString("format")
, но, конечно, для этого требуется, чтобы dt2! = Null, и это в первую очередь сводит на нет использование nullable типа.Здесь есть несколько решений, но главный вопрос: как вы хотите отформатировать
null
дату?источник
Вот более общий подход. Это позволит вам отформатировать любой тип значения, допускающий значение NULL. Я включил второй метод, позволяющий переопределить строковое значение по умолчанию вместо использования значения по умолчанию для типа значения.
источник
Кратчайший ответ
тесты
источник
Еще лучшее решение в C # 6.0:
источник
Синтаксис бритвы:
источник
Я думаю, что вы должны использовать GetValueOrDefault-Methode. Поведение с ToString ("yy ...") не определено, если экземпляр является нулевым.
источник
Вот отличный ответ Блейка как метод расширения. Добавьте это в свой проект, и звонки в вопросе будут работать как положено.
Это означает, что он используется как
MyNullableDateTime.ToString("dd/MM/yyyy")
с тем же выводомMyDateTime.ToString("dd/MM/yyyy")
, что и за исключением того, что значение будет,"N/A"
если DateTime равно нулюисточник
IFormattable также включает поставщика формата, который можно использовать, он позволяет обоим форматам IFormatProvider быть нулевым в dotnet 4.0, это будет
используя вместе с именованными параметрами вы можете сделать:
dt2.ToString (defaultValue: "n / a");
В старых версиях dotnet вы получаете много перегрузок
источник
Мне нравится этот вариант:
источник
Простые общие расширения
источник
Может быть, это поздний ответ, но может помочь кому-то еще.
Простое это:
или просто используйте любой формат, а не "d".
Лучший
источник
Вы можете использовать простую строку:
источник