C# 如何将格式异常的字符串转换为datetime

C# 如何将格式异常的字符串转换为datetime,c#,datetime,C#,Datetime,我使用的是.NET 3.5,我有一个日期,它以字符串的形式出现,格式如下: 2009年1月20日星期二20:47:43 GMT 第一个问题,该格式的名称是什么?第二个问题,将这个字符串转换成日期时间的最简单、最清晰的方法是什么?如果可能的话,我希望能够使用.NETAPI/Helper方法 编辑:我忘了提到我已经尝试使用DateTime.Parse和Convert.ToDateTime。这些都不起作用 DateTime.Parse("Tue Jan 20 20:47:43 GMT 2009")

我使用的是.NET 3.5,我有一个日期,它以字符串的形式出现,格式如下:

2009年1月20日星期二20:47:43 GMT

第一个问题,该格式的名称是什么?第二个问题,将这个字符串转换成日期时间的最简单、最清晰的方法是什么?如果可能的话,我希望能够使用.NETAPI/Helper方法

编辑:我忘了提到我已经尝试使用DateTime.Parse和Convert.ToDateTime。这些都不起作用

DateTime.Parse("Tue Jan 20 20:47:43 GMT 2009")
您还可以使用
TryParseExact
指定日期时间的格式

使用胰蛋白酶

const string FORMAT = "ddd MMM dd HH:mm:ss \"GMT\" yyyy";
if (DateTime.TryParseExact("Tue Jan 20 20:47:43 GMT 2009", FORMAT, CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AssumeUniversal, out dt)) {
        /* is valid */
 }    
我认为这应该行得通。但不确定它是否会尝试解析出GMT。

您可以使用

尝试执行DateTime.parse(“2009年1月20日星期二20:47:43 GMT”)并查看它是否接受它

这里有一个很好的自定义日期时间格式链接


我希望这会有所帮助。

您可以将DateTime.TryParseExact()方法与合适的格式字符串一起使用。看

编辑:尝试以下操作:

        DateTime dt;
        System.Globalization.CultureInfo enUS = new System.Globalization.CultureInfo("en-US"); 

        if ( DateTime.TryParseExact( "Tue Jan 20 20:47:43 GMT 2009", "ddd MMM dd H:mm:ss \"GMT\" yyyy", enUS, System.Globalization.DateTimeStyles.NoCurrentDateDefault , out dt  ))
        {
            Console.WriteLine(dt.ToString() );
        }
试试这个:

DateTime.TryParse(Tue Jan 20 20:47:43 GMT 2009", out objDt);
您需要给出一个输出值。使用If,如果返回true,则为有效日期

好了

DateTime d = DateTime.ParseExact("Tue Jan 20 20:47:43 GMT 2009".Replace("GMT", "+00"), "ddd MMM dd H:mm:ss zz yyyy", new CultureInfo("en-US"));
DateTime API及其文档非常糟糕。异常只会告诉您“字符串未被识别为有效的日期时间”,这并没有真正的帮助。它必须自己找出日期格式说明符,因为我没有在MSDN中找到它们

我想,“en-US”区域设置是必要的,因为您的日期格式使用英语缩写,如“Tue”

无论如何,我不能告诉你日期格式叫什么。它非常类似于HTTP使用的格式(例如,如果从2004年12月8日星期三13:25:25 GMT开始修改,则为
)。

您可以使用或指定日期字符串的格式

尽管如此,我还是无法快速找出如何匹配时区说明符(即GMT)。看看谷歌的一些结果,就会发现大多数试图解决这一问题的人都是在试探性地做这件事——列出所有时区和偏移量,然后解析字符串,用+/-偏移量替换时区说明符,或者其他一些黑客方法。尽管这些解决方案都不是StackOverflow提供的,但谁知道它们有多好

下面是我编写的一个简短示例,其中“GMT”从试图转换的日期字符串中剥离。如果可以用偏移量替换时区,请在格式字符串中添加“zzz”。对于解析其他格式,这里是列出所有格式的MSDN页面

// Parse date and time with custom specifier.
string dateString = "Tue Jan 20 20:47:43 2009";
string format = "ddd MMM dd HH:mm:ss yyyy";
DateTime result;
System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;

try
{
   result = DateTime.ParseExact(dateString, format, provider);
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}

是的,我在发邮件,但我的评论没有插入。这不管用。读我的编辑这对我没有帮助。它不会解析,它会返回false,让我回到我开始编辑的地方。你试过使用格式字符串吗?现在它可以工作了,我喜欢它。它忽略了GMT,你知道GMT的模式是什么吗,这样我们就可以把它包括在内?我找不到任何模式。如果您愿意,这里有一张备忘单:通过执行dt解决了这个问题。ToLocalTime()返回false,我回到了原来的位置started@jstawski:你有C#3.0。没有所谓的C#3.5。是的,你说得对。我对.net 3.5感到困惑,我应该补充一点,我无法处理“GMT”,所以我用“+00”替换它,以确保至少可以正确解析GMT时区。+1:比公认的答案好得多,因为它演示了如何处理不可靠的日期格式,不幸的是,这是一种非常常见的情况。谢谢OrbMan。我已经非常熟悉DateTime.TryParseExact()方法,因为它处理的客户机认为他们应该能够以十几种不同的格式输入日期。实际上,我使用的重载版本接受字符串格式数组。
DateTime d = DateTime.ParseExact("Tue Jan 20 20:47:43 GMT 2009".Replace("GMT", "+00"), "ddd MMM dd H:mm:ss zz yyyy", new CultureInfo("en-US"));
// Parse date and time with custom specifier.
string dateString = "Tue Jan 20 20:47:43 2009";
string format = "ddd MMM dd HH:mm:ss yyyy";
DateTime result;
System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;

try
{
   result = DateTime.ParseExact(dateString, format, provider);
   Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
}