这并不难,但它确实需要几个步骤:解析传入的时间格式,找到以秒为单位的差异,以及计算差异的不同时间单位。
给定
d1=20180110141907
d2=20180111162211
GNU awk
gawk -v start="$d1" -v stop="$d2" '
function str2time(time, re, arr, t) {
re = "([[:digit:]]{4})([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})([[:digit:]]{2})"
t = -1
if (match(time, re, arr))
t = mktime(arr[1] " " arr[2] " " arr[3] " " arr[4] " " arr[5] " " arr[6])
return t
}
BEGIN {
t1 = str2time(start)
t2 = str2time(stop)
diff = t2 - t1
if (diff < 0) diff = -diff #awk does not have abs()
days = int(diff / 86400); diff %= 86400
hours = int(diff / 3600); diff %= 3600
mins = int(diff / 60); diff %= 60
printf("%d days %d hours %d mins %d secs\n", days, hours, mins, diff)
}
'
1 days 2 hours 3 mins 4 secs
Perl
perl -MTime::Piece -sE '
$t1 = Time::Piece->strptime($start, "%Y%m%d%H%M%S");
$t2 = Time::Piece->strptime($stop, "%Y%m%d%H%M%S");
$diff = abs($t2 - $t1);
$days = int($diff / 86400); $diff %= 86400;
$hours = int($diff / 3600); $diff %= 3600;
$mins = int($diff / 60); $diff %= 60;
printf "%d days %d hours %d mins %d secs\n", $days, $hours, $mins, $diff;
' -- -start="$d1" -stop="$d2"
1 days 2 hours 3 mins 4 secs