時間をエポックに変換し、その差を秒に変換して2時間の差を計算する方法を示す多くの質問と例を見ました。しかし、時間の違いを計算する最良の方法は何ですか? $ DAY日、$HOUR、HOURS、$MIN MINUTES、$SEC秒?
私の目的に合わせて日付形式のdate+"%m/%d/%y %T"(08/17/18 09:03:31)を使用しています。
最初のデートが08/15/18 16:22:05で、2番目のデートが08/17/18 09:03:31であるとします。 「差は1日16時間41分26秒です。」をエコーして差を計算する方法です。
そして、同じスクリプトを使用して、「差は0日です...」と報告せずに時差が1日未満であるかどうかをどのように識別しますか?
編集:以下にはほとんど機能するスクリプトがありますが、正しい形式を維持するために実行する必要がある作業がたくさんあります。値がゼロかどうかに応じて、適切なスペースとカンマを除いて、すべてがうまくいくようです。
「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