【问题标题】:Parsing RFC1123 formatted dates in C#, .Net 4.0在 C#、.Net 4.0 中解析 RFC1123 格式的日期
【发布时间】:2011-02-04 12:57:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# datetime rfc1123


    【解决方案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 偏移列表:

    Timezone Abbreviations with UTC offsets

    【讨论】:

    • 有道理。但问题是我无法控制来自外部来源的日期格式。有什么方法可以将非 GMT 时区转换为基于 GMT,然后应用“r”或“R”??
    • 我希望我有一个比我将要告诉你的更好的答案,但是......缩写无法识别。,我有一个解决方案,但它既不有趣也不优雅。我会发布它并交叉手指,其他人可以比我更好地帮助你!我很抱歉。
    • 它并不完美,但要好得多! :) 非常感谢您的帮助,我真的这样做了 :)
    • 你可以使用 TryParseExact() 而不是使用 ParseExact() 的 try-catch。
    猜你喜欢
    • 2016-01-10
    • 2019-07-22
    • 1970-01-01
    • 2016-02-22
    • 2014-03-16
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多