我正在尝试使用 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 中更改短时间模式时,就会发生这种情况: