C#中将字符串转换为日期时间?

3

我该如何将以下日期字符串转换为dateTime:

Fri, 18 Dec 2009 9:38 am PST

我尝试使用 DateTime.Parse(string)
我得到了以下错误:
The string was not recognized as a valid DateTime. There is an unknown word starting at index 25. System.SystemException {System.FormatException}

更新

我试图从 Yahoo 获取天气,并尝试获取日期的方法如下:

Date = DateTime.Parse(feed.Element(yWeatherNS + "condition").Attribute("date").Value),

我已经调试过了。日期属性是正确的(就像上面那样)。
谢谢。

1
你尝试过 DateTime.Parse 或者 DateTime.ParseExact 吗? - huysentruitw
2个回答

7

我认为在BCL中没有任何东西可以解析时区缩写(尽可能避免使用它们,因为它们可能会产生歧义)。

如果您不介意失去时区信息,可以使用类似以下代码:

using System;
using System.Globalization;

static class Test
{
    static void Main()
    {
        string text = "Fri, 18 Dec 2009 9:38 am PST";
        DateTime parsed = TrimZoneAndParse(text);
        Console.WriteLine(parsed);
    }

    static DateTime TrimZoneAndParse(string text)
    {
        int lastSpace = text.LastIndexOf(' ');
        if (lastSpace != -1)
        {
            text = text.Substring(0, lastSpace);
        }
        return DateTime.ParseExact(text,
            "ddd, dd MMM yyyy h:mm tt",
            CultureInfo.InvariantCulture);
    }
}

请注意,这假设一个固定的日期/时间格式和文化。您的需求可能有所不同,如果这是用户输入,请考虑使用 TryParseTryParseExact

5
如果 DateTime.Parse 无法自动解析日期格式,你可以使用DateTime.ParseExact,在其中指定被使用的格式。
在您的情况下,这将如下所示,但需要您自己替换 'PST':
CultureInfo provider = CultureInfo.InvariantCulture;
string dateString = "Fri, 18 Dec 2009 9:38 am PST";
dateString = dateString.Replace("PST", "-08:00");
string format = "ddd, dd MMM yyyy h:mm tt zzz";
DateTime result = DateTime.ParseExact(dateString, format, provider);

如果您的程序需要处理不同的时区缩写,您需要构建一个缩写到时区偏移量转换的字典。

除了我所知道的UTC偏移量之外,zzz不识别时区缩写。 - Jon Skeet
最好使用DateTimeOffset而不是DateTime,因为这样可以保留时区信息。 - Enigmativity
@Enigmativity:不,DateTimeOffset 保留了与UTC的偏移量。这与时区不同。 (.NET没有任何类型来表示“特定时区的日期和时间”) - Jon Skeet
@JonSkeet:如果.NET支持RFC822,那么在幕后替换所有标识符的替代方案就会发生。那么为什么不自己实现呢?实际上,您可以从Windows注册表中提取信息,请参见:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones。我认为您可以从“Std”值创建缩写,并从“Display”值中提取偏移量。 - huysentruitw
@JonSkeet - 我承认我说“时区信息”时实际上是指UTC偏移量,但你完全正确,这可能会被误解。 - Enigmativity
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接