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"
}