shell的日期处理

在开发shell脚本中,对时间处理是难以避免的,所以接下来我们就来谈谈shell中时间处理的基本语法和他自带的函数。

天的处理

获取今天日期:date +%Y%m%ddate +%Fdate +%y%m%d

获取昨天日期:date -d yesterday +%Y%m%d

获取前天日期:date -d -2day +%Y%m%d

依次类推比如获取10天前的日期:date -d -10day +%Y%m%d

或n天前的 date -d "n days ago" +%y%m%d

明天:date -d tomorrow +%y%m%d

获取当月第一天日期:date +"%Y%m01"

获取当月最后一天日期:date -d "$(date -d "1 month" +"%Y%m01") -1 day" +"%Y%m%d"

获取去年当天日期:date -d -1year +%Y%m%d

获取今年的第一天:date "+%Y0101"

获取今年的最后一天:date "+%Y1231"

date +%Y%m%d #获取今天日期
20190324

date +%F #获取今天日期
2019-03-24

date +%y%m%d #获取今天日期
190324

date -d yesterday +%Y%m%d #获取昨天日期
20190323

date -d -2day +%Y%m%d #获取前天日期
20190322

date -d 2day +%Y%m%d #获取两天后日期
20190326

date +"%Y%m01" #获取当月第一天日期
20190301

date -d "$(date -d "1 month" +"%Y%m01") -1 day" +"%Y%m%d" #获取当月最后一天日期
20190331

date -d -1year +%Y%m%d #获取去年当天日期
20180324

date "+%Y0101" #获取今年的第一天
20190101

date "+%Y1231"
20191231

如果是多日期变量处理,在参数-d后把变量加上就行
例:求日期变量today的前一天

today=20190101

date -d "${today} -1 day" +%Y%m%d
20181231

月的处理

获取本月日期:date +%Y%m

获取上月日期:date -d -1month +%Y%m

获取下月日期:date -d "1 month" +%Y%m

获取去年当月日期:date -d -1year +%Y%m

date +%Y%m #获取本月日期
201903

date +%m #获取本月月份
03

date -d -1month +%Y%m #获取上月日期,注意:如果参数后没有引号1和month中不能有空格
201902

date -d "1 month" +%Y%m #获取上月日期,注意:如果参数后有引号1和month中可以有空格
201904

date -d -1year +%Y%m
201803

年的处理

获取当年年份:date +%Y 或者 date +%y

获取明年年份:date -d 1year +%Y

获取去年年份:date -d -1year +%Y

date +%Y
2019

date +%y
19

date -d 1year +%Y
2020

date -d -1year +%Y
2018

周的处理

获取当天是本年的第几周:date +%W(00…53,星期一为第一天)

获取当天是一周的第几天:date +%w(0代表星期天)

获取上周的今天:date -d "-1 weeks" +%Y%m%d

下面脚本是获取某天的周一和周日

vi week.sh

#!/bin/bash

#取得入参的时间
indate=$1
echo indate=$indate

#如果没有输入参数,默认输入日期为今天
if [ ! $indate ]; then
  echo 未输入指定日期,默认指定日期为今天
  indate=$(date +%Y%m%d)
  echo indate=$indate
fi
 
#取得统计日期(一般为入参的上周的今天)
upweekday=`date -d "$indate -1 weeks" +%Y%m%d`
echo upweekday=$upweekday

#得到是当周的周几 (0为星期日,1为星期一,...6为星期六)
whichday=$(date -d $indate +%w)
echo whichday=$whichday

#用(statday-whichday)+1,就是某周的第一天,这里是星期一
if [ $whichday == 0 ]; then
  startday=`date -d "$indate -6 days" +%Y%m%d`
  echo indate=$indate
else
  startday=`date -d "$indate -$[${whichday} - 1] days" +%Y%m%d`
  echo startday=$startday
fi
 
#某周的最后一天,星期日为最后一天
endday=`date -d "$startday +6 days" +%Y%m%d`
echo endday=$endday
chmod u+x week.sh
sh week.sh 20190103

结果为:
indate=20190103
upweekday=20181227
whichday=4
startday=20181231
endday=20190106

时间格式

% H 小时(00…23)
% I 小时(01…12)
% k 小时(0…23)
% l 小时(1…12)
% M 分(00…59)
% p 显示出AM或PM
% r 时间(hh:mm:ss AM或PM),12小时
% s 从1970年1月1日00:00:00到目前经历的秒数
% S 秒(00…59)
% T 时间(24小时制)(hh:mm:ss)
% X 显示时间的格式(%H:%M:%S)
% Z 时区 日期域
% a 星期几的简称( Sun…Sat)
% A 星期几的全称( Sunday…Saturday)
% b 月的简称(Jan…Dec)
% B 月的全称(January…December)
% c 日期和时间( Mon Nov 8 14:12:46 CST 1999)
% d 一个月的第几天(01…31)
% D 日期(mm/dd/yy)
% h 和%b选项相同
% j 一年的第几天(001…366)
% m 月(01…12)
% w 一个星期的第几天(0代表星期天)
% W 一年的第几个星期(00…53,星期一为第一天)
% x 显示日期的格式(mm/dd/yy)
% y 年的最后两个数字( 1999则是99)
% Y 年(例如:1970,1996等)

猜你喜欢

转载自blog.csdn.net/lz6363/article/details/88776172