Перетворити 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

DateTime? має властивість 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властивість безпосередньо відповідно до відповіді Лешека, я, ймовірно, використовую оператор-null в поєднанні з оператором, що поєднує null:

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

Тут ?.просто буде приведено до значення null, якщо datenull, і ??оператор надасть значення за замовчуванням, якщо результат date?.ToUniversalTime().ToString(...)виклику буде null (що відбудеться лише якщо datenull).

Зауважте, що ви дійсно хочете вказати інваріантну культуру, щоб уникнути отримання несподіваних результатів, коли культура поточного потоку не використовує григоріанський календар, і вам не потрібно цитувати всі ці літерали у рядку формату. Це, безумовно, працює, коли ви це робите, але важче читати ІМО.

Якщо ви не заперечуєте, яка точність виражається в рядку, ви можете спростити код за допомогою рядка стандартного формату "O" :

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

У цей момент вам не потрібно вказувати, CultureInfo.InvariantCultureяк це завжди використовується "O".


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

1
@ZoharPeled: Це має чітку точність, і ОП, мабуть, хоче лише мілісекундної точності.
Джон Скіт

Насправді я хочу, щоб формат був Zу кінці рядка
camahe

1
@camahe: Специфікатор формату "O" вже використовує це - дивіться посилання на документацію, яку розмістив Zohar. Якщо ви дійсно не заперечуєте, скільки цифр точності ви отримаєте, використання "O" було б набагато простіше - вам також не потрібно буде вказувати CultureInfo.InvariantCulture. Буде змінено відповідь, щоб додати це як варіант.
Джон Скіт

2
@camahe: Будь ласка, зробіть урок з цього, що коли ви задаєте питання, це допомагає бути дуже точним у ваших вимогах.
Джон Скіт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.