如何避免Powershell的ConvertTo-Json将日期转换为Epoch时间
解决PowerShell ConvertTo-Json自动转换日期为Epoch格式的方案
方法一:阻止自动转换,直接生成人类可读日期格式
- 适配所有PowerShell版本的通用方案
提前通过计算属性将DateTime类型字段转换为指定格式的字符串,再执行JSON序列化:
Get-LocalUser | Select-Object Name, Enabled, ` @{Name='PasswordLastSet';Expression={$_.PasswordLastSet.ToString('yyyy-MM-dd HH:mm:ss')}}, ` @{Name='LastLogon';Expression={$_.LastLogon.ToString('yyyy-MM-dd HH:mm:ss')}} | ConvertTo-Json
可根据需求自行调整ToString参数中的日期格式规则。
- PowerShell 7+专属简化方案
PowerShell 7及以上版本的ConvertTo-Json新增了-DateTimeFormat参数,直接指定日期格式即可:
Get-LocalUser | ConvertTo-Json -DateTimeFormat 'yyyy-MM-dd HH:mm:ss'
注意:该参数仅支持PowerShell 7及更高版本,Windows PowerShell 5.1无法使用
方法二:将已生成的Epoch日期格式转回可读格式
对于已经生成的包含\/Date(1597311158786)\/格式的JSON内容,可通过正则提取时间戳转换:
- 单个日期转换示例:
# 提取Epoch毫秒时间戳 $epochMs = [long][regex]::Match($yourJsonString, '\\/Date\((\d+)\)\\/').Groups[1].Value # 转换为本地时区可读日期 $readableDate = [DateTimeOffset]::FromUnixTimeMilliseconds($epochMs).LocalDateTime.ToString('yyyy-MM-dd HH:mm:ss')
- 批量替换JSON中所有日期格式示例:
$convertedJson = [regex]::Replace($yourRawJson, '\\/Date\((\d+)\)\\/', { param($match) $epochMs = [long]$match.Groups[1].Value return [DateTimeOffset]::FromUnixTimeMilliseconds($epochMs).LocalDateTime.ToString('yyyy-MM-dd HH:mm:ss') })
如果你的时间戳为秒级而非毫秒级,将FromUnixTimeMilliseconds替换为FromUnixTimeSeconds即可。
内容的提问来源于stack exchange,提问作者QuantAC
相关产品推荐
相关产品推荐

