我在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
)。
答案 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不是免费的编程服务,因此将其作为练习,就像将所有部分放在一起一样。