我正在尝试以RFC1123格式解析日期(星期四,2010年1月21日17:47:00美国东部时间)。
这是我尝试但没有效果的地方:
DateTime Date = DateTime.Parse(dt);
DateTime Date = DateTime.ParseExact(dt, "r", null);
答案 0 :(得分: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偏移列表: