Анализируя отформатированные даты RFC1123 в C#.Net 4.0

Я пытаюсь проанализировать даты в формате RFC1123 (четверг, 21 января 2010 17:47:00 EST).

Вот то, что я попробовал, но ни один не работал:

DateTime Date = DateTime.Parse(dt);
DateTime Date = DateTime.ParseExact(dt, "r", null);
11
задан halfer 5 June 2017 в 09:33
поделиться

1 ответ

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

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 утверждает, что часовой пояс всегда должен быть по Гринвичу ... вот почему 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, если вы хотите превратить его в преобразователь часовых поясов:

Аббревиатуры часовых поясов со смещениями UTC

12
ответ дан 3 December 2019 в 09:19
поделиться
Другие вопросы по тегам:

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