【问题标题】:converting a string to a DateTime format将字符串转换为 DateTime 格式
【发布时间】:2016-01-27 14:10:55
【问题描述】:

我正在尝试使用以下方法将09/01/2015 00:00:00 解析为yyyy-MM-ddThh:mm:ssZ 格式:

DateTime.ParseExact("09/01/2015 00:00:00", "yyyy-MM-ddThh:mm:ssZ", (IFormatProvider)CultureInfo.InvariantCulture);

但我收到了String was not recognized as a valid DateTime

谁能告诉我为什么?我相信09/01/2015 00:00:00 是有效的日期时间格式?

【问题讨论】:

  • 使用 ParseExtact 时,格式参数必须与 inout 字符串完全匹配,这在您的代码中绝对不是这种情况。
  • 您真的看不到使用"yyyy-MM-ddThh:mm:ssZ" 格式解析"09/01/2015 00:00:00" 的问题吗?这个想法是格式必须看起来像字符串。
  • @HimBromBeere - 我不认为这是重复的。 OP 清楚地了解使用 ParseExact (链接问题提供),但他不明白如何构造格式。

标签: c# datetime


【解决方案1】:

来自DateTime.ParseExact

将日期和时间的指定字符串表示形式转换为其 日期时间等效。 字符串表示的格式必须 完全匹配指定格式或抛出异常。

在你的情况下,它们不是。

我假设您的 09 部分是天数,您可以改用 dd/MM/yyyy HH:mm:ss 格式。

var dt = DateTime.ParseExact("09/01/2015 00:00:00", 
                             "dd/MM/yyyy HH:mm:ss", 
                             CultureInfo.InvariantCulture);

由于CultureInfo 已经 implements IFormatProvider,你不需要显式地转换它。

我不明白这一点。所以这意味着我首先必须纠正我的字符串 其次,我可以执行 ParseExact()。我认为 ParseExact 可以 处理给定的字符串...

ParseExact 不是一个可以解析您提供的任何格式字符串的神奇方法。它可以处理 只有 如果您的字符串和格式根据您使用的文化设置完全匹配。

【讨论】:

    【解决方案2】:

    试试这个代码:

    var text = "09/01/2015 00:00:00";
    var format = "dd/MM/yyyy HH:mm:ss";
    var dt = DateTime.ParseExact(text, format, (IFormatProvider)CultureInfo.InvariantCulture);
    

    您会注意到格式必须在结构上与您尝试解析的文本完全匹配 - 因此该方法的名称为 ParseExact

    【讨论】:

      【解决方案3】:

      格式不匹配,需要将09/01/2015改成2015-01-09yyyy-MM-dd部分改成dd/MM/yyyy

      【讨论】:

      • 我不明白这个。所以这意味着我首先必须更正我的字符串,其次我可以执行 ParseExact()。我认为 ParseExact 可以处理给定的字符串...
      • @Ozkan 不,格式和字符串必须匹配,就像错误消息所说的那样。他们不匹配,你得到一个例外。
      【解决方案4】:

      ParseExact 方法不是将任何日期格式转换为另一种日期格式的终极方法,它只是使用提供的格式将给定字符串解析为日期时间。因此,如果您的 inout 与此格式不匹配,则该方法将抛出该异常。

      由于日期时间在内部只是一个数字,因此根本不需要将一种格式转换为另一种格式,因此只要您知道输入格式,您就可以从中构建一个与任何格式无关的日期当您想将该日期打印到输出时,您可能需要。在这种情况下,您将需要一个格式化程序。

      【讨论】:

        【解决方案5】:

        正如大多数人所说,错误来自字符串格式的日期与您所说的格式不匹配。您是说 09/01/2015 00:00:00 在格式“yyyy-MM-ddThh:mm:ssZ”,它不是,因此错误。要纠正此问题,您需要更改字符串的格式,或者更有可能更改您所说的日期格式。因此,将“yyyy-MM-ddThh:mm:ssZ”更改为“dd/MM/yyyy HH:mm:ss"。

        从更长远的角度来看,您是如何到达那个日期的?格式是否可能会改变(输入但用户)?如果是这样,最好尝试避免引发错误并使用TryParseExact 更好地处理它。为了充分利用这一点,我通常输出一个可为空的 DateTime,然后检查它是否为空。如果你不这样做,那么如果解析失败,它只会使输出日期时间成为最小值。

        这样的事情应该可以工作:

        public DateTime? StringToDate (string dateString, string dateFormat)
        {
            DateTime? dt;
            DateTime.TryParseExact(dateString, dateFormat, null, System.Globalization.DateTimeStyles.None, out dt);
            return dt;
        }
        

        那么你可以这样使用它:

        DateTime? MyDateTime = StringToDate("09/01/2015 00:00:00", "dd/MM/yyyy HH:mm:ss");
        
        if(MyDateTime != null)
        {
            //do something
        }
        

        【讨论】:

          【解决方案6】:

          另一种简单的方法...

          var dt = Convert.ToDateTime(Convert.ToDateTime("09/01/2015 00:00:00").ToString("yyyy-MM-ddThh:mm:ssZ"))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多