2013-07-25 3 views
9

У меня есть ISO 8601 метки времени в формате:Синтаксического ISO 8601 с часовым поясом в .NET DateTime

YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm] 

YYYY-MM-DDThh:mm:ss[{+|-}hh:mm] 

Примеры:

2013-07-03T02:16:03.000+01:00 

2013-07-03T02:16:03+01:00 

Как я могу разобрать его на .NET Framework DateTime с правильным TimeZone прилагается?

DateTime.TryParse не работает, потому что информация относительно TimeZone.

+0

возможный дубликат [DateTime.ParseExact , Игнорировать часовой пояс] (http://stackoverflow.com/questions/6676856/datetime-parseexact-ignore-the-timezone) – V4Vendetta

ответ

11

Вы должны иметь возможность форматировать его с помощью DateTimeOffset и K custom format specifier. Затем вы можете преобразовать это в DateTime, если хотите. Пример кода:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main() 
    { 
     string text = "2013-07-03T02:16:03.000+01:00"; 
     string pattern = "yyyy-MM-dd'T'HH:mm:ss.FFFK"; 
     DateTimeOffset dto = DateTimeOffset.ParseExact 
      (text, pattern, CultureInfo.InvariantCulture); 
     Console.WriteLine(dto); 
    } 
} 

Одна вещь, чтобы отметить, что это плохо назвали - это на самом деле не часовой пояс, это просто смещение UTC. Это не Фактически сообщит вам оригинальный часовой пояс. (Там может быть несколько различных временных зон наблюдения и то же смещение в то же время.)

Или с Noda Time (нестабильной версии, которая станет 1.2 довольно скоро):

string text = "2013-07-03T02:16:03.000+01:00"; 
OffsetDateTimePattern pattern = OffsetDateTimePattern.ExtendedIsoPattern; 
OffsetDateTime odt = pattern.Parse(text).Value; 
Console.WriteLine(odt);