Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#,.Net 4.0中解析RFC1123格式的日期_C#_Datetime_Rfc1123 - Fatal编程技术网

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

在C#,.Net 4.0中解析RFC1123格式的日期,c#,datetime,rfc1123,C#,Datetime,Rfc1123,我正在尝试解析RFC1123格式的日期(Thu,2010年1月21日17:47:00东部标准时间) 以下是我尝试过但没有成功的方法: DateTime Date = DateTime.Parse(dt); DateTime Date = DateTime.ParseExact(dt, "r", null); 你有没有试过这样的方法: string dateString, format; DateTime result; CultureInfo provider = CultureInfo.

我正在尝试解析RFC1123格式的日期(Thu,2010年1月21日17:47:00东部标准时间)

以下是我尝试过但没有成功的方法:

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

你有没有试过这样的方法:

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,但它是静态的,因此如果您有任何其他时区,您可能会遇到麻烦。最好的解决方案是使用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();
string日期字符串,格式,模式,tz;
日期时间结果;
CultureInfo provider=CultureInfo.InvariantCulture;
模式=@“[a-zA-Z]+,[0-9]+[a-zA-Z]+[0-9]+[0-9]+:[0-9]+:[0-9]+(?[a-zA-Z]+);
dateString=“Thu,2010年1月21日17:47:00东部标准时间”;
Regex findTz=newregex(模式,RegexOptions.Compiled);
tz=findTz.Match(dateString.Result(${timezone}));
format=“ddd,dd-MMM-yyyy-HH:mm:ss”+tz;
尝试
{
结果=DateTime.ParseExact(日期字符串、格式、提供程序);
WriteLine(“时区格式为:{0}”,格式);
WriteLine(“{0}转换为{1}.”,dateString,result.ToString());
}
捕获(格式化异常)
{
WriteLine(“{0}的格式不正确。”,dateString);
}
Console.ReadLine();
如果您想将其转换为时区转换器,以下是UTC偏移量列表:


这是有道理的。但问题是我无法控制日期的格式,因为它来自外部来源。有没有办法将非GMT时区转换为基于GMT的时区,然后应用“r”或“r”?我希望我有一个比我要告诉你的更好的答案,但是。。。缩写词不被识别。我有一个解决方案,但它既不有趣也不优雅。我会把它贴出来,祈祷别人能比我更好地帮助你!我很抱歉。它不完美,但好多了!:)感谢您的帮助,我真的很感谢:)您可以使用TryParseExact()而不是使用ParseExact()进行try-catch。