服务器在区域设置中设置为en-GB,但DateTime解析为en-US
我通过将每个记录推送到validation阶段然后进入数据库来处理记录。 其中一个validation步骤需要检查某些列是否为日期。 我使用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?
描述
您可以使用Thread.CurrentThread.CurrentCulture
将当前线程的文化设置为this。 这将对当前线程中的所有文化特定事物产生影响。
样品
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB");
更多信息
- MSDN – Thread.CurrentCulture属性
更新
当服务与SYSTEM帐户一起运行时,与您的帐户配置文件关联的区域设置似乎无关紧要。 Windows服务的默认文化是en-US
。 网上有很多讨论。 所有这些都以“设置CurrentThread的文化”结束,就像我的回答一样。
通过设置.net Globalization参数“Set UI Culture”为我解决。
在Windows 2008服务器上:
-
加载IIS管理器
-
转到网站
-
.net全球化
-
将UI文化设置为“英语(英国)(en-GB)”
谢谢
我几天前遇到过这个问题,过了一段时间我意识到我的应用程序池标识设置被设置为本地系统帐户,我把它更改为你使用自定义帐户(Administator),所以我不需要设置文化当前的线程。