【问题标题】:Calculating PowerShell ticks in Bash在 Bash 中计算 PowerShell 刻度
【发布时间】:2021-10-25 15:45:46
【问题描述】:

我正在用 Bash 翻译一个 PowerShell 脚本。

这是在 PowerShell 中获取当前日期时间的 ticks 的方式:

[System.DateTime]::Now.Ticks;

通过遵循definition of Ticks,这就是我尝试在bash 中使用date 命令近似相同计算的方式:

echo $(($(($(date -u '+%s') - $(date -d "0001-01-01T00:00:00.0000000 UTC" '+%s'))) * 10000000 ))

这是我上次尝试时得到的:

$ echo $(($(($(date -u '+%s') - $(date -d "0001-01-01T00:00:00.0000000 UTC" '+%s'))) * 10000000 )) ; pwsh -c "[System.DateTime]::Now.Ticks;"
637707117310000000
637707189324310740

尤其是前 7 位数字相同,但位置 8 和 9 的数字在两个值之间仍然相差太大。

我计算出这意味着这两个值之间只有 2 小时的差异。但为什么?它不能是时区,因为我在两个 date 命令中都指定了 UTC 时区,对吧?你怎么看?

注意:我对时区的怀疑正在增加,因为我目前居住在 UTC+2(因此与 UTC 相差 2 小时),但这怎么可能,因为我明确指定 UTC 作为时区在date 命令中?

【问题讨论】:

    标签: bash powershell datetime


    【解决方案1】:

    解决了!问题不在date 命令中,而是在使用+2 时区(CEST 时间)的PowerShell 命令中。为了解决这个问题,我现在使用UtcNow 而不是Now

    这就是我现在得到的:

    $ echo $(($(($(date -u '+%s') - $(date -d "0001-01-01T00:00:00.0000000 UTC" '+%s'))) * 10000000 )) ; pwsh -c "[System.DateTime]::UtcNow.Ticks;"
    637707132410000000
    637707132415874110
    

    如您所见,现在所有数字都是相同的,除了最后第 7 位数字,因为我故意添加零以将秒数转换为滴答声,因为我对秒的分数不感兴趣(现在)而且我认为它们可以忽略不计。

    另一种方式

    另一种使两个值相同(仍然不包括秒数)的方法是删除第一个date 命令中的-u 选项以使用当前时区,并将UTC 替换为@ 987654328@ 在第二个 date 命令中。如果我这样做,我可以在 PowerShell 命令中保留Now(而不是用UtcNow 替换它)。

    通过这样做,我得到:

    $ echo $(($(($(date '+%s') - $(date -d "0001-01-01T00:00:00.0000000 +0200" '+%s'))) * 10000000)) ; pwsh -c "[System.DateTime]::Now.Ticks;"
    637707218060000000
    637707218067248090
    

    如果你还想要几分之一秒

    我刚刚明白,如果您还需要考虑秒的分数,那么您只需将date '+%N'(纳秒)除以 100 的结果添加到计算中,采用上述两种方法中的任何一种。

    由于date '+%N' 的结果可以有一些前导零,Bash 可能认为它是一个八进制值。为避免这种情况,只需在前面加上 10# 以明确表示它是十进制值。

    例如,采用上面显示的第二种方法(“替代方法”),现在我得到:

    $ echo $(($(($(date '+%s') - $(date -d "0001-01-01T00:00:00.0000000 +0200" '+%s'))) * 10000000 + $((10#$(date '+%N')/100)) ))
    637707225953311420
    

    【讨论】:

      猜你喜欢
      • 2018-04-21
      • 2013-10-22
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多