Конвертировать DateTime? нанизывать


11

Я хочу преобразовать DateTime?в строку. Если дата равна нулю , то вернуться "", иначе возвращает формат строки , как это: "2020-03-05T07:52:59.665Z". Код примерно такой, но он не будет работать. Это сказало, "DateTime?"что не содержит определения для "ToUniversalTime". Кто-то знает, как это исправить?

DateTime? date = DateTime.UtcNow;

var dateInUTCString = date == null ? "" : date.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");

1
Кстати, ты просто хочешь .ToString("o")?
— Джон

О, я уже использую DateTime.UTCNow, поэтому мне больше не нужно использовать ToUniversalTime ()? @John. Ах, я вижу, .ToString("o")я буду исследовать больше. Спасибо!
— Приходи

1
В самом деле, и если вы просто хотите использовать формат ISO8601, вы можете использовать «o». Смотрите документы
— Джон

@John: «o» использует точность тиков, что может быть нежелательно, даже если оно соответствует ISO-8601.
— Джон Скит

1
«Но когда я использую .ToString (« o »), у него нет Z» - он будет, если вы по-прежнему вызываете ToUniversalTime (); «Z» происходит из-за того, что имеет вид UTC.
— Джон Скит

Ответы:


16

Дата и время? имеет свойство Value и свойство HasValue

Пытаться:

var dateInUTCString = date.HasValue ? date.Value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'") : "";

Вы можете использовать короткую версию:

var dateInUTCString = date?.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'") ?? "";

8

Хотя вы можете использовать Valueсвойство напрямую согласно ответу Лешека, я бы, вероятно, использовал условно-нулевой оператор в сочетании с оператором объединяющего нуль:

string dateInUTCString =
    date?.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture) 
    ?? "";

Здесь значение ?.просто приведет к нулевому значению, если dateравно нулю, и ??оператор предоставит значение по умолчанию, если результат date?.ToUniversalTime().ToString(...)вызова равен нулю (что будет происходить, только если dateравно нулю).

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

Если вы не возражаете против точности, выраженной в строке, вы можете упростить код, используя стандартную строку формата «O» :

string dateInUTCString = date?.ToUniversalTime().ToString("O") ?? "";

На этом этапе вам не нужно указывать, CultureInfo.InvariantCultureкак это всегда используется "O".


1
Почему бы не использовать "O"в качестве строки формата? docs.microsoft.com/en-us/dotnet/standard/base-types/…
— Зохар Пелед

1
@ZoharPeled: у этого есть точность тика, и OP, очевидно, хочет только точность в миллисекундах.
— Джон Скит

На самом деле я хочу формат, который имеет Zв конце строки
— camahe

1
@camahe: спецификатор формата «O» уже использует это - см. ссылку на документацию, которую опубликовал Zohar. Если вы действительно не возражаете против того, сколько цифр вы получите, использование «O» будет намного проще - вам не нужно указывать CultureInfo.InvariantCulture в этом случае. Измените ответ, чтобы добавить это в качестве опции.
— Джон Скит

2
@ Камахе: Пожалуйста, извлеките урок из этого, что, когда вы задаете вопрос, это помогает быть действительно точным в ваших требованиях.
— Джон Скит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.