4

我通过将每条记录推入验证阶段,然后将其推入数据库来处理记录。验证步骤之一需要检查某些列是否为日期。我使用 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?

4

3 回答 3

3

描述

您可以使用Thread.CurrentThread.CurrentCulture. 这将对当前线程中的所有文化特定事物产生影响。

样本

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-GB");

更多信息

更新

当服务使用 SYSTEM 帐户运行时,与您的帐户配置文件关联的区域设置似乎无关紧要。Windows 服务的默认文化是en-US. 网上有很多讨论。就像我的回答一样,所有内容都以“设置 CurrentThread 的文化”结尾。

于 2012-02-03T17:23:18.543 回答
2

通过设置 .net 全球化参数“设置 UI 文化”为我解决了问题。

在 Windows 2008 服务器上:

  • 加载 IIS 管理器

  • 访问网站

  • .net 全球化

  • 将 UI 文化设置为“English (United Kingdom) (en-GB)”

谢谢

于 2014-02-28T15:29:48.037 回答
1

几天前我遇到过这个问题,过了一会儿我意识到我的应用程序池身份设置设置为本地系统帐户,我将其更改为您使用自定义帐户(管理员),所以我不需要设置文化当前线程。

于 2012-08-14T10:09:04.860 回答