这个数学计算可以在bash中单行完成吗?

时间:2017-11-13 02:10:05

标签: bash datetime

编写公式以将SQL时间值转换为纪元时间,然后将其与今天的日期一起使用来计算以天为单位的时差。我想用一个bashline命令来做这个。

首先,修剪SQL时间码:

x_new

= 40021

然后转换为纪元时间:

printf "%.*f\n" 0 40020.7278236459

= 1248652800

上述结果现在将与当前纪元时间日期一起使用,该时间日期由以下公式计算:

echo "(40021 - 25569) * 86400" | bc

= 1509720642

所以,如果1509720642 - 1248652800 = 261067842,您可以将此差异除以86400以获得解决方案,即天数:

date +%s

= 3021

现在,您如何使用一个bashline公式完成所有这些操作?

3 个答案:

答案 0 :(得分:1)

这是令人发指的,但它确实有效。您可以使用expr来评估表达式并将命令包装在$()中以执行它们。

expr $(expr $(date +%s) - $(echo "($(printf "%.*f\n" 0 40020.7278236459) - 25569) * 86400" | bc)) / 86400

我更愿意使用多行来清楚地表达脚本。

答案 1 :(得分:1)

一种方法(在bash中),通过(或多或少)字面翻译您的算法:

result=$(( ($(date +%s) - ($(printf "%.0f\n" 40020.7278236459) - 25569) * 86400) / 86400 ))

并使用arithmetic expansion $((..))进行整数运算,使用command substitution $(..)来捕获(子)命令的输出。

我们可以将它包装在一个函数中:

conv() { echo $(( ($(date +%s) - ($(printf "%.0f\n" "$1") - 25569) * 86400) / 86400 )); }

并使用它:

$ conv 40020.7278236459
3031

答案 2 :(得分:0)

您的解决方案的以下命令行怎么样,

$ _SQL_TIME=40020.7278236459; echo "( $(date '+%s') - (( $(( $(echo ${_SQL_TIME} | awk '{ printf "%.f\n", $1}') - 25569 )) ) * 86400) ) / 86400" | bc

我希望这会对你有所帮助。