11

我正在尝试以 RFC1123 格式解析日期(星期四,2010 年 1 月 21 日 17:47:00 EST)。

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

DateTime Date = DateTime.Parse(dt);
DateTime Date = DateTime.ParseExact(dt, "r", null);
4

1 回答 1

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());

我还没有测试它(稍后会)......但我相信它会为你做。

编辑:问题似乎在于 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 偏移列表:

带有 UTC 偏移量的时区缩写

于 2010-04-05T19:21:32.653 回答