我通过将每个记录推送到验证阶段然后进入数据库来处理记录。其中一个验证步骤需要检查某些列是否为日期。我使用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?
答案 0 :(得分:3)
您可以使用Thread.CurrentThread.CurrentCulture
将当前主题的文化设置为此。
这将对当前主题中的所有文化特定事物产生影响。
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB");
当服务与SYSTEM帐户一起运行时,与您的帐户个人资料相关联的区域设置似乎无关紧要。 Windows服务的默认Culture是en-US
。网上有很多讨论。所有这些都以“设置CurrentThread的文化”结束,就像我的回答一样。
答案 1 :(得分:2)
通过设置.net Globalization参数“Set UI Culture”为我解决。
在Windows 2008服务器上:
加载IIS管理器
转到网站
.net Globalization
将UI文化设置为“英语(英国)(en-GB)”
由于
答案 2 :(得分:1)
我几天前遇到过这个问题,过了一段时间我意识到我的应用程序池标识设置已设置为本地系统帐户,我将其更改为您使用自定义帐户(管理员),所以我不需要设置当前线索的文化。