计算几天内的时间差

计算几天内的时间差

我见过很多问题和例子,展示了如何通过将时间转换为纪元,然后将差异转换为秒来计算两次差异......但是,计算可能跨越的时间差异的最佳方法是什么$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

相关内容