代码之家  ›  专栏  ›  技术社区  ›  Jonas Stawski

如何将格式异常的字符串转换为日期时间

  •  3
  • Jonas Stawski  · 技术社区  · 15 年前

    我使用的是.NET 3.5,并且我有一个日期作为字符串,格式如下:

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

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

    编辑:我忘记提到我已经尝试使用datetime.parse和convert.to datetime。这些都不起作用。

    9 回复  |  直到 15 年前
        1
  •  11
  •   TLiebe    15 年前

    可以使用带有适当格式字符串的datetime.typarseexact()方法。参见 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() );
            }
    
        2
  •  2
  •   AndiDog    15 年前

    就这样吧

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

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

    您也可以使用 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 */
     }    
    

    我认为这应该管用。但不确定它是否会试图解析出格林尼治标准时间。

        4
  •  0
  •   Marek Karbarz    15 年前

    你可以使用 Convert.ToDateTime

        5
  •  0
  •   Dan H    15 年前

    尝试执行datetime.parse(“TueJan20 20:47:43 gmt 2009”)并查看它是否接受它。

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

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

    希望有帮助。

        6
  •  0
  •   Raja    15 年前

    试试这个:

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

    你需要给出一个输出值。使用if和if返回true,则为有效日期。

    高温高压

        7
  •  0
  •   ΩmegaMan    15 年前
    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() );
    
        8
  •  0
  •   Adam Porad    15 年前

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

    不过,我没能很快找到如何匹配时区说明符(即GMT)。看看谷歌的一些结果,可以发现大多数试图解决这个问题的人都是通过试探性的方式来解决的——列出所有时区和偏移量,然后分析字符串,用+/-偏移量或其他一些黑客方法替换时区说明符。不过,这些解决方案都不是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);
    }
    
        9
  •  -1
  •   Dustin Laine    15 年前
    DateTime.Parse("Tue Jan 20 20:47:43 GMT 2009")