我通过将每条记录推送到验证阶段,然后将其放入数据库来处理记录。验证步骤之一需要检查某些列是否是日期。我使用 DateTime.TryParse(s, out DateTime) 执行此操作,假设这将使用运行进程的计算机上配置的区域设置。在我的本地计算机上,这是一个在 Visual Studio 的命令行工具中运行的包装类(为了便于调试)。因此,根据我的 Windows 7 开发计算机上的 en-GB 设置,13/01/2010 被格式化为 2010 年 1 月 13 日。
将其推送到我们的测试服务器(Windows Server 2008 R2)上时,该包装类在 Window 服务(在 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
。
这将对当前线程中的所有文化特定事物产生影响。
Sample
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB");
更多信息
- MSDN - Thread.CurrentCulture 属性 http://msdn.microsoft.com/en-us/library/system.threading.thread.currentculture.aspx
Update
当服务使用 SYSTEM 帐户运行时,与帐户配置文件关联的区域设置似乎无关紧要。 Windows 服务的默认文化是en-US
。网上有很多讨论。一切都以“设置 CurrentThread 的文化”结尾,就像我的回答一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)