主要记录shell下关于时间和日期的函数总结。
shell下获取系统时间的方法直接调用系统变量
usage : date [OPTION][+FORMAT]
获取今天日期 :date "+%Y%m%s"
date "+%F"
date -d "-1 day" "+%F"
选项
-d 显示时间有字符串描述时间域
%H 小时(00..23) %I 小时(00..12) %k 小时(0..23) %M 分钟(00..59) %S 秒(00..60) %Y 年(四位数) %y 年(两位数) %m 月(01..12) %d 天(00..31)%F 日期格式%Y-%m-%d
%D 日期格式%m/%d/%y %r 时间格式hh:mm:ss AM或PM(12小时制)%s 从1970年1月1号零点到目前经历的秒数
还有其他可借助date --help来查看
注意:只有root用户才有权限使用date命令设置时间,一般用户只能使用date命令显示时间
时间函数
############################################## Filename:dateutils.sh# Revision:1.1# Date:2018/12/17# Author: chenchunping# Description: 日期函数# Notes:# 1. get_date 返回当前日期,格式YYYYMMDD# 2. check_date 检查日期,参数格式YYYYMMDD# 3. get_before_date 返回昨天时间# 4. get_next_date 返回明天时间# 5. get_beforemonth_date 返回N月以前的时间# 6. get_nextmonth_date 返回N月以后的时间# 7. get_beforeyear_date 返回N年以前的时间# 8. get_nextyear_date 返回N年以后的时间# 9. get_beforeday_date 返回N天以前的时间# 9. get_nextday_date 返回N天以后的时间# 10. get_diffdays 返回两个日期的天数# 11. check_leap 判断是否是闰年# 12. get_month_begin_date 返回1号日期# 13. get_month_days 返回月份的天数# 14. get_month_end_date 返回月末日期# 15. get_lastmonth_end_date 返回上一个月末日期##############################################获取当前日期,返回格式YYYYMMDDfunction get_date(){ currdate=`date "+%Y%m%d"` echo $currdate}#检查日期格式(YYYYMMDD)function check_date(){ [ $# -ne 1 ] &&echo 1 &&exit 1 lenstr=`expr length "$1"` [ $lenstr -ne 8 ] &&echo 1 &&exit 1 tmpstr=`echo "$1" | grep "^[^0][0-9]*$"` year=`expr substr $1 1 4` month=`expr substr $1 5 2` day=`expr substr $1 7 2` [ $month -lt 1 -o $month -gt 12 ] &&echo 1 &&exit 1 days=`get_month_days $1` [ $day -lt 1 -o $day -gt $days ] &&echo 1 &&exit 1 echo 0}#计算指定日期前一天function get_before_date(){ if [ $# -eq 1 ];then sec=`date -d $1 "+%s"` sec_before_day=$(( sec - 24 * 60 * 60)) days_before=`date -d @$sec_before_day +%Y%m%d` echo $days_before else days_before=`date -d -1days "+%Y%m%d"` echo $days_before fi}#计算指定日期第二天function get_next_date(){ if [ $# -eq 1 ];then sec=`date -d $1 "+%s"` sec_next_day=$(( sec + 24 * 60 * 60)) days_next=`date -d @$sec_next_day +%Y%m%d` echo $days_next else days_next=`date -d +1days "+%Y%m%d"` echo $days_next fi }#参数为2个:计算指定日期n个月以前的日期,参数为1个:当前日期n个月以前的日期function get_beforemonth_date(){ if [ $# -eq 2 ];then beforemonth=`date -d "$1 -$2 month" "+%Y%m%d"` echo $beforemonth else beforemonth=`date -d "-$1 month" "+%Y%m%d"` echo $beforemonth fi }#参数为2个:计算指定日期n个月以后的日期,参数为1个:计算当前日期n个月以后的日期function get_nextmonth_date(){ if [ $# -eq 2 ];then nextmonth=`date -d "$1 -$2 month" "+%Y%m%d"` echo $nextmonth else nextmonth=`date -d "+$1 month" "+%Y%m%d"` echo $nextmonth fi}#参数为2个:计算指定日期n个年以前的日期,参数为1个:计算当前日期n个年以前的日期function get_beforeyear_date(){ if [ $# -eq 2 ];then beforemonth=`date -d "$1 -$2 year" "+%Y%m%d"` echo $beforemonth else beforemonth=`date -d "-$1 year" "+%Y%m%d"` echo $beforemonth fi }#参数为2个:计算指定日期n个年以后的日期,参数为1个:计算当前日期n个年以后的日期function get_nextyear_date(){ if [ $# -eq 2 ];then nextmonth=`date -d "$1 -$2 year" "+%Y%m%d"` echo $nextmonth else nextmonth=`date -d "+$1 year" "+%Y%m%d"` echo $nextmonth fi}
#参数为2个:计算指定日期n天以前的日期,参数为1个:计算当前日期n天以前的日期function get_beforeday_date(){ if [ $# -eq 2 ];then days_before=`date -d "$1 -$2 day" "+%Y%m%d"` echo $days_before else days_before=`date -d "-$1 day" "+%Y%m%d"` echo $days_before fi}#参数为2个:计算指定日期n天以后的日期,参数为1个:计算当前日期n天以后的日期function get_nextday_date(){ if [ $# -eq 2 ];then days_next=`date -d "$1 +$2 day" "+%Y%m%d"` echo $days_next else days_next=`date -d "+$1 day" "+%Y%m%d"` echo $days_next fi }#计算两个日期的间隔天数function get_diffdays(){ startdate_sec=`date -d $1 "+%s"` enddate_sec=`date -d $2 "+%s"` diff_sec=$((enddate_sec - startdate_sec)) diff_days=$((diff_sec / 86400)) echo $diff_days}#判断是否闰年(时间格式YYYYMMDD)function check_leap(){ year=`expr substr $1 1 4` r1=$(( year % 4 )) r2=$(( year % 100 )) r3=$(( year % 400 )) if [ $r1 -eq 0 -a $r2 -ne 0 -a $r3 -eq 0 ];then fren="true" else fren="false" fi echo $fren}
#获取指定日期的当月1号function get_month_begin_date(){ begin_date=`date -d "$1" "+%Y%m01"` echo $begin_date}#获取指定日期当月的天数function get_month_days(){ currdate=`date -d "$1" "+%Y%m%d"` year=`expr substr $currdate 1 4` month=`expr substr $currdate 5 2` case $month in 01|03|05|07|08|10|12) days=31;; 04|06|09|11) days=30;; 02) leap_year=`check_leap $currdate` if [ "$leap_year" = "true" ];then days=29 else days=28 fi ;; *) days=0 ;; esac echo $days}#指定日期所在月份最后日期function get_month_end_date(){ date=`date -d "$1" "+%Y%m%d"` year=`expr substr $date 1 4` month=`expr substr $date 5 2` days=`get_month_days $1` end_date=$(( $(( $(( year * 10000 )) + $(( month * 100 )))) + days )) echo $end_date}#指定日期的上一个月最后日期function get_lastmonth_end_date(){ begin_date=`date -d "$1" "+%Y%m01"` lastmonth_end_date=`date -d "$begin_date -1 day" "+%Y%m%d"` echo $lastmonth_end_date}