问题 在C#,。NET 4.0中解析RFC1123格式的日期


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

这是我尝试但没有效果:

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

9720
2018-04-05 18:50


起源



答案:


你尝试过类似的东西:

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偏移


11
2018-04-05 19:21



这说得通。但问题是我无法控制日期的格式,因为它来自外部来源。有什么方法可以将非GMT时区转换为GMT然后应用“r”或“R”? - Moon
我希望我有一个更好的答案然后我要告诉你但是...缩写不被识别。我有一个解决方案,但它不是有趣或优雅。我会张贴它并且交叉我的手指,别人可以比我更好地帮助你!我很抱歉。 - Tim C
它不完美但更好! :)我感谢你的帮助,我真的很喜欢:) - Moon
你可以使用TryParseExact()而不是ParseExact()的try-catch。 - IgorK


答案:


你尝试过类似的东西:

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偏移


11
2018-04-05 19:21



这说得通。但问题是我无法控制日期的格式,因为它来自外部来源。有什么方法可以将非GMT时区转换为GMT然后应用“r”或“R”? - Moon
我希望我有一个更好的答案然后我要告诉你但是...缩写不被识别。我有一个解决方案,但它不是有趣或优雅。我会张贴它并且交叉我的手指,别人可以比我更好地帮助你!我很抱歉。 - Tim C
它不完美但更好! :)我感谢你的帮助,我真的很喜欢:) - Moon
你可以使用TryParseExact()而不是ParseExact()的try-catch。 - IgorK