如何将格式不规范的字符串转换为日期时间格式

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

Tue Jan 20 20:47:43 GMT 2009

第一个问题,这种格式的名称是什么?第二个问题,将此字符串转换为DateTime的最简单和最清晰的方法是什么?如果可能的话,我希望能够使用.NET API/Helper方法。
编辑:我忘记提到我已经尝试过DateTime.Parse和Convert.ToDateTime。这两种方法都没有起作用。

@jstawski:你有C# 3.0。并不存在C# 3.5这个东西。 - John Saunders
是的,你说得对。我被 .net 3.5 搞混了。 - Jonas Stawski
9个回答

11

您可以使用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() );
        }

1
+1:比被接受的答案好得多,因为它演示了如何处理奇怪的日期格式,不幸的是这种情况相当普遍。 - D'Arcy Rittich
谢谢OrbMan。我已经非常熟悉DateTime.TryParseExact()方法,因为我要处理一个客户认为他们应该能够以十几种不同的格式输入日期的问题。实际上,我使用了接受字符串格式数组的重载版本。 - TLiebe

2
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。


这对我没有帮助。它无法解析并将返回false,让我回到起点。 - Jonas Stawski
你尝试过玩弄格式字符串吗? - Armstrongest
现在它可以工作并且我喜欢它。它忽略了GMT,你知道GMT的模式是什么,这样我们就可以将其包含进来吗? - Jonas Stawski
我找不到任何东西。如果您喜欢,这里有一个备忘单:http://blog.stevex.net/string-formatting-in-csharp/ - Armstrongest
通过执行 dt.ToLocalTime() 方法解决了这个问题。 - Jonas Stawski

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)。

我应该补充一下,我无法处理“GMT”,所以我用“+00”替换了它,这样至少可以正确解析GMT时区。 - AndiDog

0

试试这个:

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

你需要提供一个输出值。使用 If 语句,如果返回 true,则为有效日期。

希望对你有所帮助。


返回 false,我又回到了起点。 - Jonas Stawski

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

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

0

是的,我正在详细说明,但我的评论未能插入。 这不起作用。请阅读我的编辑。 - Jonas Stawski

0

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

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