我的MVC应用程序中有几个表单,其日期值是通过datepicker工具选择的。这在本地调试时很有效,但在部署到云环境时,我的日期未正确转换。我有以下代码:
string[] uploaddate = form.GetValues("uploaddate");
string[] expirydate = form.GetValues("expirydate");
这将日期定为2013年8月31日等,从这里我转换为DateTime如下:
Convert.ToDateTime(uploaddate[0]);
Convert.ToDateTime(expirydate[0]);
当我部署到Azure服务器时,收到以下错误:
字符串未被识别为有效的DateTime。
我认为实例图像具有美国文化,而我的应用程序是以英国格式设计的。如何解决此问题,以便将信息保存到数据库,而不管用户的文化?
答案 0 :(得分:3)
你应该使用DateTime.TryParseExact。您可以指定所有可能的格式,也不会抛出异常。
来自MSDN的示例。
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt",
"MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss",
"M/d/yyyy hh:mm tt", "M/d/yyyy hh tt",
"M/d/yyyy h:mm", "M/d/yyyy h:mm",
"MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM",
"5/1/2009 6:32:00", "05/01/2009 06:32",
"05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"};
DateTime dateValue;
foreach (string dateString in dateStrings)
{
if (DateTime.TryParseExact(dateString, formats,
new CultureInfo("en-US"),
DateTimeStyles.None,
out dateValue))
Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
else
Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}
答案 1 :(得分:3)
我会改进日期选择器,使其回发的值始终为yyyy-MM-dd,但显示在您关注的任何文化中。这使问题成为客户端问题,而不是服务器问题(实际上是它)
<强>更新强>
我做了一些调查Convert.ToDateTime()只是使用当前的文化设置调用DateTime.Parse。我刚刚检查了我的一个虚拟机,它运行的是美国本地设置,这就是为什么你得到d / M / y的错误。我会对发送到服务器的日期的格式进行标准化(这对于哪种格式并不重要,但我总是YMD的粉丝)然后使用@No One提到的DateTime.TryParseExact(),但只有一种格式。
答案 2 :(得分:0)
您可以使用Convert.ToDateTime的重载来指定文化。如果这是您的要求,这将允许您强制它始终使用英国文化。