#!/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}
}

####获取前一天日期
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
}

####获取下月同期日期
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
}

####获取上月同期日期
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
}

####获取上月同期数据日期--与前台展现算法一致(若本月日期是月末则上月同期始终为月末日期,不是月末则本月的日期位比上月月末日期大于等于则取上月倒数第二天)
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
}

转载于:https://www.cnblogs.com/xuehen/p/5275156.html

get_date.sh相关推荐

  1. 如何将exe文件在linux下执行,如何在Linux系统下查找可执行文件

    可执行文件是指可移植可执行的文件,用于程序的执行,那么Linux下要如何查找可执行文件呢?下面小编就给大家介绍下Linux中查找可执行文件的方法,一起来了解下吧. linux下查找可执行文件 ls - ...

  2. printf的应用脚本

     我们可以使用printf写个脚本,利用命令awk,要求输入一个日期,可以判断上个月的今天是什么时候.脚本如下: #!/bin/awk BEGIN {     print "input a ...

  3. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  4. linux启动,重启,停止 jar,.sh脚本

    linux启动,重启,停止 jar,.sh脚本 #配置jar名称 APP_NAME=receiver.jar#使用说明,用来提示输入参数 usage() { echo "Usage: sh ...

  5. sh计算机,计算机教程:shellII(sh).pdf

    下载 第10章 shell II (sh) Bourne shell (s h ).C shell (c s h )以及Korn shell (k s h )是命令解释程序及高级编程语言. 作为命令解 ...

  6. ecos 编译时无法找到 tclConfig.sh 和 tkConfig.sh

    这是因为 tcl-devel tk-devel 一般系统中默认是不安装的,至少cent-os 5.5 和fedora 11是这样的,安装这两个包即可. # yum install tcl-devel ...

  7. shell与 .sh文件与 .bash文件

    一.shell和bash shell是LInux系统下的解释器,类似于windows下的cmd.shell对用户输入到窗口中的命令行进行解释,输入到内核. bash同样是Linux系统下的解释器,是b ...

  8. linux sh for ls,Linux shell for while 循环

    1.数字段形式 for i in {1..10} do echo $i done 2.详细列出(字符且项数不多) for File in 1 2 3 4 5 do echo $File done 3. ...

  9. linux重启sh脚本,Linux 之shell脚本系列之服务启动/关闭/重启/状态

    一 问题 自己开发的程序,如何用shell 脚本实现 启动,关闭,重启,查看状态? 二 方案 myshell.sh #!/bin/sh SERVICE="fm_tuoguan_shell&q ...

最新文章

  1. 验算双中心重叠积分程序
  2. Oracle的FIXED_DATE参数
  3. mysql 分段执行_面试官问你MySQL的优化,看这篇文章就够了
  4. [数分提高]2014-2015-2第8教学周第1次课 (2015-04-21)
  5. Linux 底层原理 —— epoll 与多路复用
  6. go kegg_对miRNA进行go和kegg等功能数据库数据库注释
  7. nginx配置openssl证书
  8. 蚂蚁金服的生死时速!
  9. 高仿TIMI页面易语言源码-已对接易游网络验证
  10. [笔记] 数据结构二刷【第一篇:线性表·栈·队列·递归】
  11. ios 检查设备距离与电池状态及判断是否是Retina显示屏
  12. 【Pygame实战】这游戏有毒,刷爆朋友圈:小编已与病毒版贪吃蛇大战了三百回合,最高分339?
  13. 今天是2022年5月21日
  14. Spring容器中的Bean是否会被GC呢?
  15. Unity2D游戏使游戏角色跳跃的脚本(包括长按跳跃加成)
  16. Problem E: 穷游中国在统题 优先队列 + 模拟
  17. 【golang】Go语言学习-time包
  18. nodejs 解析Android apk获取app icon
  19. 不可不明白 使用杀毒软件的十大误区
  20. 农产品溯源和农业数字化转型如何同步进行?

热门文章

  1. 如何利用客户端在CU发博客
  2. Nginx + Tomcat 负载均衡集群配置
  3. redhat 6.0 Enterprise企业版如何使用yum安装软件
  4. mysql设置远程访问
  5. mongodb 安装_1、MongoDB 安装
  6. python3查找文件中指定字符串_Python3在指定路径下递归定位文件中出现的字符串...
  7. 如何保证接口的幂等性?
  8. 简述Linux目录结构和系统结构
  9. java5引入包装类型的意义_Java中的基本类型和包装类
  10. java布局工具,Java Swing:库,工具,布局管理器