运行以下内容:
Get-Process | Select-Object Id,ProcessName,CPU,StartTime | ConvertTo-Json
生成的JSON将StartTime显示为:
"\/Date(1553511537485)\/"
请问如何以给定的日期格式显示StartTime?
答案 0 :(得分:2)
您可以使用计算所得的属性对.ToString
执行StartTime
方法,该方法会将其转换为等效的默认字符串格式:
Get-Process | Select-Object Id,ProcessName,CPU,@{N='StartTime';E={$_.StartTime.ToString()}}| ConvertTo-Json
示例结果:
"StartTime": "23/03/2019 08:55:06"
答案 1 :(得分:0)
尝试通过类似这种方式进行管道传输,这样做的好处是可以处理属性名称未知的日期时间:
foreach-object {$_.Psobject.properties | foreach-object {if ($_.value -ne $null -and $_.value.gettype() -match '.*datetime'){$_.value=$_.value.toString("o")}};$_}
例如对于原始问题:
Get-Process | Select-Object Id,ProcessName,CPU,StartTime | foreach-object {$_.Psobject.properties | foreach-object {if ($_.value -ne $null -and $_.value.gettype() -match '.*datetime'){$_.value=$_.value.toString("o")}};$_} | convertto-json
此处StartTime是一个日期时间字段,因此它在输出JSON中转换为ISO日期。
{
"Id": 7192,
"ProcessName": "ZeroConfigService",
"CPU": 19.703125,
"StartTime": "2020-04-20T16:59:44.1843370+01:00"
}
...而不是:
{
"Id": 7192,
"ProcessName": "ZeroConfigService",
"CPU": 19.71875,
"StartTime": "\/Date(1587398384184)\/"
}
类似的方法也可以用于数据库结果,其中字段名称可能未知:
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery, getDate() anotherDate,'test' string" -ServerInstance "localhost" | Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors | convertto-json
...给予:
{
"TimeOfQuery": "\/Date(1587646812587)\/",
"anotherDate": "\/Date(1587646812587)\/",
"string": "test"
}
鉴于此:
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery, getDate() anotherDate,'test' string" -ServerInstance "localhost" | Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors | foreach-object {$_.Psobject.properties | foreach-object {if ($_.value -ne $null -and $_.value.gettype() -match '.*datetime'){$_.value=$_.value.toString("o")}};$_} | convertto-json
...给出ISO格式的日期:
{
"TimeOfQuery": "2020-04-23T13:53:59.1230000",
"anotherDate": "2020-04-23T13:53:59.1230000",
"string": "test"
}
可以通过更改getString方法toString("o")
的参数来更改日期格式。 “ o”表示ISO日期格式。有关详细信息,请参见https://docs.microsoft.com/en-us/dotnet/api/system.datetime.tostring中示例下的(我认为)。
请注意,管道中的select-object是必需的,否则foreach-object子句将尝试更新原始对象的属性,该属性可能是只读的,您可能不想这样做。 (有人知道更好的方法吗?)