在C#,.NET 4.0中解析RFC1123格式的日期

Moo*_*oon 11 c# datetime rfc1123

我试图解析RFC1123格式的日期(星期四,2010年1月21日17:47:00美国东部时间).

这是我尝试但没有奏效的:

DateTime Date = DateTime.Parse(dt);
DateTime Date = DateTime.ParseExact(dt, "r", null);
Run Code Online (Sandbox Code Playgroud)

Tim*_*m C 12

你尝试过类似的东西:

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());
Run Code Online (Sandbox Code Playgroud)

我还没有测试过(稍后会)...但我相信会为你做到这一点.

编辑:似乎问题是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();
Run Code Online (Sandbox Code Playgroud)

如果您想将此转换为时区转换器,请输入以下UTC列表:

时区缩写与UTC偏移