Linux中date 以及date -d命令的详解

1. 显示时间

date命令可以按照指定格式显示日期,只输入date则以默认格式显示当前时间。如下:

[root@server1 files]# date
Wed Oct 28 17:20:00 CST 2020

2. 指定格式显示时间

  • 若要指定格式显示日期,可以使用“+”开头的字符串指定其格式,详细格式如下:
指令作用
%n下一行
%t跳格
%H小时(00-23)
%I小时(01-12)
%k小时(0-23)
%l小时(1-12)
%M分钟(00-59)
%p显示本地 AM 或 PM
%r直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S秒(00-60)
%T直接显示时间 (24 小时制)
%X相当于 %H:%M:%S
%Z显示时区
%a星期几 (Sun-Sat)
%A星期几 (Sunday-Saturday)
%b月份 (Jan-Dec)
%B月份 (January-December)
%c直接显示日期与时间
%d日 (01-31)
%D直接显示日期 (mm/dd/yy)
%h同 %b
%j一年中的第几天 (001-366)
%m月份 (01-12)
%U一年中的第几周 (00-53)
%w一周中的第几天 (0-6)
%W一年中的第几周 (00-53)
%x直接显示日期 (mm/dd/yy)
%y年份的最后两位数字 (00.99)
%Y完整年份 (0000-9999)
  • 上述格式只需要掌握几个常用的即可。
  • 例如%Y表示年,%m表示月,%d表示日,%H表示小时,%M表示分钟,%S表示秒,%s表示从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数,相当于time函数,%w表示一周中的第几天。实例见下:

date " now i: %Y-%m-%d %H:%M:%S"

 [root@server1 files]# date "+now is %Y-%m-%d %H:%M:%S"
now is 2020-10-28 17:30:02
[root@server1 files]# date  "+现在时间是: %Y-%m-%d %H:%M:%S"
现在时间是: 2020-10-28 17:31:10

3. 显示经过运算后的时间

  • 如果要显示的时间不是当前时间,而是经过运算的时间,则可以用-d选项。例如显示三年前的时间:
  • 举例
[root@server1 files]# date "+%Y-%m-%d %H:%M:%S" 
2020-10-28 17:37:45
[root@server1 files]# date "+%Y-%m-%d %H:%M:%S" -d "-3 year"
2017-10-28 17:38:05
[root@server1 files]# date "+%Y-%m-%d %H:%M:%S" -d "-3 day"
2020-10-25 17:38:15
[root@server1 files]# date "+%Y-%m-%d %H:%M:%S" -d "-28 day"
2020-09-30 17:38:23
[root@server1 files]# date "+%Y-%m-%d %H:%M:%S" -d "-2 month"
2020-08-28 17:38:41
[root@server1 files]# date -d "-2 year -10 day" "+%Y-%m-%d"
2018-10-18
[root@server1 files]# date -d "-2 year -1 month -10 day" "+%Y-%m-%d"
2018-09-18

date -d 的使用

  • date 命令的另一个扩展是 -d 选项,使用这个功能强大的选项,通过将日期作为引号括起来的参数提供,您可以快速地查明一个特定的日期。-d 选项还可以告诉您,相对于当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为 -d 选项的参数,就可以完成这项任务。

具体说明如下:

  • 除了上面经过运算显示时间之外,还可以用date -d 直接指定

date -d '3 days ago'//显示2天前的时间,
2019年 02月 10日 星期日 08:53:28 CST
date -d "3 days ago" "+%Y%m%d"//显示2天前的时间,20190210

date -d '60 second ago' //显示60秒前的时间

date -d '3 months 1 day' //显示3月1天后的时间

date -d '25 Dec' +%j //显示12月25日在当年的哪一天

[root@server1 files]# date -d "25 Dec" "+%j"
360
[root@server1 files]# date -d "25 Jun" "+%j"
177

date -d '2019-02-12 09:00:00 +0000' +%s //自UTC时间 1970-01-01 00:00:00 迄今的秒数

[root@server1 files]# date -d  '2020-02-11' "+%s"
1581350400
[root@server1 files]# date -d  '2020-02-11 02:10:10' "+%s"
1581358210
[root@server1 files]# date -d  '2020-02-11 02:10:10 +1111' "+%s"
1581346750

4.设置时间

  • 用 -s选项可以设置系统时间:(只能root用户设置)
    date -s 20201028 设置20201028,把具体时间会设置成00:00:00
    date -s 01:01:01 设置具体时间 ,不改变日期
    date -s "10:10:10 2020-10-28" 会设置全部时间
[root@server1 files]# date -s "2020-08-09 10:10:10"
Sun Aug  9 10:10:10 CST 2020
[root@server1 files]# date -s "20200809 10:10:10"
Sun Aug  9 10:10:10 CST 2020
[root@server1 files]# date -s "2020/08/09 10:10:10"
Sun Aug  9 10:10:10 CST 2020

5.小案例(循环日期)

  • 编写脚本,循环打印日期(可指定起始日期或默认日期),并返回天数。
##判断变量是否为空,若为空则赋给它值
#/bin/bash
if [ "$1" == "" ]
then
    start_date=`date -d "today last month" "+%Y%m01"`
    end_date=`date -d "today" "+%Y%m%d"`
elif [ "$2" == "" ]
then
    start_date=`date -d "$1" "+%Y%m%d"`
    end_date=`date -d "today" "+%Y%m%d"`
else
    start_date=`date -d "$1" "+%Y%m%d"`
    end_date=`date -d "$2" "+%Y%m%d"`    
fi
##判断变量准确性,起始日期是否小于截至日期
if [ ${start_date} -gt ${end_date} ]
then
	echo "Error\nPLease input right date!!"
	exit
fi
##通过循环,返回日期值
for i in `seq 0 10000`
do 
	t_date=`date -d "${start_date} +$(($i+1)) day" "+%Y%m%d"`
	echo $t_date
        cnt_day=$i
     ##如果循环到当天,就退出
	if [ ${t_date} == ${end_date} ]
	then
		break
	fi
done
echo "The days between two dates is ${cnt_day}"
  • 21
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值