2010-04-05 1 views

ответ

11

Вы пробовали что-то вроде:

string dateString, format; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 

dateString = "Thu, 21 Jan 2010 17:47:00 EST"; 
format = "ddd, dd MMM yyyy hh:mm:ss EST"; 

result = DateTime.ParseExact(dateString, format, provider); 
Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 

Я не проверял еще (будет в несколько минут) ... но я верю, что это сделает для вас.

Редакция: Похоже, проблема заключается в том, что RFC1123 заявляет, что часовой пояс всегда должен быть GMT ..., поэтому r или R не работают как формат для вас. Проблема заключается в EST. Шаблон выше учитывает EST, но он статичен, поэтому, если у вас есть другой часовой пояс, у вас могут быть проблемы. Лучшим решением было бы пойти со стандартом RFC1123 и перейти на GMT, и он должен решить вашу проблему. Если вы не можете, сообщите мне, что у меня может быть решение.

Редактировать 2: Это не полное решение, но то, что он делает, изолирует часовой пояс и позволяет вам анализировать его. Код не знает часовой пояс, в котором он представлен, но вы можете бросить на него любую сокращенную временную зону, и он будет анализировать время. Если вы хотите конвертировать в GMT, а затем использовать r или R, вы можете взять результат совпадения регулярных выражений, поместить его в таблицу поиска (чтобы увидеть, какое время смещено для этой сокращенной временной области), а затем конвертировать время в GMT и разберитесь там. Это было бы хорошим решением, но немного больше работы. Вот код:

string dateString, format, pattern, tz; 
DateTime result; 
CultureInfo provider = CultureInfo.InvariantCulture; 
pattern = @"[a-zA-Z]+, [0-9]+ [a-zA-Z]+ [0-9]+ [0-9]+:[0-9]+:[0-9]+ (?<timezone>[a-zA-Z]+)"; 
dateString = "Thu, 21 Jan 2010 17:47:00 EST"; 

Regex findTz = new Regex(pattern, RegexOptions.Compiled); 

tz = findTz.Match(dateString).Result("${timezone}"); 

format = "ddd, dd MMM yyyy HH:mm:ss " + tz; 

try 
{ 
    result = DateTime.ParseExact(dateString, format, provider); 
    Console.WriteLine("Timezone format is: {0}", format); 
    Console.WriteLine("{0} converts to {1}.", dateString, result.ToString()); 
} 
catch (FormatException) 
{ 
    Console.WriteLine("{0} is not in the correct format.", dateString); 
} 

    Console.ReadLine(); 

Вот список UTC отводы для вас, если вы хотите, чтобы превратить это в конвертер часовых поясов:

Timezone Abbreviations with UTC offsets

+0

Это имеет смысл. Но проблема в том, что я не контролирую формат даты, поскольку она исходит из внешнего источника. Любые способы конвертировать часовой пояс не по часовой стрелке в GMT, а затем применять «r» или «R» ?? – Moon

+0

Мне жаль, что у меня не было лучшего ответа, чем то, что я собираюсь рассказать вам, но ... аббревиатуры не распознаются. У меня есть решение, но это не весело или элегантно. Я отправлю его и перекрестим пальцы, что кто-то другой поможет тебе лучше меня! Мне так жаль. –

+0

Неплохо, но намного лучше! :) Я ценю вашу помощь, я действительно делаю :) – Moon