如何更改 Windows 用户的区域设置/日期格式?
我使用 VB6/COM+ 应用程序,该应用程序根据运行该应用程序的用户的“控制面板”、“区域设置”中的短日期设置输出日期/时间值。 然后解析该输出的程序具有其期望的日期格式的可配置设置,并显示在 UI 中。
例如,如果用户的区域设置设置为 mm/dd/yyyy,并且输出 06/18/2009,则期望“18/06/2009”的应用程序将失败,并显示“字符串未被识别为有效的日期时间”。
由于我们通常作为服务帐户运行此应用程序,而我们没有以交互方式登录来创建配置文件,因此我们通常设置正确的日期格式,然后勾选“将所有设置应用到当前用户帐户和默认用户配置文件”选项。
我希望我为这个混乱编写的 C# 配置实用程序能够以编程方式为给定用户设置日期格式。
编辑 我只想更改代码,但目前没有能力这样做。
我也知道我所要求的是一件坏事。 关于“它应该是用户的选择” - 我是那个用户,因为我明确地为任务创建了它; 我只想通过脚本方法设置日期格式,而不是自己点击。
I use a VB6/COM+ application which outputs date/time values based on the short date settings in the Control Panel, Regional Settings, for the user that runs it. The program that then parses that output has a configurable setting for the date format it expects, and presents in the UI.
e.g. If the regional setting for the user is set to mm/dd/yyyy, and it outputs 06/18/2009, the application expecting "18/06/2009" fails with "String was not recognized as a valid DateTime".
As we usually run this application as a service account, which we have not logged in as interactively to create a profile, we generally set the correct date format and then tick the "Apply all settings to the current user account and the default user profile" option.
I would like to be make the C# configuration utility I have written for this mess to be able to set the date format programmatically for a given user.
Edit
I would like nothing more than to change the code, but do not have the ability to do so at this time.
I also know that what I am asking is a bad thing to do. With regards to "it should be the user's choice" - I am that user, as I create it explicitly for the task; I just want to set the date format by a scripted method, rather than having to do the clicking myself.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Microsoft 特别不鼓励这样做。 您可能想出的任何解决方案都将是一个肮脏的黑客,可能很快就会停止工作。
这样想:你是谁来决定这些设置? 你不认为这是用户的决定吗?
回到主题:找到一种明确的格式供应用程序进行通信,例如
YYYYMMDD
。 然后,显示的应用程序可以简单地尊重实际的用户设置,就像它应该的那样。但是,由于您无法更改它,只需查看注册表:
当前用户:
特定用户:
默认用户:
sShortDate
可能是您想要更改的值。This is specifically discouraged by Microsoft. Any solution you may come up with will be a filthy hack that will probably stop working soon.
Think of it this way: who are you to decide those settings? Don't you think that's the user's decision?
Back on topic: find an unambiguous format for the applications to communicate in, such as
YYYYMMDD
. The application that displays can then simply respect the actual user settings, as it should.But, since you can't change it, just poke into the registry:
Current user:
Specific user:
Default user:
sShortDate
is probably the value you want to change.如果您要修改配置文件以满足您的需求,为什么不忽略配置文件设置并在应用程序中硬编码您想要的格式呢?
If you are going to modify the profile to suit your needs, why not just ignore the profile settings and hardcode the format you want in your app?
代码:
code:
虽然持续改变用户的文化(区域设置)需要谨慎进行,但也有合法的用例。
在 Windows 8 和 Windows Server 2012 及更高版本上,Windows PowerShell 附带
Set-Culture
cmdlet,即相当于通过控制面板 (intl.cpl
) 选择不同区域的编程方式。例如,
Set-Culture fr-CA
相当于为当前用户交互式选择地区法语(加拿大)
。警告:从 Windows PowerShell v5.1 开始,en-DE(原文如此)等混合文化似乎无法正常工作 - 请参阅 我的这个答案。
虽然速度不会很快,但可以从 C# 调用 PowerShell 命令。
While persistently changing a user's culture (regional settings) is to be done cautiously, there are legitimate use cases.
On Windows 8 and Windows Server 2012 and above, Windows PowerShell comes with the
Set-Culture
cmdlet, which is the programmatic equivalent of choosing a different region via Control Panel (intl.cpl
).For instance,
Set-Culture fr-CA
is the equivalent of interactively choosing regionFrench (Canada)
for the current user.Caveat: Mixed cultures such as
en-DE
(sic) appear not to work as of Windows PowerShell v5.1 - see this answer of mine.While it won't be fast, it is possible to call PowerShell commands from C#.