Bash 如何预设一段时间';前';(从现在开始的相对时间)

Bash 如何预设一段时间';前';(从现在开始的相对时间),bash,command-line,date-formatting,Bash,Command Line,Date Formatting,如何显示给定日期的时间。例如: echo "File was modified `date -r file.txt`" DATE=$(date -r file.txt +%s) NOW=$(date +%s) DIFF=$(expr $NOW - $DATE) SEC=$((DIFF % 60)) DIFF=$((DIFF / 60)) MIN=$((DIFF % 60)) DIFF=$((DIFF / 60)) HOUR=$((DIFF % 24)) DIFF=$((DIFF / 2

如何显示给定日期的时间。例如:

echo "File was modified `date -r file.txt`"
DATE=$(date -r file.txt +%s)
NOW=$(date +%s)
DIFF=$(expr $NOW - $DATE)

SEC=$((DIFF % 60))

DIFF=$((DIFF / 60))
MIN=$((DIFF % 60))

DIFF=$((DIFF / 60))
HOUR=$((DIFF % 24))

DIFF=$((DIFF / 24))
DAY=$DIFF

echo $DAY days, $HOUR hours, $MIN mins, $SEC seconds ago.
这将反映:

File was modified Tue Jan  7 00:52:40 GMT 2014
但是,我希望它类似于以下内容:

File was modified 3 seconds ago
File was modified 1 hour ago
File was modified 2 days ago
File was modified 3 weeks ago
或者类似的。关键是当它包含在一个句子中时,应该很容易理解


(这不是只指定整天的副本。)

您可以使用“执行一些模运算”来完成此操作。例如:

echo "File was modified `date -r file.txt`"
DATE=$(date -r file.txt +%s)
NOW=$(date +%s)
DIFF=$(expr $NOW - $DATE)

SEC=$((DIFF % 60))

DIFF=$((DIFF / 60))
MIN=$((DIFF % 60))

DIFF=$((DIFF / 60))
HOUR=$((DIFF % 24))

DIFF=$((DIFF / 24))
DAY=$DIFF

echo $DAY days, $HOUR hours, $MIN mins, $SEC seconds ago.

今天我遇到了一个类似的问题,并为此编写了一个函数:

 time_ago() {
  if (( $# < 1 )); then
    local u=$(tput smul) # underline 
    local n=$(tput rmul) # no underline 
    echo "usage: time_ago ${u}timestamp_ago${n} [${u}timestamp_now${n}]"
    exit 1
  fi
  local minutes=60
  local hours=$(( 60 * minutes ))
  local days=$(( 24 * hours ))
  local diff=$(( ${2:-$(date +%s)} - $1 ))
  local human
  if (( diff < 30 )); then
    human="${diff} seconds"
  elif (( diff < 90 )); then
    human="1 minute"
  elif (( diff < 1 * hours )); then
    human="$(( (diff + minutes / 2) / minutes )) minutes"
  elif (( diff < 1 * hours + 30 * minutes )); then
    human="about 1 hour"
  elif (( diff < 1 * days )); then
    human="about $(( (diff + hours / 2) / hours )) hours"
  elif (( diff < 2 * days)); then
    human="1 day"
  else
    human="$(( (diff + days / 2) / days)) days"
  fi

  echo "$human ago"
}

if [[ "$0" = "./time_ago" ]];then
  time_ago 1556324045 1556540404 # 3 days ago 
  time_ago 1556424045 1556540404 # 1 day ago 
  time_ago 1556534045 1556540404 # about 2 hours ago
  time_ago 1556536045 1556540404 # about 1 hour ago
  time_ago 1556539145 1556539875 # 12 minutes ago 
  time_ago 1556539900 1556539921 # 21 seconds ago
  time_ago
fi
time\u ago(){
如果($#<1));那么
本地u=$(tput smul)#下划线
本地n=$(tput rmul)#无下划线
echo“用法:time_ago${u}timestamp_ago${n}[${u}timestamp_now${n}]”
出口1
fi
本地分钟=60
当地时间=$((60*分钟))
当地天数=$(24小时))
本地差异=$(${2:-$(日期+%s)}-$1))
当地人
如果((差值<30));则
human=“${diff}秒”
elif((差值<90));然后
human=“1分钟”
elif((差值<1*h));然后
人力=“$((差异+分钟/2)/分钟)分钟”
elif((差值<1*小时+30*分钟));然后
human=“大约1小时”
elif((差值<1*天));然后
human=“大约$((差异+小时/2)/小时)小时”
elif((差值<2*天));然后
人类=“1天”
其他的
人力=“$((差异+天/2)/天”)天”
fi
echo“$human ago”
}
如果[[“$0”=”/“时间”];然后
时间1556324045 1556540404三天前
时间1556424045 1556540404一天前
时间是1556534045 1556540404,大约2小时前
时间是1556536045 1556540404,大约1小时前
时间1556539145 1556539875?12分钟前
时间1556539900 1556539921秒前
很久以前
fi

它是可用的,就像您想要评论/编辑一样。时间间隔的灵感来源于。

对于日期算术,您最好的选择是更高级的编程语言,如Python。这可以为您提供构建算法的想法。这开始接近我所追求的,但它显示了冗余使用(例如
0天、0小时、0分钟、15秒前
)并在单数值周围出现语法错误(例如,1天、1小时、1分钟、1秒钟前)。这似乎是小型命令行工具甚至bash脚本的理想选择,它可以接受两个日期,并产生更好、更简洁的输出,如原始问题所示。@dg99似乎我误解了您的问题。你想在bash中找到类似but的东西吗?是的,没错。我在优化人类的可读性。值将在一个句子中,而不是在一个表中,因此它应该读得很好。感谢您分享您的解决方案!