Как создать a.NET дата и время из формата ISO 8601


Я нашел, как превратить DateTime в ISO 8601 формат, но ничего о том, как сделать обратное В C#.

у меня есть 2010-08-20T15:00:00Z и я хочу превратить его в

7 93

7 ответов:

Это решение использует DateTimeStyles перечисление, и он также работает с З.

DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);

это печатает решение отлично.

using System.Globalization;

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00",
    "s",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, out d);

хотя MSDN говорит, что форматы" s "и" o " отражают стандарт, они, похоже, могут анализировать только ограниченное подмножество. Особенно это проблема, если строка содержит спецификацию часового пояса. (Это также не относится к базовым форматам ISO8601 или форматам с пониженной точностью - однако это не совсем ваш случай.) Вот почему я использую строки пользовательского формата, когда речь заходит о разборе ISO8601. В настоящее время мой любимый фрагмент:

static readonly string[] formats = { 
    // Basic formats
    "yyyyMMddTHHmmsszzz",
    "yyyyMMddTHHmmsszz",
    "yyyyMMddTHHmmssZ",
    // Extended formats
    "yyyy-MM-ddTHH:mm:sszzz",
    "yyyy-MM-ddTHH:mm:sszz",
    "yyyy-MM-ddTHH:mm:ssZ",
    // All of the above with reduced accuracy
    "yyyyMMddTHHmmzzz",
    "yyyyMMddTHHmmzz",
    "yyyyMMddTHHmmZ",
    "yyyy-MM-ddTHH:mmzzz",
    "yyyy-MM-ddTHH:mmzz",
    "yyyy-MM-ddTHH:mmZ",
    // Accuracy reduced to hours
    "yyyyMMddTHHzzz",
    "yyyyMMddTHHzz",
    "yyyyMMddTHHZ",
    "yyyy-MM-ddTHHzzz",
    "yyyy-MM-ddTHHzz",
    "yyyy-MM-ddTHHZ"
    };

public static DateTime ParseISO8601String ( string str )
{
    return DateTime.ParseExact ( str, formats, 
        CultureInfo.InvariantCulture, DateTimeStyles.None );
}

Если вы не против разбора TZ-less strings (I do), вы можете добавить строку "s", чтобы значительно увеличить количество изменений формата.

вот тот, который работает лучше для меня ( LINQPad версия):

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00Z",
    @"yyyy-MM-dd\THH:mm:ss\Z",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, 
    out d);
d.ToString()

производит

true
8/20/2010 8:00:00 AM

представляется важным, чтобы в точности соответствовать формате ISO для TryParseExact на работу. Я думаю, что точно точно, и этот ответ очевиден для большинства, но в любом случае...

в моем случае, реб.Ответ кабины не работает, так как у меня есть немного другой вход в соответствии с моим "значением" ниже.

значение: 2012-08-10T14:00:00.000Z

есть некоторые дополнительные 000 там в течение миллисекунд, и там может быть больше.

однако, если я добавлю некоторые .fff в формат, как показано ниже, все в порядке.

Формат Строки: @"yyyy-MM-dd\THH:mm:ss.fff\Z"

в VS2010 немедленное окно:

DateTime.TryParseExact(value,@"yyyy-MM-dd\THH:mm:ss.fff\Z", CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal, out d);

правда

возможно, вам придется использовать DateTimeStyles.AssumeLocal а также в зависимости от того, в какой зоне ваше время...

Это прекрасно работает в LINQPad4:

Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00Z"));
Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00"));
Console.WriteLine(DateTime.Parse("2010-08-20 15:00:00"));

DateTime.ParseExact(...) позволяет сообщить синтаксическому анализатору, что представляет собой каждый символ.