【问题标题】:Unable to parse DateTime from a string无法从字符串中解析 DateTime
【发布时间】:2011-10-21 19:48:19
【问题描述】:
string dt = "10/25/2010 11:40:05 PM";
var currentThread = Thread.CurrentThread.CurrentCulture; //ru-RU
DateTime dateTime = DateTime.Parse(dt); //Exception!

如何解析dt

更新: 在我的情况下,DateTime 可以表示为 "25.10.2010 11:40:05""10/25/2010 11:40:05 PM" 这些是在不改变 CurrentCulture 的情况下解析它的任何“通用”方法吗?

【问题讨论】:

    标签: c# .net string parsing c#-4.0


    【解决方案1】:

    使用custom 日期和时间格式字符串,使用ParseExactTryParseExact

    DateTime dateTime;
    DateTime.TryParseExact(
                           dt, 
                           "MM/dd/yyyy hh:mm:ss tt", 
                           CultureInfo.InvariantCulture,
                           DateTimeStyles.None,
                           out dateTime
                          );
    

    字符串不能被解析为俄语 DateTime 表示,因为俄罗斯文化不使用 AM/PM,因此使用 CultureInfo.InvariantCulture 这是类似美国的文化(它不代表特定的文化,但是以 en-US 为蓝本的)。

    【讨论】:

    • +1 帮助他自己找到答案,而不是直接为他回答。
    • @Reddog : 你太快了;)
    • @Oded :我相信小时是 12-h (hh) 格式而不是 24-h (HH),因为在这种情况下 AM/PM 没有任何意义。 yy 也是去年的两位数字,例如 2011 年的 11
    【解决方案2】:

    尝试改用ParseExact

    DateTime myDate = DateTime.ParseExact("10/25/2010 11:40:05 PM", "MM/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture);
    

    【讨论】:

    • 我相信你忘了秒部分
    • myDate 属于什么文化?不变文化?
    • 我用的是en-US,但是InvariantCulture会更灵活。
    • 如何获取myDate的文化?
    • 什么意思?您是在问如何在解析日期后检索文化信息?
    【解决方案3】:

    试试DateTime.Parse(dt, CultureInfo.GetCultureInfo("EN-us"))

    【讨论】:

      【解决方案4】:
      var result = DateTime.ParseExact(dt, 
                                       "MM/dd/yyyy hh:mm:ss tt", 
                                       CultureInfo.InvariantCulture);
      

      为避免运行时异常,请使用安全的DateTime.TryParseExact() 方法,如果解析不成功,它会返回false,而不是抛出FormatException 异常

      【讨论】:

        【解决方案5】:

        俄罗斯不使用 AM 和 PM 作为其 AM/PM 指示符,这至少是失败的一个原因。另一个是俄罗斯可能不会使用“月/日/年”格式,据我所知,这主要是美国的特色。 (我不记得俄罗斯的格式字符串了;我记得最近的属格月份名称让我很伤心,但那是另一回事了......)

        我个人会明确地将文化指定为不变文化,并且还明确地指定格式字符串:

        string text = "10/25/2010 11:40:05 PM";
        string pattern = "MM/dd/yyyy hh:mm:ss tt";
        DateTime dt = DateTime.ParseExact(text, pattern,
                                          CultureInfo.InvariantCulture);
        

        如果这可能合理地预期会失败,您应该改用DateTime.TryParseExact,以便在不涉及异常的情况下优雅地处理失败。

        【讨论】:

        • +1 因为你的答案没有得到任何爱(这是正确的答案)
        【解决方案6】:

        试试这样的:

        dateTime = DateTime.Parse(dt, CultureInfo.CreateSpecificCulture("en-US"));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-07
          • 1970-01-01
          相关资源
          最近更新 更多