如何将任意时区的指定时间戳转换为UTC(含夏令时处理)
解决指定时区时间转UTC并自动适配夏令时的问题
问题根源
你的初始代码使用时区的BaseUtcOffset(基础UTC偏移)进行计算,但这个值不包含夏令时(DST)的动态偏移。比如2024年3月12日太平洋时区已经切换到夏令时(UTC-7),但BaseUtcOffset还是UTC-8,所以计算结果会偏差1小时。
正确实现方式
PowerShell的[TimeZoneInfo]类提供了自动处理夏令时的转换方法,无需手动计算偏移:
方法1:直接使用静态方法转换
$sourceTime = [datetime]::new(2024,3,12,10,0,0) $sourceZone = [TimeZoneInfo]::FindSystemTimeZoneById('Pacific Standard Time') # 自动适配夏令时的UTC转换 $utcTime = [TimeZoneInfo]::ConvertTimeToUtc($sourceTime, $sourceZone) Write-Host 'UTC-time:' $utcTime
方法2:封装成可复用函数
如果需要频繁转换,可以写一个通用函数:
function Convert-ToUtc { param( [Parameter(Mandatory=$true)] [datetime]$SourceTime, [Parameter(Mandatory=$true)] [string]$SourceTimeZoneId ) $timeZone = [TimeZoneInfo]::FindSystemTimeZoneById($SourceTimeZoneId) return [TimeZoneInfo]::ConvertTimeToUtc($SourceTime, $timeZone) } # 使用示例 $myTime = [datetime]::new(2024,11,3,10,0,0) # 太平洋时区夏令时结束后的时间 $myZone = 'Pacific Standard Time' $utcResult = Convert-ToUtc -SourceTime $myTime -SourceTimeZoneId $myZone Write-Host '转换后的UTC时间:' $utcResult
说明
[TimeZoneInfo]::ConvertTimeToUtc会自动根据传入的SourceTime判断该时区在对应时间是否处于夏令时,自动应用正确的偏移量。- 可以通过
Get-TimeZone -ListAvailable查看系统支持的所有时区ID,确保传入的SourceTimeZoneId是有效的系统时区ID。
内容的提问来源于stack exchange,提问作者Carsten
相关产品推荐
相关产品推荐

