【问题标题】:String was not recognized as valid date time c# error字符串未被识别为有效日期时间 c# 错误
【发布时间】:2018-10-14 10:51:21
【问题描述】:

我有以下代码,它将许多其他字符串格式转换为有效的日期时间格式。

  try
  {
  outputDate = DateTime.Parse(inputDateTime);
  }
  catch
  {
  outputDate = DateTime.Parse(inputDateTime, new CultureInfo("en-US"));
  }

但是对于以下两种情况它总是失败

13-10-2018 05:00:27

GetValidDateTimeFromString 错误-> 字符串未被识别为有效的日期时间。在 System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles 样式) 在 O365InventoryApp.InventoryDataUtility.GetValidDateTimeFromString(字符串 inputDateTime,TextWriter 日志)

14-10-2018 00:57:21

GetValidDateTimeFromString 错误-> 字符串未被识别为有效的 DateTime。在 System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles 样式) 在 O365InventoryApp.InventoryDataUtility.GetValidDateTimeFromString(字符串 inputDateTime,TextWriter 日志)

注意突出显示的两个日期在转换时抛出异常。我认为这是一个 24 小时格式问题。所以我也尝试如下转换

log.WriteLine("GetValidDateTimeFromString error for " + inputDateTime + "-> " + ex.Message + ex.StackTrace);
                    CultureInfo provider = CultureInfo.InvariantCulture;
                    DateTimeStyles style = DateTimeStyles.None;
                    string[] format = new string[] { "dd-MM-yyyy h:m:s tt", "dd-MM-yyyy hh:mm:ss tt" };

                    DateTime dt;
                    if (DateTime.TryParseExact(inputDateTime, format, provider, style, out dt))
                    {
                        log.WriteLine("updated date -" + dt);
                        outputDate = dt;
                    }

谁能告诉我这里发生了什么?

【问题讨论】:

  • 您最好使用[Try]ParseExact 而不是Parse,因为.NET 不必弄清楚您指的是哪种格式。

标签: c# .net datetime


【解决方案1】:

我认为 DateTime.Parse 不接受您提供的格式,试试这个:

outputDate = DateTime.ParseExact(inputDate, "dd-MM-yyyy HH:mm:ss", null);

【讨论】:

    【解决方案2】:

    可能是CodeProject中提到的:

    Windows 10 添加了对 Jalali 日历的新支持,因此:

    DateTimeFormatInfoSystem.Globalization 类在 Windows 10 和更早版本上调用时应返回不同的日期格式字符串。

    例如(以波斯历为例):

    String[] dateParts = s.Split('-');
    int year = int.Parse(dateParts[0]);
    int month = int.Parse(dateParts[1]);
    int day = int.Parse(dateParts[2]);
    PersianCalendar pc = new PersianCalendar();
    DateTime dt = pc.ToDateTime(year, month, day, 0, 0, 0, 0);
    

    引用:

    想到的第一种方法是使用 DateTime.Parse 固定格式“yyyy/MM/dd”。但这将在特定日期失败。所以 您必须将字符串拆分为年、月和日部分。

    尝试拆分你的字符串,看看是否适合你。

    【讨论】:

      【解决方案3】:

      我尝试了您的代码,并从格式末尾删除了 tt。这对我有用:

      var inputDateTime = "13-10-2018 05:00:27";
                  CultureInfo provider = CultureInfo.InvariantCulture;
                  DateTimeStyles style = DateTimeStyles.AllowInnerWhite;
                  string[] format = new string[] { "dd-MM-yyyy h:m:s", "dd-MM-yyyy hh:mm:ss tt" }; // i removed tt from first format of formats array.
                  DateTime dt;
                  DateTime outputDate;
                  DateTime.ParseExact(inputDateTime, format[0], provider);// and i used first index of formats array
      

      【讨论】:

        猜你喜欢
        • 2011-12-15
        • 2012-01-07
        • 2023-04-01
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多