get_date.sh


#!/usr/bin
####################################################################
#日期函數處理
#獲取某個月份的天數 getMonthMaxDay yyyy-mm-dd 返回格式:yyyy-mm-dd
#獲取後一天日期 getNextDate yyyy-mm-dd 返回格式:yyyy-mm-dd
#獲取後面N天的日期 getNextNDate yyyy-mm-dd N 返回格式:yyyy-mm-dd
#獲取前一天日期 getLastDate yyyy-mm-dd 返回格式:yyyy-mm-dd
#獲取當前數據日期前N天的日期 getLastNDate yyyy-mm-dd N 返回格式:yyyy-mm-dd
#獲取當日對應的月的月末日期 getEndMonDay yyyy-mm-dd 返回格式:yyyy-mm-dd
#獲取下月的月末日期 getNextMonEndDay yyyy-mm-dd 返回格式:yyyy-mm-dd
#獲取下月同期日期 getNextMonthDay yyyy-mm-dd 返回格式:yyyy-mm-dd
#獲取上月同期日期 getLastMonthDay yyyy-mm-dd 返回格式:yyyy-mm-dd
#獲取上月同期數據日期 getLMDataDay yyyy-mm-dd 返回格式:yyyy-mm-dd 注:若本月日期是月末則上月同期始終爲月末日期,不是月末則本月的日期位比
上月月末日期大於等於則取上月倒數次日
#獲取去年同期日期 getLastYearDay yyyy-mm-dd 返回格式:yyyy-mm-dd
####################################################################算法

###獲取某個月份的天數
getMonthMaxDay(){
virdate=`echo ${1}`;
virM=`echo ${1}`;
viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ;
virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ;
virday=`echo ${virdate}|awk -F "-" '{print $3}'` ;
#參數爲空
if [ ! -n "$virmonth" ];
then
virmonth=`echo ${virM}`;
fi

if [ ! -n "$virmonth" ];
then
return 0
fi

if [ $virmonth -gt 0 -a $virmonth -lt 13 ]
then
case $virmonth in 1|01|3|03|5|05|7|07|8|08|10|12 )
maxday=31 ;;
4|04|6|06|9|09|11 )
maxday=30 ;;
2|02 )
if [ `expr $viryear % 4` -eq 0 ]
then
if [ `expr $viryear % 400` -eq 0 ]
then
maxday=29
elif [ `expr $viryear % 100` -eq 0 ]
then
maxday=28
else
maxday=29
fi
else
maxday=28
fi ;;
esac
fi
echo $maxday
}函數

####獲取後一天日期
getNextDate() {
virdate=`echo ${1}`;
#劃分年月日
viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ;
virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ;
virday=`echo ${virdate}|awk -F "-" '{print $3}'` ;

#獲取某月最後一天
virmonth_endday=`echo $(getMonthMaxDay $virdate )` ;

virday=` expr $virday + 1 `;
##當日+1後日期大於月末則月份+1,同時當日設置爲1號;月份+1大於12後則年份+1,同時月份設置爲1月
if [ ${virday} -gt ${virmonth_endday} ]
then
virday=` expr 0 + 1 `;
virmonth=` expr $virmonth + 1 `;
if [ $virmonth -gt 12 ]
then
virmonth=` expr 0 + 1 `;
viryear=` expr ${viryear} + 1 `;
fi
else
virmonth=` expr $virmonth + 0 `;
fi

##月份或者日期小於10將月份或者日期的字符前面加一個0,補足兩位格式
if [ $virmonth -lt 10 ]
then
virmonth=`echo 0${virmonth}`;
fi

if [ $virday -lt 10 ]
then
virday=`echo 0${virday}`;
fi

virdate=`echo ${viryear}-${virmonth}-${virday}` ;
echo $virdate
}
##獲取後面N天的日期
getNextNDate() {
virdate=`echo ${1}`;
LastN=`echo ${2}`;
#劃分年月日
num=`echo 1`;
while [ ${num} -le ${LastN} ]
do
virdate=`echo $(getNextDate $virdate )` ;
num=` expr $num + 1 `;
done
echo ${virdate}
}get

####獲取前一天日期
getLastDate() {
virdate=`echo ${1}`;
#劃分年月日
viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ;
virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ;
virday=`echo ${virdate}|awk -F "-" '{print $3}'` ;

#獲取某月最後一天
virmonth_endday=`echo $(getMonthMaxDay $virdate )` ;

virday=` expr $virday - 1 `;
##當日-1後日期小於等於0,同時當日設置上月月末,同時月份-1
if [ ${virday} -le 0 ]
then
virmonth=` expr $virmonth - 1 `;
if [ $virmonth -le 0 ]
then
viryear=` expr ${viryear} - 1 `;
virmonth=`echo 12`;
fi
##月份或者日期小於10將月份或者日期的字符前面加一個0,補足兩位格式
if [ $virmonth -lt 10 ]
then
virmonth=`echo 0${virmonth}`;
fi
virday=`echo $(getMonthMaxDay ${viryear}-${virmonth}-01 )` ;
fi

if [ $virday -lt 10 ]
then
virday=`echo 0${virday}`;
fi

virdate=`echo ${viryear}-${virmonth}-${virday}` ;
echo $virdate
}
#獲取當前數據日期前N天的日期
getLastNDate() {
virdate=`echo ${1}`;
LastN=`echo ${2}`;
#劃分年月日
num=`echo 1`;
while [ ${num} -le ${LastN} ]
do
virdate=`echo $(getLastDate $virdate )` ;
num=` expr $num + 1 `;
done
echo ${virdate}
}
###獲取當日對應的月的月末日期
getEndMonDay() {
virdate=`echo ${1}`;
viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ;
virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ;
virday=`echo ${virdate}|awk -F "-" '{print $3}'` ;
maxday=`echo $(getMonthMaxDay $virdate )` ;
virdate=`echo ${viryear}-${virmonth}-${maxday}` ;
echo $virdate
}
###獲取下月的月末日期
getNextMonEndDay() {
virdate=`echo ${1}`;
virdate=`echo $(getNextMonthDay $virdate )` ;
virdate=`echo $(getEndMonDay $virdate )` ;
echo $virdate
}ast

####獲取下月同期日期
getNextMonthDay() {
virdate=`echo ${1}`;
viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ;
virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ;
virday=`echo ${virdate}|awk -F "-" '{print $3}'` ;

vir_cur_Endday=`echo $(getMonthMaxDay ${virdate} )` ;
vir_cur_day=` expr $virday + 0 `;

##月份+1
virmonth=` expr $virmonth + 1 `;
#----若是月份相加大於等於13則將月份置成1月
if [ $virmonth -gt 12 ]
then
virmonth=1;
viryear=` expr ${viryear} + 1 `;
fi

##月份小於10 須要前置補足一個0用兩位表示月份
if [ $virmonth -lt 10 ]
then
virmonth=`echo 0${virmonth}`;
else
virmonth=`echo ${virmonth}`;
fi

vir_NextM_Endday=`echo $(getMonthMaxDay ${viryear}-${virmonth}-01 )` ;

virday=` expr $virday + 0 `;

###若是月份+1的後,月末日期小於傳入的參數的日期則將同期設置成月末日期
if [ ${virday} -ge ${vir_NextM_Endday} ]
then
virday=`echo ${vir_NextM_Endday}`;
fi
###若是傳入數據日期爲當月月末日期,則下月同期就爲月末日期
if [ ${vir_cur_day} -eq ${vir_cur_Endday} ]
then
virday=`echo ${vir_NextM_Endday}`;
fi

if [ $virday -lt 10 ]
then
virday=`echo 0${virday}`;
fi

virdate=`echo ${viryear}-${virmonth}-${virday}` ;
echo $virdate
}awk

####獲取上月同期日期
getLastMonthDay() {
virdate=`echo ${1}`;
viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ;
virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ;
virday=`echo ${virdate}|awk -F "-" '{print $3}'` ;

vir_cur_Endday=`echo $(getMonthMaxDay ${virdate} )` ;
vir_cur_day=` expr $virday + 0 `;

##月份+1
virmonth=` expr $virmonth - 1 `;
#----若是月份相加小於等於0則將月份置成12月
if [ $virmonth -le 0 ]
then
virmonth=12;
viryear=` expr ${viryear} - 1 `;
fi

##月份小於10 須要前置補足一個0用兩位表示月份
if [ $virmonth -lt 10 ]
then
virmonth=`echo 0${virmonth}`;
else
virmonth=`echo ${virmonth}`;
fi

vir_LastM_Endday=`echo $(getMonthMaxDay ${viryear}-${virmonth}-01 )` ;

virday=` expr $virday + 0 `;

###若是月份-1的後,月末日期小於傳入的參數的日期則將同期設置成月末日期
if [ ${virday} -ge ${vir_LastM_Endday} ]
then
virday=`echo ${vir_LastM_Endday}`;
fi

###若是傳入數據日期爲當月月末日期,則下月同期就爲月末日期
if [ ${vir_cur_day} -eq ${vir_cur_Endday} ]
then
virday=`echo ${vir_LastM_Endday}`;
fi

if [ $virday -lt 10 ]
then
virday=`echo 0${virday}`;
fi

virdate=`echo ${viryear}-${virmonth}-${virday}` ;
echo $virdate
}date

####獲取上月同期數據日期--與前臺展示算法一致(若本月日期是月末則上月同期始終爲月末日期,不是月末則本月的日期位比上月月末日期大於等於則取上月倒數次日)
getLMDataDay() {
virdate=`echo ${1}`;
virdate_End=`echo $(getEndMonDay $virdate )` ;
LMdate=`echo $(getLastMonthDay $virdate )` ;
LMdate_End=`echo $(getEndMonDay $LMdate )` ;

virdate_D=`echo $virdate|cut -c 9-10`
virdate_End_D=`echo $virdate_End|cut -c 9-10`
LMdate_D=`echo $LMdate|cut -c 9-10`
LMdate_End_D=`echo $LMdate_End|cut -c 9-10`

if [ ! ${virdate_D} -eq ${virdate_End_D} ]
then
if [ ${virdate_D} -ge ${LMdate_End_D} ]
then
LMdate=`echo $(getLastDate $LMdate )` ;
fi
fi
echo $LMdate
}數據

####獲取去年同期日期(當月爲月底則去年同期永遠爲月底日期)
getLastYearDay() {
virdate=`echo ${1}`;
viryear=`echo ${virdate}|awk -F "-" '{print $1}'` ;
virmonth=`echo ${virdate}|awk -F "-" '{print $2}'` ;
virday=`echo ${virdate}|awk -F "-" '{print $3}'` ;

vir_cur_Endday=`echo $(getMonthMaxDay ${virdate} )` ;
vir_cur_day=` expr $virday + 0 `;

viryear=` expr ${viryear} - 1 `;


vir_LastY_Endday=`echo $(getMonthMaxDay ${viryear}-${virmonth}-01 )` ;

virday=` expr $virday + 0 `;

###若是月份-1的後,月末日期小於傳入的參數的日期則將同期設置成月末日期
if [ ${vir_cur_day} -eq ${vir_cur_Endday} ]
then
virday=`echo ${vir_LastY_Endday}`;
fi

if [ $virday -lt 10 ]
then
virday=`echo 0${virday}`;
fi

virdate=`echo ${viryear}-${virmonth}-${virday}` ;
echo $virdate
}vi

本站公眾號
   歡迎關注本站公眾號,獲取更多信息