Linux下date命令的常见⽤法
在写 shell 脚本的时候会经常需要⽐较时间,根据⽐较的结果执⾏不同的逻辑。date是Linux中⽇期和时间相关的命令,它主要是把时间以指定的格式展⽰出来,它也是最常⽤的命令之⼀
命令和语法
date [OPTION]... [+FORMAT]
date 的输出格式⽐较多,下⾯列出⼀些常⽤的输出格式
%m : 当前是⼀年中第⼏个⽉,例如:七⽉显⽰ 07
%d : 当前是⼀个⽉中第⼏天,例如:⼀个⽉中第⼀天显⽰ 01
%j :当前是⼀年中第⼏天(001到366)
%V : 当前是⼀年中第⼏个星期,每周第⼀天是周⼀
%U : 当前是⼀年中第⼏个星期,每周第⼀天是周⽇
%w :当前是⼀个星期中第⼏天(1-6 表⽰周⼀到周六,0 表⽰周⽇)
%z :当前所在时区,⽐如北京是在 +0800 时区
%s : UTC时间的秒数,从1970-01-01 00:00:00到现在经过的秒数
%Y :当前是哪⼀年
%M : 当前是⼀个⼩时中第⼏分钟
%S :当前是⼀分钟中第⼏秒
当前所在时区
[root@ecs-centos-7 tt]# date +%z
+0800
UTC时间和⽇期互相转换
[root@ecs-centos-7 tt]# date
Mon Jul 27 20:32:46 CST 2020
[root@ecs-centos-7 tt]# date +%s
1595853166
[root@ecs-centos-7 tt]# date -d '@1595853166' '+%F %T'
2020-07-27 20:32:46
[root@ecs-centos-7 tt]# date -d "2020-07-27 20:32:46" +%s
1595853166
上⾯的例⼦中,把当前时间转换成 UTC 的时间,也可以把指定的时间字符串转换成UTC秒数,还可以把指定的UTC秒数转换成对应的⽇期,由此可见UTC时间和⽇期之间可以互相转换的
通过时间戳转换⽹站把UTC的秒数:1595853166 转换成具体的⽇期,转换结果如下图:
例⼦中,当前时间是:2020-07-27 20:32:46 转化成 UTC 时间的秒数是:1595853166 ,然后再通过时间戳转换⽹站来验证,结果表明两者的答案是⼀致的
修改系统时间
只有root⽤户才有权限修改系统时间,所以下⾯的命令需要先切换到root⽤户执⾏,否则会提⽰没有执⾏权限
修改全部的时间
[root@ecs-centos-7 tt]# date -s "20200727 20:42:30"
Mon Jul 27 20:42:30 CST 2020
[root@ecs-centos-7 tt]# date -s "2020-07-27 20:42:30"
Mon Jul 27 20:42:30 CST 2020
只修改时间,不修改年⽉⽇
[root@ecs-centos-7 tt]# date
Mon Jul 27 20:43:23 CST 2020
[root@ecs-centos-7 tt]# date -s "20:43:00"
Mon Jul 27 20:43:00 CST 2020
[root@ecs-centos-7 tt]# date
Mon Jul 27 20:43:01 CST 2020
只修改年⽉⽇
[root@ecs-centos-7 tt]# date
Mon Jul 27 20:44:51 CST 2020
[root@ecs-centos-7 tt]# date -s "2020-07-28"
Tue Jul 28 00:00:00 CST 2020
[root@ecs-centos-7 tt]# date
Tue Jul 28 00:00:00 CST 2020
[root@ecs-centos-7 tt]# date -s "20200727"
Mon Jul 27 00:00:00 CST 2020
[root@ecs-centos-7 tt]# date
Mon Jul 27 00:00:02 CST 2020
上⾯的例⼦展⽰了两种修改年⽉⽇的⽅式,需要注意的是:只修改年⽉⽇之后,时间默认变成当天的00:00:00了
时间加减
当前时间时 2020-07-27,下⾯的例⼦都是以此为基础时间的
增减分钟、⼩时
[root@ecs-centos-7 tt]# date
Mon Jul 27 02:26:00 CST 2020
[root@ecs-centos-7 tt]# date -d '+10 min' '+%F %T'
2020-07-27 02:36:02
[root@ecs-centos-7 tt]# date -d '-10 min' '+%F %T'
2020-07-27 02:16:05
Mon Jul 27 02:27:21 CST 2020
[root@ecs-centos-7 tt]#  date -d '+2 hour' '+%F %T'
2020-07-27 04:27:22
[root@ecs-centos-7 tt]#  date -d '-2 hour' '+%F %T'
2020-07-27 00:27:26
增减天数
[root@ecs-centos-7 tt]# date -d '+1 day' +%F
2020-07-28
[root@ecs-centos-7 tt]# date -d '-2 day' +%F
2020-07-25
增减星期
[root@ecs-centos-7 tt]# date -d '+1 week' +%F
2020-08-03
[root@ecs-centos-7 tt]# date -d '-2 week' +%F
2020-07-13
增减⽉份
[root@ecs-centos-7 tt]# date -d '+1 month' +%F
2020-08-27
[root@ecs-centos-7 tt]# date -d '-2 month' +%F
2020-05-27
增减年份
[root@ecs-centos-7 tt]# date -d '+1 year' +%F
2021-07-27
[root@ecs-centos-7 tt]# date -d '-1 year' +%F
2019-07-27
处理⽂件中的字符串时间
-f 选项是⽤来处理⽂件中时间字符串的,现有 a.txt ,⽂件内容如下:
[root@ecs-centos-7 tt]#
2020-07-27 20:03:00
2020-07-26 20:04:00
2020-07-25 20:05:00
把⽂件中每⼀⾏的时间转化成UTC时间,输出如下:
[root@ecs-centos-7 tt]# date - +%s
1595851380
1595765040
1595678700
脚本中计算时间差
通常在shell脚本中需要计算出两个时间变量的差值, 我们可以通过把时间字符串转化成 UTC 的秒数来计算时间差,下⾯是test.sh的脚本内容#!/bin/bash
starttime=`date +%s`
echo ""
sleep 5s
endtime=`date +%s`
diff=$((endtime - starttime))
echo "starttime:${starttime}, endtime:${endtime}, diff:"${diff}
上⾯是⼀段简单的测试脚本,脚本开始记录当前时间,然后⽤睡眠5秒来表⽰执⾏逻辑花费了5秒,逻辑执⾏完后,再次记录下结束时间,打印出开始、结束以及时间差
unix时间戳转换日期格式执⾏./test.sh,输出如下:
[root@ecs-centos-7 ~]# ./test.sh
starttime:1595790297, endtime:1595790302, diff:5
上⾯的输出中,结束时间和开始时间差是5秒,表⽰脚本执⾏花费的时间是5秒,跟测试中结果⼀致

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。