我通过将每条记录推入验证阶段,然后将其推入数据库来处理记录。验证步骤之一需要检查某些列是否为日期。我使用 DateTime.TryParse(s, out DateTime) 执行此操作,假设这将使用运行进程的机器上配置的区域设置。在我的本地机器上,这是一个在 Visual Studio 的命令行工具中运行的包装类(为了便于调试)。因此,根据我的 Windows 7 开发机器上的 en-GB 设置,13/01/2010 被格式化为 2010 年 1 月 13 日。
在将其推送到我们的测试服务器 Windows Server 2008 R2 上后,该包装类在 Window Service 中运行(在 LocalSystem 帐户下)。完全相同的代码,我将其设计为使服务只是一个瘦包装器。然而,经过多次调试,服务器似乎将 13/01/2010 解析为 en-US 并因此失败。尽管将区域设置设置为 en-GB。(见截图)
请注意,这是在它到达 SQL Server 之前的方式,因此这不是此问题的一部分。
在与此作斗争之后,我通过使用下面的代码并将所需的格式设置为 en-GB 来强制这种情况。
Culture = CultureInfo.CreateSpecificCulture("en-GB");
DateTimeStyles dateTimeStyles = DateTimeStyles.None;
DateTime dt;
bool pass = DateTime.TryParse(s,Culture,dateTimeStyles, out dt);
这现在有效。我的问题是,在本地系统下运行的 Windows 服务如何假定 en-US 而不是 en-GB?