为什么我在bash中的日期差异会导致负数?

为什么我在bash中的日期差异会导致负数?,bash,shell,date,sh,difference,Bash,Shell,Date,Sh,Difference,当我获得两个日期值并减去它们时,有时我会得到一个负数: start_time=$(date -u +%N) #work end_time=$(date -u +%N) echo "execution time was $(expr $end_time - $start_time) s." 这些日期对象之间的工作是在SciDB中的两个数组之间执行操作(例如,两个100x100数组的乘法)。在不同的情况下,此操作可能需要不到一秒钟的时间,这就是我使用纳秒的原因。 示例输出: computer@

当我获得两个日期值并减去它们时,有时我会得到一个负数:

start_time=$(date -u +%N)

#work

end_time=$(date -u +%N)
echo "execution time was $(expr $end_time - $start_time) s."
这些日期对象之间的工作是在SciDB中的两个数组之间执行操作(例如,两个100x100数组的乘法)。在不同的情况下,此操作可能需要不到一秒钟的时间,这就是我使用纳秒的原因。 示例输出:

computer@place:~/some-scripts$ ./test_mult_100.sh
execution time was 273467147 s.
computer@place:~/some-scripts$ ./test_mult_100.sh
execution time was -735035957 s.

我正在通过PuTTY通过SSH在计算机上执行.sh脚本。对我来说真正奇怪的是,即使在执行中间操作3秒以上之后,我仍然可以获得负数。我取消设置start\u time和end\u time变量,以尝试避免值重叠,尽管我不认为不这样做会导致问题。

%N
是当前秒的纳秒数


它不是自纪元以来的纳秒数。

%N
是当前秒的纳秒数


这不是自新纪元以来的纳秒数。

可能这些数字对于
expr
来说太大了?积极的结果看起来也是错误的。我甚至没有考虑过,但这完全有道理。我将尝试将纳秒改为毫秒,看看是否比毫秒更好。不幸的是,我仍然收到错误。看起来$(date-u+%N)部分不像我希望的那样一致。当我尝试将该值除以1000000(将该值转换为毫秒)时,我不仅偶尔会得到负值,而且偶尔会得到错误消息:“value too great for base”。我试着用这段代码这样做:start_time=$($(date+%N)/1000000))我想我会尝试一种不使用date的方法。可能对于
expr
来说,数字太大了?积极的结果看起来也是错误的。我甚至没有考虑过,但这完全有道理。我将尝试将纳秒改为毫秒,看看是否比毫秒更好。不幸的是,我仍然收到错误。看起来$(date-u+%N)部分不像我希望的那样一致。当我尝试将该值除以1000000(将该值转换为毫秒)时,我不仅偶尔会得到负值,而且偶尔会得到错误消息:“value too great for base”。我试着这样做,代码是:start_time=$($(date+%N)/1000000)),我想我会尝试一种不使用date的方法。这是事实,也是问题的核心。在此之后,我再次搜索了这个问题,并在StackExchange上找到了一篇文章(因此不是StackOverflow,而是相关的)。他们的帖子,在这里:,面向Mac用户,但足以回答我的问题。我意识到我可能也应该发布我的答案。实际上,我在检索时间戳时添加了%s,以获取自纪元以来的秒数。之后的%N将在纳秒内获得它。例如:start_time=$(date-u+%s%N)这是正确的,并且是问题的核心。在此之后,我再次搜索了这个问题,并在StackExchange上找到了一篇文章(因此不是StackOverflow,而是相关的)。他们的帖子,在这里:,面向Mac用户,但足以回答我的问题。我意识到我可能也应该发布我的答案。实际上,我在检索时间戳时添加了%s,以获取自纪元以来的秒数。之后的%N将在纳秒内获得它。例如:开始时间=$(日期-u+%s%N)