问题
我正在尝试以RFC1123格式解析日期(2010年1月21日,星期四,美国东部标准时间)。
这是我尝试过的,但是没有用:
DateTime Date = DateTime.Parse(dt);
DateTime Date = DateTime.ParseExact(dt, "r", null);
回答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指出时区应始终为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偏移量的时区缩写