【问题标题】:How to convert string with unusual format into datetime如何将具有异常格式的字符串转换为日期时间
【发布时间】:2010-04-09 19:50:52
【问题描述】:

我正在使用 .NET 3.5,并且我有一个日期,它以以下格式作为字符串出现:

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

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

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

【问题讨论】:

  • @jstawski:你有 C# 3.0。没有 C# 3.5 这样的东西。
  • 是的,你是对的。对 .net 3.5 感到困惑

标签: c# datetime


【解决方案1】:

您可以将 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:比公认的答案好得多,因为它演示了如何处理不可靠的日期格式,不幸的是,这种情况很常见。
  • 感谢 OrbMan。在与认为他们应该能够以十几种不同格式输入日期的客户打交道时,我已经非常熟悉 DateTime.TryParseExact() 方法。我实际上使用了接受字符串格式数组的重载版本。
【解决方案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 及其文档非常糟糕。异常只会告诉您“字符串未被识别为有效的日期时间”,这并没有真正的帮助。它必须自己弄清楚日期格式说明符,因为我在 MSDN 中没有找到它们。

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

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

【讨论】:

  • 我应该补充一点,我无法处理“GMT”,所以我将其替换为“+00”,以确保至少可以正确解析 GMT 时区。跨度>
【解决方案3】:
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。

【讨论】:

  • 这对我没有帮助。它不会解析,它会返回 false 让我回到我开始的地方
  • 已编辑。您是否尝试过使用格式字符串?
  • 现在它可以工作了,我喜欢它。它忽略了 GMT,你知道 GMT 的模式是什么,所以我们可以包含它吗?
  • 我找不到任何东西。如果你喜欢,这里有一份备忘单:blog.stevex.net/string-formatting-in-csharp
  • 通过执行 dt.ToLocalTime() 解决了问题
【解决方案4】:

你可以使用Convert.ToDateTime

【讨论】:

  • 是的,我在阐述,但我的评论未能插入。这行不通。阅读我的编辑
【解决方案5】:

尝试执行 DateTime.Parse("Tue Jan 20 20:47:43 GMT 2009") 并查看它是否接受。

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

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

希望对你有帮助。

【讨论】:

    【解决方案6】:

    试试这个:

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

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

    HTH

    【讨论】:

    • 返回 false 我又回到了我开始的地方
    【解决方案7】:
    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】:

      您可以使用DateTime.ParseExactDateTimeOffset.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】:
        DateTime.Parse("Tue Jan 20 20:47:43 GMT 2009")
        

        【讨论】:

          猜你喜欢
          • 2023-03-15
          • 2016-11-01
          • 1970-01-01
          • 2011-01-10
          • 2023-03-27
          • 1970-01-01
          • 1970-01-01
          • 2021-02-26
          相关资源
          最近更新 更多