【问题标题】:DateTime ParseExact gives System.FormatException:DateTime ParseExact 给出 System.FormatException:
【发布时间】:2020-05-21 11:26:24
【问题描述】:

我收到以下错误:

System.FormatException: 'String '{ ActualInstallDate = 17/04/2020 09:06:23 }' 未被识别为有效的 DateTime。

我必须在数据库中添加 ActualInstallDate 可以为空,这就是为什么我将它转换为字符串,以“欺骗”它。解析实际安装日期时出现错误。不知道这里有什么问题。

非常感谢任何建议。

var actualInstallDates = _context.Units.Where(u => u.ID == unitID)
                .Select(u => new {
                    u.ActualInstallDate
                }).Single().ToString();

            if (actualInstallDates != null)
            {

                DateTime actualInstallDate = DateTime.ParseExact(actualInstallDates, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                var nowString = DateTime.Now.ToString("dd/MM/yyyy");
                DateTime now = DateTime.ParseExact(nowString, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                var averageWorkOver = (Math.Ceiling(Math.Ceiling(Convert.ToDecimal(now - actualInstallDate)) / 1000 * 60 * 60 * 24) / workOverList.Count).ToString();
                ViewBag.AverageWorkOver = averageWorkOver;
            }
[Column(TypeName = "datetime2")] 
[Display(Name = "ActualInstallDate", Description = "ActualInstallDate_Description", ResourceType = typeof(Resource.Models.Unit))] 
public DateTime? ActualInstallDate { get; set; } 

【问题讨论】:

  • 你的日期字符串是17/04/2020 09:06:23,你的格式是dd/MM/yyyy,它们不匹配。格式缺少时间。
  • 可以添加Units类定义吗?
  • 问题中的代码是否会产生此错误?请注意,您在没有文化和 ParseExact 的情况下调用 ToString,这可能是问题的根源吗?另外,你为什么要这样做?将 DateTime 转换为字符串,然后返回?为什么?
  • @jira 我也试过 "dd/MM/yyyy HH:mm:ss" 但没有用
  • @LasseV.Karlsen 因为 ActualInstallDate 是 DateTime?所以要使用它 (DateTime.Now - actualInstallDate) 不起作用,因为它们是不同的类型,所以我这样做是为了基本上将它转换为 DateTime。

标签: c# datetime parsing formatexception


【解决方案1】:

您没有在格式字符串中指定时间。您可以截断日期字符串中的时间部分,也可以将时间添加到格式字符串中。 像这样:

 DateTime actualInstallDate = DateTime.ParseExact(actualInstallDates, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);

【讨论】:

    【解决方案2】:
    • 首先你不需要将它选入匿名对象(如果 ActualInstallDate 是数据库中的字符串):
    var actualInstallDates = _context.Units
        .Where(u => u.ID == unitID)
        .Select(u => u.ActualInstallDate)
        .SingleOrDefault();
    if (actualInstallDates != null)
    {...}
    

    如果你还想,就不要打电话给ToString

    var actualInstallDates = _context.Units.Where(u => u.ID == unitID)
        .Select(u => new { u.ActualInstallDate })
        .Single();
    if (actualInstallDates.ActualInstallDate != null)
    {
        DateTime.ParseExact(actualInstallDates.ActualInstallDate ...)
        ...
    }
    
    • 其次你的日期格式与字符串不匹配,试试用
    DateTime.ParseExact(actualInstallDates, "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture)
    

    UPD

    由于您的字段是DateTime?,因此您似乎在Nullable<> 结构上缺少Value 属性,因此您只需要从数据库中获取您的日期并使用actualInstallDates.Value

    var actualInstallDates = _context.Units
        .Where(u => u.ID == unitID)
        .Select(u => u.ActualInstallDate)
        .Single()
    
    if (actualInstallDates != null)
    {
        var averageWorkOver = (Math.Ceiling(Math.Ceiling(Convert.ToDecimal(DateTime.Now - actualInstallDates.Value)) / 1000 * 60 * 60 * 24) / workOverList.Count).ToString();
       ViewBag.AverageWorkOver = averageWorkOver;
    }
    
    
    
    

    【讨论】:

    • Where 和 Single in one chain 没有意义。将 Where 替换为 Single。
    • @Martas 1) 投影呢?我应该把它放在哪里? 2) 对我来说这是偏好问题,我认为带有单独 Where 子句的代码更具可读性。
    • 1) _context.Units.Single(u => u.ID == unitID).ActualInstallDate 2) 绝对不是。很多垃圾要阅读,很多垃圾要维护,在我期望更多的记录之后,但它已经给出,它只会是一个,所以不明确含义并且使以后的理解复杂化。 3)实际安装日期? - 这 ?为什么? Single 怎么可能返回 NULL??!!如果找不到单项,则单项失败并出现异常。
    • 1) 当只需要一个值时,这将从 db 中获取整个记录 2) 你不同意可读性是优先考虑的问题,好的) 3) 同意,从 OP 的原始代码移动,有选择对于匿名类,不需要此检查,至于 Single 返回 null 如果您在第一个中将 SingleOrDefault 更改为 Single 它将至少在 some cases 中返回 null
    • 1) 可能,但是当有更多记录时,它会返回所有记录,然后在 Single 2) 上失败 2) 是,但是您显示的内容与可读性无关。 3)太复杂了。简单的 Single 从不返回 null。单或默认是。但是有Single,因此?没有意义。 4)如果您是初学者,尽可能在任何地方大量使用 var 是最好的方法。为什么要引入一个字段的匿名类型?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多