我必须指定什么才能使 set-culture 设置默认为 24​​ 小时而不是 AM/PM 的 12 小时

我必须指定什么才能使 set-culture 设置默认为 24​​ 小时而不是 AM/PM 的 12 小时

我正在尝试使用 Powershell 更改我的环境,以便以 24 小时格式显示时间,不带 AM/PM。

这是我的做法:

$culture = get-culture

$culture.DateTimeFormat.ShortTimePattern = 'HH:mm'
$culture.DateTimeFormat.pmDesignator     = ''

set-culture $culture

这样就去掉了 AM/PM 指示符,但仍然显示 0..12 范围内的小时数,而不是预期的 0..23 范围内的小时数。那么,我需要做什么才能以 24 小时格式显示小时数?

答案1

总结:系统中用户区域设置的短时间格式存储在注册表项下的HKCU:\Control Panel\International值中sShortTime。您可以通过以下 PowerShell 命令编辑此值的数据:

Set-ItemProperty -Path 'HKCU:\Control Panel\International' -Name 'sShortTime' -Value 'HH:mm'

UI 更新后(例如一分钟后)更改将可见。您可能还想更改sTimeFormat,因为它与LongTimePattern属性相对应。


Set-Culture旨在设置/加载CultureInfo类的预定义对象。通常可以这样使用它:

Set-Culture -CultureInfo 'en-US'

如果您检索一个CultureInfo对象然后更改其属性,则不会创建新CultureInfo对象。特别是它仍然具有预定义对象的名称CultureInfo(例如en-US)。如果您将这样一个修改过的CultureInfo对象与一起使用Set-Culture,我认为行为是未定义的(我不确定)。您可以看到它接受覆盖属性LongTimePattern,但不接受ShortTimePattern属性。我不知道这是错误还是只是未定义。

不过,您可以定义自己的自定义CultureInfo对象,从预定义对象派生它,然后在您的系统上使用它。您可以阅读更多有关这里. 显示的是 C# 中的一个示例实现这里。您可以按照如下方式将其转换为 PowerShell(以管理员权限执行):

Add-Type -AssemblyName sysglobl
$carib = New-Object -TypeName System.Globalization.CultureAndRegionInfoBuilder -ArgumentList @('en-US-Custom', [System.Globalization.CultureAndRegionModifiers]::None)
$carib.LoadDataFromCultureInfo([System.Globalization.CultureInfo]::GetCultureInfo('en-US'))
$carib.LoadDataFromRegionInfo((New-Object -TypeName System.Globalization.RegionInfo -ArgumentList 'en-US'))
$carib.GregorianDateTimeFormat.LongTimePattern = 'HH:mm:ss'
$carib.GregorianDateTimeFormat.ShortTimePattern = 'HH:mm'
$carib.Register()

此后,您将在系统上拥有一个CultureInfo名为的自定义对象,您可以使用以下命令进行设置:en-US-Custom

Set-Culture -CultureInfo 'en-US-Custom'

如果您想删除自定义CultureInfo对象,可以这样做:

Add-Type -AssemblyName sysglobl
[System.Globalization.CultureAndRegionInfoBuilder]::Unregister('en-US-Custom')

现在您可以决定是否要定义自定义CultureInfo对象或仅更改注册表中的一两个值。对于您的情况,我建议更改注册表,因为当您在 GUI 中更改短时间模式时,就会发生这种情况:

在此处输入图片描述

相关内容