Bash 数组的日期递减与解析

Bash 数组的日期递减与解析,bash,shell,Bash,Shell,我有一个不同日期的数组: 2017-10-25 2017-11-17 等等 根据给定的参数,我计算了一个日期:$MEDIA\u NDATE 如果它与数组中的任何日期不匹配,我希望函数递减$MEDIA\u NDATE,直到它与数组中的日期匹配为止 我尝试了不同的方法,但没有找到合适的:( 如果我正确理解了您的问题,您可以通过在一个循环中搜索确切的日期来实现这一点,同时将$MEDIA\u NDATE之前的所有日期添加到临时数组dates。如果存在精确匹配,则从函数返回,如果没有,则搜索数组dat

我有一个不同日期的数组:

  • 2017-10-25
  • 2017-11-17 等等
根据给定的参数,我计算了一个日期:
$MEDIA\u NDATE

如果它与数组中的任何日期不匹配,我希望函数递减
$MEDIA\u NDATE
,直到它与数组中的日期匹配为止

我尝试了不同的方法,但没有找到合适的:(


如果我正确理解了您的问题,您可以通过在一个循环中搜索确切的日期来实现这一点,同时将
$MEDIA\u NDATE
之前的所有日期添加到临时数组
dates
。如果存在精确匹配,则从函数返回,如果没有,则搜索数组
dates
用于最接近
$MEDIA\n日期的日期

为了便于处理,例如日期比较,可以使用
date-d“$some_date”+%s
将所有日期转换为可移植格式,并在函数结束时将其转换回所需格式

contains() {
   local -a dates
   local media_date=$(date -d "$MEDIA_NDATE" +%s)
   local currDate
   local j

   for j in "${arr[@]}"; do
      if [ "$j" == "$MEDIA_NDATE" ]; then
         echo "Value of media_ndate --> $MEDIA_NDATE"
         return 0
      fi

      currDate=$(date -d "$j" +%s)
      (( currDate < media_date )) && dates+=($currDate)

   done

   [[ ${#dates[@]} -eq 0 ]] && return 1
   local result=$(printf -- '%s\n' "${dates[@]}" | sort -nr | head -n 1)

   MEDIA_NDATE=$(date -d "@$result" '+%Y-%m-%d')
   echo "Value of media_ndate --> $MEDIA_NDATE"
   return 0 
}
contains(){
本地-a日期
本地媒体日期=$(日期-d“$media\u NDATE”+%s)
当地货币日期
局部j
对于“${arr[@]}”中的j,请执行以下操作
如果[“$j”==“$MEDIA\u NDATE”];则
echo“媒体的价值-->$media\n数据”
返回0
fi
currDate=$(日期-d“$j”+%s)
((currDate$media\n数据”
返回0
}
编辑:我添加了一个更好的解决方案,它不需要临时数组,只跟踪最近的日期:

contains() {
   [[ ${#arr[@]} -le 0 ]] && return 1

   local media_date=$(date -d "$MEDIA_NDATE" +%s)
   local max_date=$(date -d "${arr[0]}" +%s)
   local curr_date
   local j

   for j in "${arr[@]}"; do
      if [ "$j" == "$MEDIA_NDATE" ]; then
         echo "Value of media_ndate --> $MEDIA_NDATE"
         return 0
      fi

      curr_date=$(date -d "$j" +%s)
      (( curr_date < media_date && curr_date > max_date )) && max_date=$curr_date

   done

   (( max_date > media_date )) && return 1

   MEDIA_NDATE=$(date -d "@$max_date" '+%Y-%m-%d')
   echo "Value of media_ndate --> $MEDIA_NDATE"
}
contains(){
[${arr[@]}-le 0]&&return 1
本地媒体日期=$(日期-d“$media\u NDATE”+%s)
本地最大日期=$(日期-d“${arr[0]}”+%s)
当地货币日期
局部j
对于“${arr[@]}”中的j,请执行以下操作
如果[“$j”==“$MEDIA\u NDATE”];则
echo“媒体的价值-->$media\n数据”
返回0
fi
当前日期=$(日期-d“$j”+%s)
((当前日期<媒体日期和当前日期>最长日期))&最长日期=$curr\u日期
完成
((最长日期>媒体日期))&返回1
媒体数据=$(日期-d“@$max\u date”+%Y-%m-%d')
echo“媒体的价值-->$media\n数据”
}

<或代码> @ Jordydoe,如果这个或任何答案解决了你的问题,请通过点击复选标记来考虑。这向更广泛的社区表明,你已经找到了解决方案并给回答者和你自己带来了一些声誉。没有义务这样做。
contains() {
   [[ ${#arr[@]} -le 0 ]] && return 1

   local media_date=$(date -d "$MEDIA_NDATE" +%s)
   local max_date=$(date -d "${arr[0]}" +%s)
   local curr_date
   local j

   for j in "${arr[@]}"; do
      if [ "$j" == "$MEDIA_NDATE" ]; then
         echo "Value of media_ndate --> $MEDIA_NDATE"
         return 0
      fi

      curr_date=$(date -d "$j" +%s)
      (( curr_date < media_date && curr_date > max_date )) && max_date=$curr_date

   done

   (( max_date > media_date )) && return 1

   MEDIA_NDATE=$(date -d "@$max_date" '+%Y-%m-%d')
   echo "Value of media_ndate --> $MEDIA_NDATE"
}