我见过很多问题和例子,展示了如何通过将时间转换为纪元,然后将差异转换为秒来计算两次差异......但是,计算可能跨越的时间差异的最佳方法是什么$DAY 天、$HOUR、小时、$MIN 分钟和 $SEC 秒中的几天?
出于我的目的,我使用日期格式,日期 +"%m/%d/%y %T" (08/17/18 09:03:31)。
假设我的第一次约会是 08/15/18 16:22:05,第二次约会是 08/17/18 09:03:31。如何通过回显“差异为 1 天、16 小时、41 分钟和 26 秒”来计算差异。
而且,使用相同的脚本,它如何识别时间差是否小于一天而不报告“差异为 0 天...”?
编辑:我下面有一个主要工作的脚本,但是,为了保留正确的格式,还有很多工作要做。除了适当的空格和逗号之外,一切似乎都有效,具体取决于值是否为零......
这个想法是,当删除等于“0”的值时,应该在适当的位置用“and”格式化它......
因此,所有值:02:05:23:44 2 天 5 小时 23 分钟 44 秒
无小时:02:00:23:44 2 天 23 分 44 秒
无秒:02:05:23:00 2 天 5 小时 23 秒
不久前我已经很接近它了,但随着某些阅读,它会破裂。对我想要的格式有帮助吗?该脚本也是一团糟......任何帮助清理它都会很好。我想看看如何提高效率。
#!/bin/bash
TIME1="08/17/2018 11:36:40"
TIME2="08/17/2018 12:37:41"
SEC1=`date +%s -d "${TIME1}"`
SEC2=`date +%s -d "${TIME2}"`
DIFF=`expr ${SEC2} - ${SEC1}`
CONVERTTIME() {
((d=${1}/86400))
((h=(${1}%86400)/3600))
((m=(${1}%3600)/60))
((s=${1}%60))
#DAYS
if [ $d -eq 1 ]; then
DAYLABEL=day
else
DAYLABEL=days
fi
DAYCOMMA=", "
if [[ $d -gt 0 || $h && $m && $s -eq 0 ]]; then
DAYCOMMA=""
fi
DAYTEXT="$d $DAYLABEL$DAYCOMMA"
if [ $d -eq 0 ]; then
DAYTEXT=
else
if [ $h -eq 0 ]; then
DAYTEXT="$d $DAYLABEL$DAYCOMMA"
fi
fi
#HOURS
if [ $h -eq 1 ]; then
HOURLABEL=hour
else
HOURLABEL=hours
fi
HOURCOMMA=", "
if [[ $h -gt 0 || $m && $s -eq 0 ]]; then
HOURCOMMA=""
fi
HOURTEXT="$h $HOURLABEL$HOURCOMMA"
if [ $h -eq 0 ]; then
HOURTEXT=""
else
if [ $m -eq 0 ]; then
HOURTEXT="$h $HOURLABEL$HOURCOMMA"
fi
fi
#MINUTES
if [ $m -eq 1 ]; then
MINLABEL=minute
else
MINLABEL=minutes
fi
MINCOMMA=", "
if [[ $m -gt 0 || $s -eq 0 ]]; then
MINCOMMA=""
fi
MINTEXT="$m $MINLABEL$MINCOMMA"
if [ $m -eq 0 ]; then
MINTEXT=""
else
if [ $s -eq 0 ]; then
MINTEXT="$d $MINLABEL$MINCOMMA"
fi
fi
#SECONDS
if [ $s -eq 1 ]; then
SECLABEL=second
else
SECLABEL=seconds
fi
SECTEXT="$s $SECLABEL"
if [ $s -eq 0 ]; then
SECTEXT=""
fi
ANDHOUR=
ANDMIN=
ANDSEC=
if [[ $d && $h && $m && $s -gt 0 || $d && $h && $s -gt 0 || $d && $m && $s -gt 0 || $h && $m && $s -gt 0 || $d && $s -gt 0 || $h && $s -gt 0 || $m && $s -gt 0 ]]; then
ANDSEC="and "
else
#days hours AND minutes
#days AND minutes
#hours AND minutes
if [[ $d && $h && $m -gt 0 || $d && $m -gt 0 || $h && $m -gt 0 ]]; then
ANDMIN="and "
else
#days AND hours
if [[ $d && $h -gt 0 ]]; then
ANDHOUR="and "
fi
fi
fi
echo -e "$DAYTEXT$ANDHOUR$HOURTEXT$ANDMIN$MINTEXT$ANDSEC$SECTEXT"
}
echo
echo "TIME DIFFERENCE: $(CONVERTTIME $DIFF)"
echo
答案1
在某些行中(假设 GNU 日期):
$ diff=$(($(date -ud '08/17/18 09:03:31' +'%s') - $(date -ud '08/15/18 16:22:05' +'%s')))
$ days=$(($(date -ud @$diff +'%-j')-1))
$ date -ud @"$diff" +"$days"'-day(s) %H:%M:%S'
1-day(s) 16:41:26
有效期长达(约)365 天。
作为脚本:
#!/bin/sh
tosec(){ secs=$(date -ud "$1" +'%s'); }
tosec "$1"; sec1=$secs
tosec "$2"; sec2=$secs
diff=$((sec2-sec1))
eval "$(date -ud "@$diff" +'days=%-j time=%H:%M:%S')"
printf '%s\n' "$((days-1))-day(s) $time"
称其为:
$ ./script '08/15/18 16:22:05' '08/17/18 09:03:31'
答案2
我研究了你的脚本并想出了这个:
#!/bin/bash
TIME1="08/17/2018 11:36:40"
TIME2="08/17/2018 12:37:42"
SEC1=`date +%s -d "${TIME1}"`
SEC2=`date +%s -d "${TIME2}"`
DIFF=`expr ${SEC2} - ${SEC1}`
CONVERTTIME() {
brief=false
[[ $1 = "-b" ]] && shift && brief=true
((w=${1}/604800))
((d=(${1}%604800)/86400))
((h=(${1}%86400)/3600))
((m=(${1}%3600)/60))
((s=${1}%60))
narrative=()
list[0]="$w week"
list[1]="$d day"
list[2]="$h hour"
list[3]="$m minute"
list[4]="$s second"
for (( component=0; $component < ${#list[@]}; ++component )); do
# Strip the verbage to get the number
val="${list[$component]/ [a-z]*}"
if [[ "$val" -gt 0 ]]; then
if [[ "$val" -gt 1 ]]; then
list[$component]+='s'
fi
narrative+=( "${list[$component]}" )
fi
done
if $brief; then
if [[ ${#narrative[@]} -eq 0 ]]; then
echo "Now"
else
echo "About ${narrative[0]} ago"
fi
else
if [[ ${#narrative[@]} -eq 0 ]]; then
echo "Now"
elif [[ ${#narrative[@]} -eq 1 ]]; then
echo "${narrative[0]} ago"
elif [[ ${#narrative[@]} -eq 2 ]]; then
echo "${narrative[0]} and ${narrative[1]} ago"
else
for (( index=0; $index < $((${#narrative[@]}-1)); ++index )); do
echo -n "${narrative[$index]}, "
done
echo "and ${narrative[$(( ${#narrative[@]}-1))]} ago"
fi
fi
}
echo
echo "TIME DIFFERENCE: $(CONVERTTIME $DIFF)"
echo
例如:
~ > CONVERTTIME 45
45 seconds ago
~ > CONVERTTIME 65
1 minute and 5 seconds ago
~ > CONVERTTIME 13985
3 hours, 53 minutes, and 5 seconds ago
~ > CONVERTTIME 139854
1 day, 14 hours, 50 minutes, and 54 seconds ago
~ > CONVERTTIME -b 139854
About 1 day ago