在Windows jq中比较'YYYY-mm-dd HH:MM:SS'格式的时间戳

时间:2018-11-21 10:07:04

标签: windows cmd jq

我在Ubuntu上使用jq,但是现在我必须将命令移植到Windows 8.1。我正在使用jq 1.6。

但是在Windows strptime上使用jq时出现此错误。

  

jq:错误(在xxxx.json:xxx处):在此平台上未实现strptime / 1

用于Windows的strptime的其他选项是什么?

示例:

这对我来说适用于Ubuntu,需要使其在Windows上运行(只需时差以秒为单位)。

jq -n '{"t1": "2018-06-01 12:45:56", "t2": "2018-06-03 22:10:01"} |
       (.t2 | strptime("%Y-%m-%d %H:%M:%S") | mktime)-
       (.t1 | strptime("%Y-%m-%d %H:%M:%S") | mktime)'
206645

更新:

我刚刚发现,即使mktime在Windows上也会为我产生相同的错误。因此,我更新了一个问题,我只需要一些方法就可以比较特定格式的日期时间(以秒为单位)(使用或不使用strptime)。

1 个答案:

答案 0 :(得分:2)

首先,jq的MsiExec.exe /X{26A24AE4-039D-4CA4-87B4-2F32180181F0}的“插件”实现:

mktime/0

接下来,要解析格式为# [1970, 0, 1, 0, 0, 0] | mktime #=> 0 # For Jan, use 0 for $m. # Emit null if any inputs are judged to be invalid. # No attempt to account for leap seconds is made. # Can also be used for earlier years. # # Adapted from # https://codereview.stackexchange.com/questions/11614/determine-total-number-of-seconds-since-the-epoch def mktime: def max: if .[0] > .[1] then .[0] else .[1] end; def min: if .[0] > .[1] then .[1] else .[0] end; def NDaysInMonth: [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; . as [$y, $m, $d, $h, $mn, $s] | if ($y < 0 or $m < 0 or $d < 1 or $h < 0 or $mn < 0 or $s < 0) then null else 1970 as $ye # UNIX epoch 01/01/1970 | (if $y > $ye then 1 else -1 end) as $sign | ([$y, $ye] | max) as $maxY | ([$y, $ye] | min) as $minY | reduce range($minY; $maxY) as $i ({nleapYears: 0}; if (($i % 100 != 0 and $i % 4 == 0) or $i % 400 == 0) then .nleapYears += 1 else . end) | if ($m > 1) and (($y % 100 != 0 and $y % 4 == 0) or $y % 400 == 0) then .nleapYears += $sign else . end | .nleapYears |= ([0, .] | max) | reduce range(0;$m) as $i (.monthsNDays = 0; .monthsNDays += NDaysInMonth[$i]) | (($y - $ye) * 365 + $sign * .nleapYears + .monthsNDays + $d - 1) * 86400 + $h * 3600 + $mn * 60 + $s end ; 的日期字符串,可以轻松使用jq的"2018-06-01 12:45:56"(请参见jq manual)。由于SO不是免费的编程服务,因此将其作为练习,就像将所有部分放在一起一样。