📄 common.ksh
字号:
#!/bin/ksh# 取两个日期之间的间隔天数# 用法: interval 日期1[YYYYMMDD] 日期2[YYYYMMDD] function interval {if [[ $1 > $2 ]] then str1=$2 str2=$1else str1=$1 str2=$2fiyy1=`echo $str1|cut -c 1-4`mm1=`echo $str1|cut -c 5-6`dd1=`echo $str1|cut -c 7-8`yy2=`echo $str2|cut -c 1-4`mm2=`echo $str2|cut -c 5-6`dd2=`echo $str2|cut -c 7-8`count_day=`expr $dd2 - $dd1`while [ $yy2 -ne $yy1 -o $mm2 -ne $mm1 ]do mm2=`expr $mm2 - 1` [ $mm2 -eq 0 ] && mm2=12 && yy2=`expr $yy2 - 1` aaa=`cal $mm2 $yy2` bbb=`echo $aaa|awk '{print $NF}'` count_day=`expr $count_day + $bbb`doneecho $count_day }# 日期合法性检查函数# 用法: valid_date 日期[YYYYMMDD]function valid_date{ ret=0 (($#!=1))&&{ echo "Usage:yyyymmdd";return 1; } year=`expr substr $1 1 4` month=`expr substr $1 5 2` day=`expr substr $1 7 2` cal $month $year 2>/dev/null | grep -q "$day" 2>/dev/null && ret=0 || ret=1 return $ret}#返回月份的天数# 用法: month_daysfunction month_days{ Y=`expr substr $1 1 4` M=`expr substr $1 5 2` r1=`expr $Y \% 4` r2=`expr $Y \% 100` r3=`expr $Y \% 400` case $M in 01|03|05|07|08|10|12) days=31 ;; 04|06|09|11) days=30 ;; esac if [ $M -eq 02 ] then if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ] then days=29 else days=28 fi fi echo $days}# 返回昨天日期# yesterday 日期[YYYYMMDD]function yesterday{ Y=`expr substr $1 1 4` M=`expr substr $1 5 2` D=`expr substr $1 7 2` YY=`expr $Y - 1` MM=`expr $M - 1` DD=`expr $D - 1` MM=`printf "%02d" $MM` DD=`printf "%02d" $DD` dd=$Y$MM dad=`month_days $dd` be_date=$Y$M$DD if [ $D -eq 01 ] then if [ $M -ne 01 ] then be_date=$Y$MM$dad fi if [ $M -eq 01 ] then be_date=$YY"1231" fi fi echo $be_date}# 取明天的日期# nextday 日期[YYYYMMDD]function nextday{ Y=`expr substr $1 1 4` M=`expr substr $1 5 2` D=`expr substr $1 7 2` YY=`expr $Y + 1` MM=`expr $M + 1` DD=`expr $D + 1` MM=`printf "%02d" $MM` DD=`printf "%02d" $DD` r1=`expr $Y \% 4` r2=`expr $Y \% 100` r3=`expr $Y \% 400` next_date=$Y$M$DD if [ $D -eq 30 ] then case $M in 04|06|09|11) next_date=$Y$MM"01" ;; esac fi if [ $D -eq 31 ] then next_date=$Y$MM"01" case $M in 12) next_date=$YY"0101" ;; esac fi if [ $M -eq 02 ] then if [ r1 -eq 0 -a r2 -ne 0 -o r3 -eq 0 ] then if [ $D -eq 29 ] then next_date=$Y$MM"01" fi else if [ $D -eq 28 ] then next_date=$Y$MM"01" fi fi fi echo $next_date}# 取上一天的日期?# 用法: lastday 日期[YYYYMMDD]function lastday{ if [[ ${#1} = 0 ]] then return 1 fi if [[ ${#1} != 8 ]] then return 1 fi # 设置当前的年、月、日 year=`expr substr "$1" 1 4` month=`expr substr "$1" 5 2` day=`expr substr "$1" 7 2` # 月份加0,使得月份成为“整型” :) month=`expr $month + 0` # 当前日期减一,得到昨天的日子 day=`expr $day - 1` # 如果上面得到的昨天的日子为0的话就得考虑月份了 if [ $day -eq 0 ]; then # 当前月份减一得到上一个月份 month=`expr $month - 1` # 如果上面得到的上一个月份为0的话就得考虑年份了 if [ $month -eq 0 ]; then month=12 day=31 year=`expr $year - 1` # 如果月份非0就需要确定当前月份的天数 else case $month in 1|3|5|7|8|10|12) day=31;; 4|6|9|11) day=30;; 2) if [ `expr $year % 4` -eq 0 ]; then if [ `expr $year % 400` -eq 0 ]; then day=29 elif [ `expr $year % 100` -eq 0 ]; then day=28 else day=29 fi else day=28 fi ;; esac fi fi # 打印出昨天的年、月、日 printf "%04s%02s%02s\n" ${year} ${month} ${day} }#计算某日前若干天的日期#date=YYYYMMDD#Usage: before_date 日期[YYYYMMDD] 天数function before_date{ if [[ $# != 2 ]] then echo "用法 before_date 日期[YYYYMMDD] 天数" return 1 fi str=$1 days=$2 yy=`echo $str|cut -c 1-4` mm=`echo $str|cut -c 5-6` dd=`echo $str|cut -c 7-8` sav_dd=$days (( days = days - dd )) while (( days >= 0 )) do (( mm = mm -1 )) [[ $mm = 0 ]] && mm=12 && (( yy = yy - 1 )) aaa=`cal $mm $yy` bbb=`echo $aaa|awk '{print $NF}'` (( days = days - bbb )) done (( dd = 0 - days )) printf "%04s%02s%02s\n" $yy $mm $dd }#计算某日后若干天日期#date=YYYYMMDD#用法:after_date 日期[YYYYMMDD] 天数function after_date{ if [[ $# != 2 ]] then echo "用法 after_date 日期[YYYYMMDD] 天数" return 1 fi str=$1 days=$2 yy=`echo $str|cut -c 1-4` mm=`echo $str|cut -c 5-6` dd=`echo $str|cut -c 7-8` (( days = days + dd )) while (( days > 0 )) do aaa=`cal $mm $yy` bbb=`echo $aaa|awk '{print $NF}'` sav_dd=$days sav_mm=$mm sav_yy=$yy (( days = days - bbb )) (( mm = mm + 1 )) (( mm > 12 )) && mm=1 && (( yy = yy + 1 )) done printf "%04s%02s%02s\n" $sav_yy $sav_mm $sav_dd }#取上月末日期function get_lastday_of_lastmonth{ if [[ $# = 0 ]] then yy=`date +%Y` mm=`date +%m-1|bc` else yy=`expr substr $1 1 4` mm=`expr substr $1 5 2` (( mm = mm - 1 )) fi (( $mm < 1 )) && mm=12 && (( yy = yy - 1 )) echo cal $mm $yy aaa=`cal $mm $yy` dd=`echo $aaa|awk '{print $NF}'` printf "%04s%02s%02s\n" $yy $mm $dd }# 判断是否月末# 用法: is_monthend [日期]# 日期格式为YYYYMMDDfunction is_monthend{ if [[ $# = 0 ]] then mm=`date +%m` today=`date +"%Y%m%d"` else mm=`expr substr $1 5 2` today=$1 fi after_date $today 1 | read -r tomorrow# echo tomorrow is $tomorrow to_month=`expr substr $tomorrow 5 2` if [[ $mm != $to_month ]] then return 0 else return 1 fi }# 判断是否半年末# 用法: is_halfyear [日期]# 日期格式为YYYYMMDDfunction is_halfyear{ if [[ $# = 0 ]] then today=`date +"%Y%m%d"` else today=$1 fi day=`expr substr $today 5 4` if [[ $day = "0630" ]] then return 0 else return 1 fi}# 判断是否年末# 用法: is_year_end [日期]# 日期格式为YYYYMMDDfunction is_year_end{ if [[ $# = 0 ]] then today=`date +"%Y%m%d"` else today=$1 fi day=`expr substr $today 5 4` if [[ $day = "1231" ]] then return 0 else return 1 fi}# 判断是否季末# 用法: is_quarter _end [日期]# 日期格式为YYYYMMDDfunction is_quarter_end{ if [[ $# = 0 ]] then today=`date +"%Y%m%d"` else today=$1 fi day=`expr substr $today 5 4` if [[ $day = "0331" || $day = "0630" || $day = "0930" || $day = "1231" ]] then return 0 else return 1 fi}# 判断是否是周末# 用法: is_week_end [日期]# 日期格式为YYYYMMDDfunction is_week_end{ if [[ $# = 0 ]] then weekday=`date +'%w'` else today=$1 fi if [[ $weekday = 0 ]] then return 0 else return 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -