Учитывая объект DateTime, как я могу получить дату ISO 8601 в строковом формате?

Короткий ответ на оба: вы не можете, и вы все равно не должны. Вы должны проверить свои инструменты в своей системе управления исходным кодом и загрузить его в своих установщиках из проверки. Таким образом, у вас есть контроль над версиями, которые вы распространяете, вместо того, чтобы выбирать произвольные версии из GAC.

Примечание: DiskId и Vital по умолчанию имеют значения, которые вы даете, поэтому вы можете сохранить некоторую типизацию только опуская их.

709
задан Peter Mortensen 14 December 2016 в 20:18
поделиться

5 ответов

Примечание читателям: Несколько комментаторов указали на некоторые проблемы в этом ответе (связанный особенно с первым предложением). Обратитесь к разделу комментариев для получения дополнительной информации.

DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");

Это дает Вам дату, подобную [1 112] 2008-09-22T13:57:31.2311892-04:00.

Иначе:

DateTime.UtcNow.ToString("o");

, который дает Вам 2008-09-22T14:01:54.9571247Z

Для получения указанного формата, можно использовать:

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")

Параметры форматирования DateTime

709
ответ дан Phil 14 December 2016 в 20:18
поделиться

Преобразовать DateTime. UtcNow к строковому представлению yyyy-MM-ddTHH:mm:ssZ, можно использовать ToString () метод структуры DateTime с пользовательской строкой форматирования. При использовании пользовательских строк формата с DateTime важно помнить, что необходимо выйти разделителей с помощью одинарных кавычек.

следующее возвратит строку represention, Вы хотели:

DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)
9
ответ дан Peter Mortensen 14 December 2016 в 20:18
поделиться
DateTime.UtcNow.ToString("s")

Возвраты что-то как 2008-04-10T06:30:00

UtcNow, очевидно, возвращается время UTC , таким образом, нет никакого вреда в:

string.Concat(DateTime.UtcNow.ToString("s"), "Z")
69
ответ дан Peter Mortensen 14 December 2016 в 20:18
поделиться

DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture) должен дать Вам, что Вы ищете, поскольку "s" спецификатор формата описан как поддающийся сортировке шаблон даты/времени; соответствует ISO 8601.

320
ответ дан Peter Mortensen 14 December 2016 в 20:18
поделиться

Как упомянуто в другом ответе, DateTime имеет выпуски дизайном.

NodaTime

я предлагаю использовать NodaTime для управления датой/временными стоимостями:

  • Местное время, дата, дата и время
  • Глобальное время
  • Время с часовым поясом
  • Период
  • Продолжительность

Форматирование

Так, для создания и формат ZonedDateTime можно использовать следующий фрагмент кода:

var instant1 = Instant.FromUtc(2020, 06, 29, 10, 15, 22);

var utcZonedDateTime = new ZonedDateTime(instant1, DateTimeZone.Utc);
utcZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T10:15:22Z


var instant2 = Instant.FromDateTimeUtc(new DateTime(2020, 06, 29, 10, 15, 22, DateTimeKind.Utc));

var amsterdamZonedDateTime = new ZonedDateTime(instant2, DateTimeZoneProviders.Tzdb["Europe/Amsterdam"]);
amsterdamZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T12:15:22Z

Для меня NodaTime код выглядит довольно подробным. Но типы действительно полезны. Они помогают обработать дату/временные стоимости правильно.

Newtonsoft. Json

Для использования NodaTime с Newtonsoft.Json необходимо добавить ссылку на NodaTime.Serialization.JsonNet пакет NuGet и настроить опции JSON.

services
    .AddMvc()
    .AddJsonOptions(options =>
    {
        var settings=options.SerializerSettings;
        settings.DateParseHandling = DateParseHandling.None;
        settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
    });
0
ответ дан Vladimir Serykh 14 September 2019 в 17:19
поделиться
  • 1
    ... и локализуйте состояние как можно больше: более легкая отладка. – jldupont 17 September 2009 в 15:26
Другие вопросы по тегам:

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