如何将具有异常格式的字符串转换为datetime

时间:2010-04-09 19:50:52

标签: c# datetime

我正在使用.NET 3.5,我的日期以字符串形式出现,格式如下:

  

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

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

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

9 个答案:

答案 0 :(得分:11)

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

编辑:尝试这样的事情:

        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() );
        }

答案 1 :(得分:2)

DateTime dt;
if(DateTime.TryParse("Tue Jan 20 20:47:43 GMT 2009", out dt)){
   /* Yay.. it's valid */
}

您还可以使用TryParseExact指定日期时间

的格式

使用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。

答案 2 :(得分:2)

你去了

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及其文档非常糟糕。例外只会告诉您“字符串未被识别为有效的DateTime”,这实际上没有帮助。它必须自己弄清楚日期格式说明符,因为我没有在MSDN中找到它们。

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

无论如何,我无法告诉你日期格式是什么。它非常相似,但不等于HTTP使用的格式(例如If-Modified-Since: Wed, 08 Dec 2004 13:25:25 GMT)。

答案 3 :(得分:0)

您可以使用Convert.ToDateTime

答案 4 :(得分:0)

尝试做一个DateTime.Parse(“Tue Jan 20 20:47:43 GMT 2009”),看看它是否接受了它。

这是自定义DateTime格式的一个很好的链接。

http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

我希望有所帮助。

答案 5 :(得分:0)

试试这个:

DateTime.TryParse(Tue Jan 20 20:47:43 GMT 2009", out objDt);

您需要提供输出值。使用If和if返回true,然后是有效日期。

HTH

答案 6 :(得分:0)

CultureInfo enUS = new CultureInfo( "en-US" ); 

DateTime dt = DateTime.ParseExact( "Tue Jan 20 19:47:43 GMT 2009", "ddd MMM dd HH:mm:ss 'GMT' yyyy", enUS, DateTimeStyles.None );

Console.WriteLine( dt.ToString() );

答案 7 :(得分:0)

您可以使用DateTime.ParseExactDateTimeOffset.ParseExact指定日期字符串的格式。

虽然,我无法快速弄清楚如何匹配时区说明符(即GMT)。看一下谷歌的一些结果,表明大多数试图解决这个问题的人都是以启发的方式做到这一点 - 制作所有时区和偏移的列表然后解析字符串并用+/-偏移替换时区说明符,或其他一些hackish方法。虽然这些解决方案都不是来自StackOverflow,但谁知道它们有多好。

这是我写的一个简短示例,其中“GMT”从试图转换的日期字符串中删除。如果您可以使用偏移替换时区,请将“zzz”添加到格式字符串中。对于解析其他格式,请参阅列出所有格式的MSDN页面Custom Date and Time Format Strings

// 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);
}

答案 8 :(得分:-1)

DateTime.Parse("Tue Jan 20 20:47:43 GMT 2009")