我有一个不同日期的数组:
根据给定的参数,我计算了一个日期:$MEDIA_NDATE
。
如果它与数组中的任何日期不匹配,我希望函数递减$MEDIA_NDATE
,直到它与数组中的日期匹配。
我尝试了不同的东西,但我找不到合适的东西:(
function contains() {
i=0
len=${#arr[@]}
while [ $i -lt $len ]; do
for j in "${arr[@]}"
do
if [ "$j" == "$MEDIA_NDATE" ];then
echo " value of media_ndate --> : $MEDIA_NDATE"
return 0
elif [ "$j" != "$MEDIA_NDATE" ];then
let i++
elif [ "$i" -eq "$len" ] && [ "$j" != "$MEDIA_NDATE"];then
# MEDIA_NDATE=$(date +%Y-%m-%d -d "$MEDIA_NDATE -i day")
# echo "value of media_ndate in function contains $MEDIA_NDATE "
fi
done
done
答案 0 :(得分:1)
如果我正确理解了您的问题,您可以通过在一个循环中搜索确切日期,同时通过将DialogResult
添加到临时数组$MEDIA_NDATE
来跟踪dates
之前的所有日期来实现此目的。如果存在完全匹配,则从函数返回,如果没有,则在数组dates
中搜索最接近$MEDIA_NDATE
的日期。
为了便于处理,例如日期比较,将所有日期转换为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() {
[[ ${#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"
}