【问题标题】:.NET DateTime.Parse.NET 日期时间.解析
【发布时间】:2021-05-24 03:06:43
【问题描述】:

当尝试在 DateTime 类上使用 parse 方法时,我得到一个异常抛出:

字符串未被识别为有效的日期时间。

  • 输出时字符串读作"26/10/2009 8:47:39 AM"
  • 此字符串是从一个正则表达式匹配的组中获得的。
  • 从此匹配组中获得的所有字符串都不会解析为日期时间。

其他字符串示例:

2009 年 10 月 26 日上午 8:47:39 2009 年 10 月 26 日上午 8:00:41 2009 年 10 月 26 日上午 7:48:35

奇怪的是,我敢肯定它以前曾奏效过。

【问题讨论】:

  • 您在 windows 中的区域设置是否正确?
  • 是的,但是应用程序作为服务运行,而运行该服务的用户的配置文件没有。 :)

标签: c# .net datetime parsing


【解决方案1】:

将字符串解析为DateTime 对象几乎总是很痛苦。如果您确定它们将始终具有您的示例的格式,那么这应该可以:

string input = "26/10/2009 8:00:41 AM";
DateTime dateTime = DateTime.ParseExact(input, "dd/MM/yyyy h:mm:ss tt", CultureInfo.InvariantCulture);

【讨论】:

  • 我正在写这个完全相同的答案。
  • 虽然我打算添加一些有关影响日期解析的区域设置(全球化)的信息。
  • @Vinko:我也是。这是痛苦的部分。 ;) 不,说真的,这是一个相当复杂的领域,是一个常见的问题来源。不久前,我确实在此主题上写了一个冗长的答案:stackoverflow.com/questions/1437454/date-format-problem
  • @FredrikMörk 我正在使用此解决方案,输入的字符串格式正确,但我的日期时间变量设置为 1/1/0001 12:00:00 AM,我在.Net 中使用它4.5,你有什么想法吗?
  • @Guillelon 你的输入字符串和格式字符串是什么样的?
【解决方案2】:

Parse 考虑了区域设置(当前线程的文化)。因此,我会使用ParseExact 并使用不变的文化(或您需要的文化,例如en-US,用于上午/下午)明确指定正确的格式。

【讨论】:

    【解决方案3】:

    您可能使用了错误的文化。月份不能是 26,因此它不是美国时间戳。这虽然有效:

    using System;
    using System.Globalization;
    
    class Program
    {
        static void Main(string[] args)
        {
            DateTime dateTime = DateTime.Parse("26/10/2009 8:47:39 AM",
                CultureInfo.GetCultureInfo("en-GB"));
        }
    }
    

    【讨论】:

      【解决方案4】:

      机器上的文化是否发生了变化? 26/10/2009 是一个好的英国日期,但一个不好的美国日期(例如)

      【讨论】:

      • 这实际上是我刚刚想到的。 Datetime.parse 似乎对文化时间格式有过载。现在只是想知道如何使用它:) 谢谢你的帮助。
      【解决方案5】:

      要么使用文化作为参数调用 DateTime.Parse(),要么使用日期、要解析的日期的确切格式和文化调用 DateTime.ParseExact():

      DateTime.ParseExact()

      【讨论】:

        【解决方案6】:

        我第二个@Lucero,Parse 使用当前线程的文化信息等。另请参阅相反的方向:ToStringquestion 在这种情况下。

        【讨论】:

          【解决方案7】:

          我必须解决一些来自其他系统的非常奇怪的日期格式...在这个例子中是针对 SPANISH 格式的...

          string input="07/06/2019 07:01:54 p. m.";
          
          
          public static DateTime ParseSpanishDate(string input)
          {
              string normalized = input.Replace("a. m.", "AM").Replace("p. m.", "PM");
              normalized = normalized.Replace("12:00:00 AM", "00:00:00 AM");
              return  DateTime.Parse(normalized, CultureInfo.GetCultureInfo("es"));
          }
          

          【讨论】:

          • 当您有新问题时,请提出新问题。此空间仅供回答 - 大多数人不会看到您的问题。
          • 抱歉,我刚刚提出了一个适用于西班牙日期的解决方案。
          猜你喜欢
          • 1970-01-01
          • 2014-01-29
          • 1970-01-01
          • 1970-01-01
          • 2013-02-04
          • 2015-07-22
          • 2020-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多