如何字符串转换不寻常的格式转换成日期时间

问题描述:

我使用.NET 3.5和我有进来在以下格式字符串的日期:如何字符串转换不寻常的格式转换成日期时间

星期二1月20日20时47分43秒格林尼治标准时间2009年

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

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

+0

@jstawski:你有C#3.0。没有C#3.5这样的东西。 – 2010-04-09 20:06:21

+0

是的,你是对的。与.net 3.5 – 2010-04-09 20:15:07

您可以使用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

+1:比接受的答案要好得多,因为它演示了如何处理不规则的日期格式,不幸的是很常见。 – RedFilter 2010-04-09 20:19:10

+0

这比接受的答案好。我正在改变它 – 2010-04-09 20:23:40

+0

阅读Atomiton发表的回复评论 – 2010-04-09 20:25:23

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

混淆没有工作,忘记提及如此在问题 – 2010-04-09 19:52:32

+0

这不解析 – Pharabus 2010-04-09 19:54:02

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

您还可以使用TryParseExact在那里你可以指定你的DateTime

的格式使用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。

+0

这并不帮助我。它不会解析,它会返回false,将我留在我开始编辑的 – 2010-04-09 19:57:53

+0

。您是否尝试过使用格式字符串? – Armstrongest 2010-04-09 20:07:51

+0

现在,它的工作,我喜欢它。它忽略了GMT,你知道GMT的模式是什么,所以我们可以包括它吗? – 2010-04-09 20:12:48

你可以使用Convert.ToDateTime

+0

哇,减一 - 谨慎阐述? – 2010-04-09 19:54:23

+0

是的,我正在精心制作,但我的评论未能插入。 这不起作用。阅读我的编辑 – 2010-04-09 19:55:38

尝试做一个DateTime.Parse(“周二1月20日20时47分43秒格林尼治标准时间2009”),看看它是否接受它。

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

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

我希望帮助。

+0

这不起作用 – 2010-04-09 19:58:15

试试这个:

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

你需要给一个输出值。使用If,如果它返回true,那么它是一个有效的日期。

HTH

+0

返回false,我回到了我开始的位置 – 2010-04-09 20:01:02

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

你去那里

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")); 

日期时间API和文档几乎吮吸。例外情况只会告诉你“字符串未被识别为有效的日期时间”,这并没有真正的帮助。它必须自己弄清楚日期格式说明符,因为我没有在MSDN中找到它们。

我猜,“en-US”语言环境是必要的,因为日期格式使用英文缩写“Tue”。

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

+0

我应该补充说我无法应付“GMT”,所以我用“+00”取代了它,确保至少可以解析GMT时区正确。 – AndiDog 2010-04-09 20:19:03

+0

+1用于处理GMT。 – 2010-04-09 20:31:15

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

虽然我无法很快弄清楚如何匹配时区说明符(即GMT)。看一下Google的一些结果,可以看出大多数试图解决这个问题的人都在试探性地开发它 - 制作所有时区和偏移量的列表,然后解析字符串并用+/-偏移量替换时区说明符或者其他一些骇人的方法。尽管这些解决方案都不是来自*,所以谁知道它们有多好。

下面是我写的一个简短的例子,从日期字符串尝试转换的“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); 
}