代码之家  ›  专栏  ›  技术社区  ›  crb

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

  •  5
  • crb  · 技术社区  · 16 年前

    我使用的是一个vb6/com+应用程序,它根据“控制面板”中的“区域设置”中的短日期设置为运行它的用户输出日期/时间值。然后解析该输出的程序具有其期望的日期格式的可配置设置,并显示在UI中。

    例如,如果用户的区域设置设置为mm/dd/yyyy,并输出06/18/2009,则预期“18/06/2009”的应用程序将失败,并显示“字符串未被识别为有效的日期时间”。

    由于我们通常将此应用程序作为服务帐户运行,但我们没有以交互方式登录以创建配置文件,因此我们通常设置正确的日期格式,然后勾选“将所有设置应用于当前用户帐户和默认用户配置文件”选项。

    我想让我为这个混乱编写的C配置实用程序能够以编程方式为给定用户设置日期格式。

    编辑 我只想更改代码,但现在没有能力这样做。

    我也知道我所要求的是一件坏事。关于“它应该是用户的选择”—我 当我为任务显式地创建它时,该用户;我只想通过脚本方法设置日期格式,而不必自己单击。

    4 回复  |  直到 16 年前
        1
  •  16
  •   mklement0    7 年前

    微软特别不鼓励这种做法。你可能想出的任何解决方案都将是一个肮脏的黑客,很可能很快就会停止工作。

    这样想:你是谁来决定这些设置的?你不认为这是用户的决定吗?

    回到主题:找到一个明确的应用程序通信格式,例如 YYYYMMDD . 然后,显示的应用程序可以像它应该的那样简单地尊重实际的用户设置。

    但是,既然你不能改变它,只需进入注册中心:

    当前用户:

    HKEY_CURRENT_USER\Control Panel\International
    

    特定用户:

    HKEY_USERS\(user SID)\Control Panel\International
    

    默认用户:

    HKEY_USERS\.DEFAULT\Control Panel\International
    

    sShortDate 可能是要更改的值。

        2
  •  2
  •   sean e    16 年前

    如果你要修改配置文件以满足你的需要,为什么不忽略配置文件设置并在你的应用程序中硬编码你想要的格式呢?

        3
  •  1
  •   eli-k    8 年前

    代码:

    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")
    
        4
  •  0
  •   mklement0    7 年前

    虽然要谨慎地持续更改用户的文化(区域设置),但还是有合法的使用案例。

    在Windows 8和Windows Server 2012及更高版本上,Windows PowerShell附带
    Set-Culture cmdlet ,这相当于通过控制面板选择不同的区域。( intl.cpl )

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

    Caveat: 混合的 文化,如 en-DE (sic)从Windows PowerShell v5.1开始似乎不工作-请参阅 this answer 我的。

    虽然速度不快,但可以从C调用PowerShell命令。