如何在 Powershell 中修复日期格式以使用 ISO 8601

How do I fix the date format In Powershell to use ISO 8601

提问人:MattMS 提问时间:11/14/2023 更新时间:11/14/2023 访问量:52

问:

我想将 Powershell 中日期和时间的默认格式更改为使用 ISO 8601 格式, 因此,它不会显示为 ,而是使用dd/mm/yyyyyyyy-mm-dd

请注意:我不想直接在日期对象上指定任何内容, 因为当返回的对象上有一个日期字段时,这会很烦人。 我想更改将在任何地方使用的默认格式。

Windows ISO 8601 时间戳没有回答这个问题 那里的答案都涉及直接处理 DateTime 对象。

# NOT THIS
Get-Date -Format 'yyyy-mm-dd'

# NOR THIS
$d = Get-Date
$d.ToString('o')

该解决方案必须适用于 Powershell 7 及更高版本。

我进行了以下尝试,但它们都会导致显示的错误。

设置失败DateTimeFormat

(Get-Culture).DateTimeFormat = [cultureinfo]::InvariantCulture.DateTimeFormat

输出:

SetValueInvocationException: Exception setting "DateTimeFormat": "Instance is read-only."

调用失败Set-Culture

Set-Culture [cultureinfo]::InvariantCulture

输出:

Set-Culture: Cannot bind parameter 'CultureInfo'. Cannot convert value "[cultureinfo]::InvariantCulture" to type "System.Globalization.CultureInfo". Error: "Culture is not supported. (Parameter 'name')
[cultureinfo]::InvariantCulture is an invalid culture identifier."
PowerShell ISO8601

评论

0赞 boxdog 11/14/2023
通过对会话进行一次简单的更新,可能无法在任何地方执行此操作,因为 PowerShell 使用格式化文件来确定如何显示对象,并且其中的任何日期格式都将覆盖您尝试在其他地方设置的默认值。

答:

2赞 Thomas 11/14/2023 #1

(PowerShell 7.3.9)

我的解决方案是更改 DateTimeFormat 的 and。LongDatePatternLongTimePattern

function Switch-DefaultTimeFormat(){
    $currentThread = [System.Threading.Thread]::CurrentThread
    $culture = [CultureInfo]::InvariantCulture.Clone()

    #see https://learn.microsoft.com/en-us/dotnet/api/system.globalization.datetimeformatinfo?view=net-7.0
    $culture.DateTimeFormat.LongDatePattern = "yyyy-MM-dd"
    $culture.DateTimeFormat.LongTimePattern = "HH:mm:ss.fff"

    $currentThread.CurrentCulture = $culture
    $currentThread.CurrentUICulture = $culture
}

调用此函数以应用新的默认日期格式。 从配置文件脚本中调用函数以“使其成为默认值”。

看看是否有帮助!

测试和输出:

PS D:\> Get-Date

Tuesday, 14 November 2023 3:38:17 pm

PS D:\> Switch-DefaultTimeFormat
PS D:\> Get-Date

2023-11-14 15:38:17.838

评论

0赞 MattMS 11/15/2023
工作完美(也在 7.3.9 中),TIL 动词。感觉功能内容将是我的个人资料的一个很好的补充。Switch