Вопрос

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

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

Я сам мог отделить части струны, но это кажется много работы для чего-то, что уже является международным стандартом.

Это было полезно?

Решение

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

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

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

Другие советы

Хотя 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-man-strings (я делаю), вы можете добавить строку «S», чтобы значительно продвинуть количество изменений в общих форматах.

using System.Globalization;

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

Вот тот, который работает лучше для меня (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 работать. Я думаю, точно так, и этот ответ очевиден, но в любом случае ...

В моем случае ответ Reb.cabin не работает, так как у меня немного другой вход в соответствии с моим «ценностью» ниже.

Стоимость: 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(...) Позволяет вам рассказать парсеру, что представляет каждый символ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top