PowerShell脚本时区转换异常:不同用户时区显示相同时间问题排查
问题定位与解决:PowerShell时区转换错误导致显示原始PST时间
问题根源
你的代码核心问题在于解析PST时间字符串时未明确关联时区,导致后续转换逻辑失效:
- 用
TryParseExact得到的$startTimePST和$endTimePST的Kind属性为Unspecified,PowerShell无法识别这是PST时区的时间 - 调用
ConvertTime时,会默认把这个未指定时区的时间当成当前用户本地时区的时间来转换,相当于做了无效转换,最终显示的还是原始PST时间数值
解决方案
需要先将解析出的未指定时区时间明确关联到PST时区,再转换为用户本地时区。同时建议用UTC时间做时间比较,避免时区差异导致的判断错误。
修改后的代码
$format = "M/d/yyyy h:mm:ss tt" $pstTimeZone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Pacific Standard Time") # 解析PST时间字符串为未指定时区的DateTime $startTimePST = [System.DateTime]::MinValue $startvalue = "7/10/2023 8:30:45 AM" [System.DateTime]::TryParseExact($startvalue, $format, [System.Globalization.CultureInfo]::InvariantCulture, [System.Globalization.DateTimeStyles]::None, [ref]$startTimePST) $endTimePST = [System.DateTime]::MinValue $stopvalue = "7/10/2023 4:08:45 PM" [System.DateTime]::TryParseExact($stopvalue, $format, [System.Globalization.CultureInfo]::InvariantCulture, [System.Globalization.DateTimeStyles]::None, [ref]$endTimePST) # 将PST时间转换为UTC(明确解析的时间属于PST时区) $startTimeUtc = [System.TimeZoneInfo]::ConvertTimeToUtc($startTimePST, $pstTimeZone) $endTimeUtc = [System.TimeZoneInfo]::ConvertTimeToUtc($endTimePST, $pstTimeZone) # 获取用户本地时区并转换起止时间 $userTimeZone = [System.TimeZoneInfo]::Local $startTimeLocal = [System.TimeZoneInfo]::ConvertTimeFromUtc($startTimeUtc, $userTimeZone) $endTimeLocal = [System.TimeZoneInfo]::ConvertTimeFromUtc($endTimeUtc, $userTimeZone) # 用UTC时间做比较,避免时区判断错误 $currentUtcTime = [DateTime]::UtcNow if ($currentUtcTime -ge $startTimeUtc -and $currentUtcTime -le $endTimeUtc) { $message = "系统不可用时段(本地时间):$($startTimeLocal.ToString($format)) 至 $($endTimeLocal.ToString($format))" Write-Host $message }
关键修改说明
- 提前获取PST时区对象
$pstTimeZone,明确后续时间所属时区 - 通过
ConvertTimeToUtc将解析出的未指定时区时间转换为UTC,这一步会告知PowerShell:该时间属于PST时区,需转成标准UTC时间 - 转换用户本地时区时,从UTC时间转换,逻辑更清晰且不易出错
- 时间比较改用UTC时间,避免不同时区下的时间判断偏差
- 输出时用指定格式
$format格式化本地时间,保证显示一致性
内容的提问来源于stack exchange,提问作者Rabins Rai
相关产品推荐
相关产品推荐

