PowerShell解析DNS时间戳时如何自动处理夏令时问题?
解决CSVDE导出DNS记录中dnsRecord时间戳的夏令时偏差问题
我正在解析CSVDE导出的DNS记录中的dnsRecord属性,该属性将时间戳存储为自1601年1月1日UTC午夜(00:00:00)起经过小时数的十六进制字符串。
使用以下代码解析时,夏令时段的结果出现偏差:
$dnsRecordTimestampBytes = '0038a293' (Get-Date '01/01/1601Z').AddHours([int]('0x' + $dnsRecordTimestampBytes))
运行结果为03 June 2024 11:00:00,但正确结果应为03 June 2024 12:00:00。
而在非夏令时段,解析结果符合预期:
$dnsRecordTimestampBytes = '00389c04' (Get-Date '01/01/1601Z').AddHours([int]('0x' + $dnsRecordTimestampBytes))
得到的25 March 2024 12:00:00与预期一致。
请问是否存在无需手动判断夏令时起止区间的修复方法?
修复方法:将UTC时间转换为本地时区时间
问题根源在于代码计算得到的是UTC时间,但你预期的是本地时区时间。夏令时期间本地时区与UTC存在偏移,导致显示结果偏差。只需将计算出的UTC时间转换为本地时区时间,PowerShell会自动处理夏令时偏移,无需手动判断区间。
修改后的代码:
$dnsRecordTimestampBytes = '0038a293' # 计算UTC时间 $utcTimestamp = (Get-Date '01/01/1601Z').AddHours([int]('0x' + $dnsRecordTimestampBytes)) # 转换为本地时区时间 $localTimestamp = $utcTimestamp.ToLocalTime() # 输出预期格式的结果 $localTimestamp.ToString("dd MMM yyyy HH:mm:ss")
运行上述代码,夏令时段的结果会自动调整为03 June 2024 12:00:00,非夏令时段也会保持正确。
补充说明
如果你的预期结果是UTC时间而非本地时间,只需确保输出UTC时间即可:
$dnsRecordTimestampBytes = '0038a293' $utcTimestamp = (Get-Date '01/01/1601Z').AddHours([int]('0x' + $dnsRecordTimestampBytes)) $utcTimestamp.ToString("dd MMM yyyy HH:mm:ss")
此代码会直接输出UTC时间,不受本地夏令时影响。
内容的提问来源于stack exchange,提问作者user2871239
相关产品推荐
相关产品推荐

