在Bash中计算PowerShell Ticks出现2小时时区偏差问题求助
你遇到的2小时时区偏差核心原因是PowerShell侧调用的时间属性和Bash侧的计算逻辑时区不匹配:
你在PowerShell中使用的是[System.DateTime]::Now,该属性返回的是本地时区(你所在地为UTC+2)的当前时间,而你Bash脚本的计算全程基于UTC时区,二者天然存在2小时的时间差,和你是否在date命令中指定UTC无关。
修复方案
- 先对齐PowerShell侧的时间时区,将调用改为
[System.DateTime]::UtcNow,即可消除时区偏差,测试命令如下:
echo $(($(($(date -u '+%s') - $(date -d "0001-01-01T00:00:00.0000000 UTC" '+%s'))) * 10000000 )) ; pwsh -c "[System.DateTime]::UtcNow.Ticks;"
- 若你需要保持PowerShell侧获取本地时间ticks的逻辑,只需要修改Bash侧的计算,去掉date命令的
-u参数,同时将基准时间的时区改为本地时区即可。
精度优化说明
你当前的Bash实现只能得到秒级精度的ticks值,因为date +%s返回的是秒级时间戳,和PowerShell原生返回的100纳秒级精度的ticks有差异,可使用以下优化后的代码实现更高精度的对齐:
# 硬编码0001-01-01 UTC到1970-01-01 UTC的固定秒数偏移,避免date命令处理古日期可能出现的历法转换问题 EPOCH_OFFSET=62135596800 # 计算当前UTC时间的ticks:1 tick = 100纳秒 now_sec=$(date -u '+%s') now_nsec=$(date -u '+%N') ticks=$(( (now_sec - EPOCH_OFFSET) * 10000000 + now_nsec / 100 )) echo $ticks
内容的提问来源于stack exchange,提问作者GeekInDisguise
相关产品推荐
相关产品推荐

