日以内の視差を計算します。

日以内の視差を計算します。

時間をエポックに変換し、その差を秒に変換して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'

おすすめ記事