获取今天时期:date +%Y%m%d
或 date +%F
或 $(date +%y%m%d)
获取昨天时期:date -d yesterday +%Y%m%d
获取前天日期:date -d -2day +%Y%m%d
n天前的 date -d "n days ago" +%y%m%d
明天:date -d tomorrow +%y%m%d
注意以上中间有空格
1个小时之前的:date -d -1hour +'%Y-%m-%d %H:%M:%S'
要注意不是单引号是符号 date -d 是固定格式 写参数要用 "$countday",双引号加$的格式获取参数值,不写参数默认是取系统的当前时间,后面用+号和' '单引号放要转换的数据格式 countday=
date -d -1hour +’%Y-%m-%d %H:%M:%S’calc_day=
date -d “
c
o
u
n
t
d
a
y
"
+
′
h
o
u
r
i
d
=
‘
d
a
t
e
−
d
"
countday" +'%Y%m%d'` hour_id=`date -d "
countday"+′hourid=‘date−d"countday” +"%H"`
calc_day_previous=date -d "-2 day $calc_day" +%Y%m%d
calc_day_previous=date +%Y%m%d -d "-2 day $calc_day"
注意:-d后面要紧跟你要处理的日期,-2是往前退2天,+%Y%m%d日期格式转换可以放到前面也可以放到后面,但是不能插到-d和日期之前,会导致报错
用参数
c
a
l
c
m
o
n
t
h
d
a
y
决
定
往
前
或
者
往
后
排
几
天
,
主
要
用
在
处
理
每
周
一
到
周
日
、
每
月
1
号
到
月
末
这
种
日
期
c
a
l
c
s
t
a
r
t
d
a
y
=
‘
d
a
t
e
−
d
"
−
1
m
o
n
t
h
−
calc_monthday决定往前或者往后排几天,主要用在处理每周一到周日、每月1号到月末这种日期 calc_start_day=`date -d "-1 month -
calcmonthday决定往前或者往后排几天,主要用在处理每周一到周日、每月1号到月末这种日期calcstartday=‘date−d"−1month−(($calc_monthday-1)) day
c
a
l
c
d
a
y
"
+
c
a
l
c
s
t
a
r
t
D
a
y
=
‘
d
a
t
e
−
d
"
calc_day" +%Y%m%d` calc_start_Day=`date -d "
calcday"+calcstartDay=‘date−d"((6+$calc_weekday)) day ago $calc_day" +%Y%m%d`
时间域
% 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等)
注意:只有超级用户才有权限使用date命令设置时间,一般用户只能使用date命令显示时间
周报日期处理(默认每周一计算上周一到周日数据):
#currentWeek取值0-6,当$calc_day为周日时,currentWeek=0
currentWeek=`date -d "$calc_day" +%w`
#计算周报的时间未配置则默认为周一
if [ ! -n "$calc_weekday" ]; then
calc_weekday=1
fi
#为了保证数据完整性,周报选择在配置每周几进行计算
if [ $currentWeek -eq $calc_weekday ]
then
calc_start_Day=`date -d "$((6+$calc_weekday)) day ago $calc_day" +%Y%m%d`
calc_end_Day=`date -d "$calc_weekday day ago $calc_day" +%Y%m%d`
fi
月报日期处理(默认每月1号到月底):
#为了保证数据完整性,月报选择在每个月2号进行计算
currentDay=`date -d $calc_day +%e`
#计算月报的时间未配置则默认2号
if [ ! -n "$calc_monthday" ]; then
calc_monthday=2
fi
if [ $currentDay -eq $calc_monthday ]
then
# the first day of this month
calc_start_day=`date +%Y%m%d -d "-1 month -$(($calc_monthday-1)) day $calc_day"`
calc_end_day=`date +%Y%m%d -d "-$calc_monthday day $calc_day"`
fi
在实际工作中总是会遇到各种日期格式的,有时候需要对日期格式做各种处理
1、给的日期数据是 yyyyMMddHHmmss 例如:20200528091253
这个时候需要做数据的大小比较的时候就比较烦,可以通过如下格式转换成date格式的在进行比较,当位数不够的也可以直接进行拼接(注意:有些日期格式是年月日 时:分:秒.0)
concat(substr(starttime,0,4),'-',substr(starttime,5,2),'-',substr(starttime,7,2),' ',substr(starttime,9,2),':',substr(starttime,11,2),':',substr(starttime,13,2)) validtime,
concat(substr($calc_day,0,4),'-',substr($calc_day,5,2),'-',substr($calc_day,7,2),' 00:00:00.0') createtime,
有时候给定一个时段,需要这个时段的开始时间,结束时间,可以做如下处理
#获取前一小时的时间(自动获取系统时间的时候)
countday=`date -d -1hour +'%Y-%m-%d %H:%M:%S'`
calc_day=`date -d "$countday" +'%Y%m%d'`
hour_id=`date -d "$countday" +"%H"`
calc_onehour_ago_begin=`date +"%Y-%m-%d %H:00:00" -d " -1 hour"`
calc_onehour_ago_end=`date +"%Y-%m-%d %H:00:00"`
#手动输入时间的时候
if [ -n "$1" ];then
calc_day=$1
fi
if [ -n "$2" ];then
hour_id=$2
#加1的目的是算出结束时间
current_hour=`expr $2 + 1`
if [ $current_hour -lt 10 ];then
current_hour="0$current_hour"
calc_onehour_ago_end=`date -d " $calc_day" +"%Y-%m-%d $current_hour:00:00" `
elif [ $current_hour = 24 ];then
current_hour="00"
calc_onehour_ago_end=`date -d "+1day $calc_day" +"%Y-%m-%d $current_hour:00:00"`
else
calc_onehour_ago_end=`date -d "$calc_day" +"%Y-%m-%d $current_hour:00:00" `
fi
calc_onehour_ago_begin=`date -d "$calc_day" +"%Y-%m-%d $hour_id:00:00" `
fi