如何禁用PowerShell Invoke-RestMethod响应反序列化后的UTC时区转换
可以通过两种替代方案实现保留原始日期值的需求,PowerShell 5.1 版本的 Invoke-RestMethod 没有内置参数可以直接禁用日期自动转UTC的逻辑,该转换属于组件内置的默认行为。
方案1:抓取原始响应手动解析JSON
避免使用 Invoke-RestMethod 的自动解析逻辑,改用 Invoke-WebRequest 获取原始响应字符串,手动控制JSON解析过程:
# 获取原始响应内容 $rawResponse = Invoke-WebRequest -Method Get -Uri $url -Headers $requestHeaders # 加载序列化组件,禁用日期自动解析 Add-Type -AssemblyName System.Web.Extensions $jsonSerializer = New-Object System.Web.Script.Serialization.JavaScriptSerializer $jsonSerializer.DateParseHandling = [System.Web.Script.Serialization.DateParseHandling]::None # 解析后日期属性会保留原始字符串格式 $response = $jsonSerializer.DeserializeObject($rawResponse.Content)
如果需要保留DateTime类型而非字符串,可以把DateParseHandling设置为DateTimeOffset或者指定解析时的时区基准。
方案2:自动转换后回退到原时区
如果能接受先转UTC再回退的流程,直接对转换后的DateTime对象做时区转换即可:
# 回退到本地时区时间 $originalDate = $response.yourDateProperty.ToLocalTime() # 若API返回的是非本地时区的时间,指定时区转换即可,示例为转中国标准时间 $targetZone = [TimeZoneInfo]::FindSystemTimeZoneById("China Standard Time") $originalDate = [TimeZoneInfo]::ConvertTimeFromUtc($response.yourDateProperty, $targetZone)
注意:PowerShell 7+ 版本中
ConvertFrom-Json新增了-DateKind参数,可以直接指定日期解析的时区基准,也可以搭配Invoke-RestMethod的参数调整转换逻辑,该特性不兼容你使用的5.1版本。
内容的提问来源于stack exchange,提问作者soldous
相关产品推荐
相关产品推荐

