【问题标题】:DateTime.Parse() fails when culture info changes [duplicate]文化信息更改时 DateTime.Parse() 失败[重复]
【发布时间】:2018-03-30 12:47:49
【问题描述】:

我正在使用 asp.NET MVC 视图中的下拉列表来选择阻止用户进入我们系统的时间。

 @Html.DropDownListFor(model => model.AccessTimeBegin, new SelectList(new List<Object> {
                new { value = "6/22/2009 1:00:00" , text = "01:00 AM"  },
                new { value = "6/22/2009 2:00:00" , text = "02:00 AM"  },
                new { value = "6/22/2009 3:00:00" , text = "03:00 AM"  },
                new { value = "6/22/2009 4:00:00" , text = "04:00 AM"  },
                new { value = "6/22/2009 5:00:00" , text = "05:00 AM"  },
                new { value = "6/22/2009 6:00:00" , text = "06:00 AM"  },
                new { value = "6/22/2009 7:00:00" , text = "07:00 AM"  },
                new { value = "6/22/2009 8:00:00" , text = "08:00 AM"  },
                new { value = "6/22/2009 9:00:00" , text = "09:00 AM"  },
                new { value = "6/22/2009 10:00:00" , text = "10:00 AM"  },
                new { value = "6/22/2009 11:00:00" , text = "11:00 AM"  },
                new { value = "6/22/2009 12:00:00" , text = "12:00 PM"  },
                new { value = "6/22/2009 13:00:00"  , text = "01:00 PM"  },
                new { value = "6/22/2009 14:00:00" , text = "02:00 PM"  },
                new { value = "6/22/2009 15:00:00" , text = "03:00 PM"  },
                new { value = "6/22/2009 16:00:00" , text = "04:00 PM"  },
                new { value = "6/22/2009 17:00:00" , text = "05:00 PM"  },
                new { value = "6/22/2009 18:00:00" , text = "06:00 PM"  },
                new { value = "6/22/2009 19:00:00" , text = "07:00 PM"  },
                new { value = "6/22/2009 20:00:00" , text = "08:00 PM"  },
                new { value = "6/22/2009 21:00:00" , text = "09:00 PM"  },
                new { value = "6/22/2009 22:00:00" , text = "10:00 PM"  },
                new { value = "6/22/2009 23:00:00" , text = "11:00 PM"  },
                new { value = "6/22/2009 24:00:00" , text = "12:00 AM"  },
                }, "value", "text"), new { @class = "form-control", @data_toggle = "tooltip", @data_placement = "top", @title = UserManager.ttEarliestTime })

在我被要求将应用程序国际化之前,我的控制器中的这段代码运行良好。

        UserRepository repo = new UserRepository();

        DateTime start = new DateTime();
        DateTime end = new DateTime();


        if (model.AccessTimeBegin != "6/22/2009 1:00:00" && model.AccessTimeEnd != "6/22/2009 1:00:00")
        {
            start = DateTime.Parse(model.AccessTimeBegin);
            end = DateTime.Parse(model.AccessTimeEnd);
        }

        if (start != DateTime.MinValue && end != DateTime.MinValue)
        {
            model.AccessTimeBeginDT = default(DateTime).Add(start.TimeOfDay);
            model.AccessTimeEndDT = default(DateTime).Add(end.TimeOfDay);
        }

        repo.EditUser(model);

现在,当我将文化切换为“es”时,DateTime.Parse() 会引发异常...

System.FormatException:字符串未被识别为有效的日期时间

我不明白,为什么?我的猜测是 Parse() 函数会查看区域性,当区域性设置为“es”时,它会查看字符串并说:“Okay Jose,第 6 天,第 22 个月?...QUE?” 相反,当它设置为“en-US”时,它会查看字符串并说“2009 年第 6 个月,第 22 天,2009 年......”并且它解析它就好了。

我该如何解决这个问题?

【问题讨论】:

  • 查看副本。 6/22/2009 10:00:00 的格式字符串应为 M/d/yyyy HH:mm:ss,但如果您使用 2 位数的日期,请使用格式字符串 M/dd/yyyy HH:mm:ss

标签: c# asp.net .net asp.net-mvc datetime


【解决方案1】:

您可以改用 DateTime.ParseExact。并给出正确的日期时间格式。

示例,但对于您的代码:

var d = DateTime.ParseExact("0"+"6/22/2009 01:00:00", "M/dd/yyyy HH:mm:ss", null);

我必须在日期前和时间前添加一个“0”。

【讨论】:

  • 我已经尝试使用 ParseExact 并且它产生了同样的错误。我可能做错了。你能举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多