date命令是显示或设置系统时间与日期。
很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。
语法
date(选项)(参数)
详解:
命令参数:
参数 |
描述 |
-d |
显示字符串描述的时间 |
-f |
显示DATEFILE文件中的每行时间 |
-r |
显示文件的最后修改时间 |
-R |
以RFC-2822兼容日期格式显示时间 |
-rfc-2822 |
以RFC-2822兼容日期格式显示时间 |
-s |
设置时间为string |
-u |
显示或设定为Coordinated Universal Time时间格式 |
--help |
显示date命令的帮助信息 |
--version |
显示date命令的版本信息 |
Format参数格式
要说写这位程序的 David MacKenzie老兄,真是事无巨细啊,居然整了这么多格式参数,佩服佩服。
参数 |
描述 |
%% |
显示字符% |
%a |
星期几的缩写(Sun..Sat) |
%A |
星期几的完整名称(Sunday...Saturday) |
%b |
月份的缩写(Jan..Dec) |
%B |
月份的完整名称(January..December) |
%c |
日期与时间。只输入date指令也会显示同样的结果 |
%C |
世纪(年份除100后去整) [00-99] |
%d |
日期(以01-31来表示)。 |
%D |
日期(含年月日)。 |
%e |
一个月的第几天 ( 1..31) |
%F |
日期,同%Y-%m-%d |
%g |
年份(yy) |
%G |
年份(yyyy) |
%h |
同%b |
%H |
小时(00..23) |
%I |
小时(01..12) |
%j |
一年的第几天(001..366) |
%k |
小时( 0..23) |
%l |
小时( 1..12) |
%m |
月份(01..12) |
%M |
分钟(00..59) |
%n |
换行 |
%N |
纳秒(000000000..999999999) |
%p |
AM or PM |
%P |
am or pm |
%r |
12小时制时间(hh:mm:ss [AP]M) |
%R |
24小时制时间(hh:mm) |
%s |
从00:00:00 1970-01-01 UTC开始的秒数 |
%S |
秒(00..60) |
%t |
制表符 |
%T |
24小时制时间(hh:mm:ss) |
%u |
一周的第几天(1..7); 1 表示星期一 |
%U |
一年的第几周,周日为每周的第一天(00..53) |
%V |
一年的第几周,周一为每周的第一天 (01..53) |
%w |
一周的第几天 (0..6); 0 代表周日 |
%W |
一年的第几周,周一为每周的第一天(00..53) |
%x |
日期(mm/dd/yy) |
%X |
时间(%H:%M:%S) |
%y |
年份(00..99) |
%Y |
年份 (1970…) |
%z |
RFC-2822 风格数字格式时区(-0500) |
%Z |
时区(e.g., EDT), 无法确定时区则为空 |
使用示例:
1: 查看date命令帮助信息
2:运用-d参数
1
2
3
4
5
6
7
8
|
[root@Gin scripts] # date
Sun Jan 29 10:46:03 CST 2017
[root@Gin scripts] # date -d now
Sun Jan 29 10:46:07 CST 2017
[root@Gin scripts] # date -d 'next monday'
Mon Jan 30 00:00:00 CST 2017
[root@Gin scripts] # date -d yesterday +%Y%m%d
20170128
|
3:显示文件中的时间
1
2
3
4
5
6
7
8
9
10
11
|
[root@Gin scripts] # cat >date.txt
2013-11-17 10:54:00
2013-11-22 11:11:11
[root@Gin scripts] # more date.txt
2013-11-17 10:54:00
2013-11-22 11:11:11
[root@Gin scripts] # date -f date.txt
Sun Nov 17 10:54:00 CST 2013
Fri Nov 22 11:11:11 CST 2013
|
4:显示文件最后修改的时间
1
2
|
[root@Gin scripts] # date -r date.txt
Sun Jan 29 10:49:11 CST 2017
|
5:按各种格式显示当前日期时间
这个命令的格式参数实在是太多了,在此没有必要每一个参数都尝试一遍,大家可以对照Format参数表,自己敲一敲命令实践一下。
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@Gin scripts] # date +%Y
2017
[root@Gin scripts] # date +%m
01
[root@Gin scripts] # date +%D
01 /29/17
[root@Gin scripts] # date '+%Y-%m-%d'
2017-01-29
[root@Gin scripts] # date +%Y-%m-%d
2017-01-29
[root@Gin scripts] # date +%m/%d/%y
01 /29/17
|
6: 设置系统时间
1
2
3
4
|
[root@Gin scripts] # date -s "2016-11-11 00:00:00"
Fri Nov 11 00:00:00 CST 2016
[root@Gin scripts] # date
Fri Nov 11 00:00:05 CST 2016
|
修改完后,把系统时间写入CMOS,硬件时钟,以免重启后失效,输入:clock -w
7:请给出如下格式的date命令,如:11-02-26。再给出实现按周输出,如:周六为6,请分别给出命令
1
2
3
4
5
6
|
[root@Gin scripts] # date +%y-%m-%d
17-01-29
[root@Gin scripts] # date +%F
2017-01-29
[root@Gin scripts] # date "+%Y-%m-%d %H:%M:%S"
2017-01-29 10:57:02
|
生产场景中常用时间格式来打包数据:
1
2
|
[root@Andy andy] # tar zcvf etc-$(date +%F).tar.gz /etc
[root@Andy andy] # tar zcvf etc-`date +%F`.tar.gz /etc
|
解析命令方法:反引号,或$(),如上
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@Andy andy] # date +%w ##显示周,0-6
3
显示过去与未来时间:
[root@Andy andy] # date +%F
2016-11-16
[root@Andy andy] # date +%F -d "-1day"
2016-11-15
[root@Andy andy] # date +%F -d "+2day"
2016-11-18
[root@Andy andy] # date +%F -d "+24hour"
2016-11-17
[root@Andy andy] # date +%F-%H -d "+2hour"
2016-11-16-14
|
实例
格式化输出:
date +"%Y-%m-%d"
2009-12-07
输出昨天日期:
date -d "1 day ago" +"%Y-%m-%d"
2012-11-19
2秒后输出:
date -d "2 second" +"%Y-%m-%d %H:%M.%S"
2012-11-20 14:21.31
传说中的 1234567890 秒:
date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S"
2009-02-13 23:02:30
普通转格式:
date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
2009/12/12 00:00.00
apache格式转换:
date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S"
2009-12-05 00:00.37
格式转换后时间游走:
date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S"
2007-12-05 00:00.37
加减操作:
date +%Y%m%d //显示前天年月日
date -d "+1 day" +%Y%m%d //显示前一天的日期
date -d "-1 day" +%Y%m%d //显示后一天的日期
date -d "-1 month" +%Y%m%d //显示上一月的日期
date -d "+1 month" +%Y%m%d //显示下一月的日期
date -d "-1 year" +%Y%m%d //显示前一年的日期
date -d "+1 year" +%Y%m%d //显示下一年的日期
设定时间:
date -s //设置当前时间,只有root权限才能设置,其他只能查看
date -s 20120523 //设置成20120523,这样会把具体时间设置成空00:00:00
date -s 01:01:01 //设置具体时间,不会对日期做更改
date -s "01:01:01 2012-05-23" //这样可以设置全部时间
date -s "01:01:01 20120523" //这样可以设置全部时间
date -s "2012-05-23 01:01:01" //这样可以设置全部时间
date -s "20120523 01:01:01" //这样可以设置全部时间
有时需要检查一组命令花费的时间,举例:
#!/bin/bash
start=$(date +%s)
nmap man.linuxde.net &> /dev/null
end=$(date +%s)
difference=$(( end - start ))
echo $difference seconds.
补充:
::只有超级用户才能用date命令设置时间,一般用户只能用date命令显示时间
一些 man page 沒提到的 --date=STRING 使用方法
date -d "yesterday" # 顯示昨天的時間
date -d "tomorrow" # 顯示明天的時間
date -d "1 hour" # 顯示一小時後的時間
date -d "2 day ago" # 顯示二天前的時間
date -d "3 month ago" # 顯示三個月前的時間
date -d "2 year" # 顯示二年後的時間
date -d "last friday" # 顯示上個星期五的時間
date -d "next week" # 顯示下週的時間
date -d "next month" # 顯示下個月的時間
date -d "fortnight" # 顯示二週後的時間
date -d "7/1 3 week" # 顯示 7/1 起算的第三週
date -d now +%s #时间转成时间戳
date -d '1970-01-01 1251734400 sec utc' +%Y/%m/%d// %T #时间戳转成时间
2.将本地易理解的时间转化为UTC时间,使用date 命令,对该时间进行UTC格式化
在这里,我们随便将上面这个格林威治时间修改一下来进行转化即可,比如1231130828
4.使用date命令将本地时间进行格式化
返回结果:12:47:08 PM
返回结果是:01/05/2009 12:47:08 PM
返回结果:01/05/2009 12:47:08 PM 01 #01是星期一,如果是%w,返回的是1
返回结果是:2009-01-05 12:47:08 01
对UTC时间的进行格式化:
返回结果:01/05/2009 12:47:08 PM
知识点:
首先我们了解一下时间的相关概念,以及之间的区别,需要了解的时间概念有:
本地时间(locale time)
格林威治时间(Greenwich Mean Time GMT)
时间协调时间 (Universal Time Coordinated UTC)
本地时间,显而易见不用解释了
先看看时间的标准:
世 界时是最早的时间标准。在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104。以此标准形成的时间系统,称为世界是,即 UT1。1972年国际上开始使用国际原子时标,从那以后,经过格林威治老天文台本初子午线的时间便被称为世界时,即UT2,或称格林威治时间 (GMT),是对地球转速周期性差异进行校正后的世界时。
(2)原子时
1967年,人们利用铯原子振荡周期极为规律的特性,研制出 了高精度的原子时钟,将铯原子能级跃迁辐射9192631770周所经历的时间定为 1s。现在用的时间就是1971年10月定义的国际原子时,是通过世界上大约200多台原子钟进行对比后,再由国际度量衡局时间所进行数据处理,得出的统 一的原子时,简称TAI。
(3)世界协调时
世界协调时是以地球自转为基础的时间标准。由于地球自转速度并不均匀,并非每天都是精确 的86400原子s,因而导致了自转时间与世界时之间存在 18个月有1s的误差。为纠正这种误差,国际地球自转研究所根据地球自转的实际情况对格林威治时间进行增减闰s的调整,与国际度量衡局时间所联合向全世界 发布标准时间,这就是所谓的世界协调时(UTC:Coordinatde Universal Time)。UTC的表示方式为:年(y)、月(m)、日(d)、时(h)、分(min)、秒(s),均用数字表示。
通过上面的了解,我们可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。
下面就介绍一个简单而使用的工具,就是使用linux/unix命令date来进行本地时间和local时间的转化。
大家都知道,在计算机中看到的utc时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。