【问题标题】:DateTime problems when moving to production environment迁移到生产环境时的日期时间问题
【发布时间】:2026-01-22 16:20:09
【问题描述】:

我的 MVC 应用程序中有几个表单,这些表单具有通过日期选择器工具选择的日期值。这在本地调试时效果很好,但在部署到云环境时,我的日期没有被正确转换。我有以下代码:

string[] uploaddate = form.GetValues("uploaddate");
string[] expirydate = form.GetValues("expirydate");

这将获取日期为 2013 年 8 月 31 日等,从这里我转换为 DateTime,如下所示:

Convert.ToDateTime(uploaddate[0]);
Convert.ToDateTime(expirydate[0]);

当我部署到 Azure 服务器时,我收到以下错误:

字符串未被识别为有效的日期时间。

我认为实例图像具有美国文化,而我的应用程序设计为英国格式。无论用户的文化如何,我如何才能解决此问题,以便将信息保存到数据库中?

【问题讨论】:

    标签: c# datetime azure globalization typeconverter


    【解决方案1】:

    您应该使用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);
    }
    

    【讨论】:

    • 这种方法的危险在于,诸如 2013 年 8 月 5 日(我在美国是 2013 年 8 月 5 日)之类的日期可能不明确。这样的日期可能会被错误地解析为 2013 年 5 月 8 日,因为它正在“穿越池塘”的路上,没有人会更聪明。
    【解决方案2】:

    我会改进日期选择器,使其回发的值始终为 yyyy-MM-dd,但会显示在您关心的任何文化中。这使得问题成为客户端问题,而不是服务器问题(确实如此)

    更新

    我已经进行了一些调查,Convert.ToDateTime() 只是使用当前的文化设置调用 DateTime.Parse。我刚刚检查了我的一个虚拟机,它使用美国本地设置运行,这就是为什么你会收到 d/M/y 错误。我会标准化发送到服务器的日期格式(哪种格式并不重要,但我一直是 YMD 的粉丝),然后使用 @No One 提到的 DateTime.TryParseExact(),但只有一种格式。

    【讨论】:

    • 我认为这是我将尝试的解决方案,为什么在 yyyy-MM-dd 中发布会使转换变得更容易?我该如何使用这种文化?
    • yyyy-MM-dd 是 ISO 8601 日期格式的子部分,可消除歧义。本质上,nnnn-nn-nn 模式将始终被解析为 yyyy-MM-dd。
    • 是 yyyy-MM-dd HH:mm:ss 吗?我正在通过 Windows azure cloudapp 将其上传到 azure 数据库,但无论我如何输入日期格式,它似乎都不起作用,我收到一个无效的 DateString 格式错误
    【解决方案3】:

    您可以使用Convert.ToDateTime 的重载,它允许您指定文化。如果这是您的要求,这将允许您强制它始终使用英国文化。

    【讨论】: