我该如何更改Windows用户的区域设置/日期格式?

5
我使用一个基于控制面板中区域设置的短日期设置输出日期/时间值的VB6/COM+应用程序,用于运行它的用户。然后解析该输出的程序具有可配置的日期格式设置,以及在UI中显示。
例如,如果用户的区域设置设置为mm/dd/yyyy,并且它输出06/18/2009,则期望"18/06/2009"的应用程序将失败并显示"String was not recognized as a valid DateTime"。
由于我们通常将此应用程序作为服务帐户运行,我们没有交互式登录创建配置文件,因此通常设置正确的日期格式,然后选中"将所有设置应用于当前用户帐户和默认用户配置文件"选项。
我想让我编写的C#配置实用程序能够以编程方式设置给定用户的日期格式。
编辑 我最想做的就是更改代码,但目前我无法这样做。
我也知道我的请求是不好的。关于"应该是用户的选择" - 我就是那个用户,因为我明确地为任务创建了它;我只是想通过脚本方法设置日期格式,而不必自己点击。
4个回答

17

微软明确不建议这样做。你可能想出的任何解决方案都将是一种肮脏的黑客方式,很快就会停止工作。

换个角度想:你有什么资格去决定那些设置?难道你不认为这是用户的决定吗?

回到主题:找到一种明确的应用程序通信格式,比如YYYYMMDD。显示应用程序可以尊重实际用户设置,像它应该做的那样。

但是,既然您无法更改它,只需进入注册表:

当前用户:

HKEY_CURRENT_USER\Control Panel\International

特定用户:

HKEY_USERS\(user SID)\Control Panel\International

默认用户:

HKEY_USERS\.DEFAULT\Control Panel\International

sShortDate 可能是您想要更改的值。


我知道这样做是不好的。我就是那个用户,我明确为此创建了它;我只想通过脚本方法设置日期格式,而不是自己点击。我最想改变代码,但我没有这样做的能力。 - crb
谢谢 - 我非常有信心你的答案会起作用,但无论如何,你对问题的务实态度绝对值得赞赏。 - crb

2
如果您要修改配置文件以满足您的需求,为什么不直接忽略配置文件设置,在您的应用程序中硬编码所需的格式呢?

1

代码:

Imports System.Threading
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US", False)
Microsoft.Win32.Registry.SetValue("HKEY_CURRENT_USER\Control Panel\International", "sShortDate", "M/d/yyyy")

0

在持续更改用户的区域设置时,需要谨慎处理,但也存在合法的使用情况。

在 Windows 8 和 Windows Server 2012 及以上版本中,Windows PowerShell 配备了Set-Culture cmdlet,它是通过控制面板(intl.cpl)选择不同区域的编程等效物。

例如,Set-Culture fr-CA 相当于交互式地为当前用户选择区域 French (Canada)

注意:截至 Windows PowerShell v5.1,混合文化(如 en-DE)似乎无法正常工作 - 请参见我的这个答案

虽然不会很快,但可以从 C# 调用 PowerShell 命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接