date用法总结

1. 数字域的填充:

默认情况下,在显示日期和时间时,date命令使用数字0填充数字域。例如,如果用两位数字显示月份,则6月显示为“06”,如下所示:

1
2
$ date +%m
06

当然,一切皆有变通,你可以用下述控制符来控制填充符号:

短线(-): 表示不填充数字域
下划线(_): 表示用空格填充数字域

Examples:

1
2
3
4
5
6
$ date +%d/%m
14/06
$ date +%-d/%-m
14/6
$ date +%_d/%_m
14/ 6 #注意/和6之间有个空格

2. 相对日期的获得

2.1. 获取相对当前日期的相对日期

d 选项可以告诉您,相对于当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为 -d 选项的参数,就可以完成这项任务。

为了表述的简单明了点,我想还是直接举例说明吧:

主要有三种指令:

last/next指令
ago指令
负数指令

2.1.1. last/next指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#今天的时间
$ date +%Y-%m-%d
2011-06-14
$ date -d last-day +%Y-%m-%d
2011-06-13
$ date -d yesterday +%Y-%m-%d
2011-06-13

$ date -d next-day +%Y-%m-%d
2011-06-15
$ date -d tomorrow +%Y-%m-%d
2011-06-15
#除了day, month,支持的还有如week, year, hour, min, sec等
#这里就不再一一举例了
$ date -d last-month +%Y-%m-%d
2011-05-14
$ date -d next-month +%Y-%m-%d
2011-07-14

2.1.2. ago指令:

1
2
3
4
5
6
7
8
#同理,day, month, week, year, hour, min, sec都是支持的
$ date -d '1 day ago' +%Y-%m-%d
2011-06-13
$ date -d '2 days ago' +%Y-%m-%d
2011-06-12
#不加ago,那就表示相对于今天的后一天
$ date -d '1 day' +%Y-%m-%d
2011-06-15

2.1.3. 负数指令(负数很好理解,即得到相反的日期),以下两两是等效的:

1
2
3
4
5
6
7
8
9
$ date -d '-2 days' +%Y-%m-%d
2011-06-12
$ date -d '2 days ago' +%Y-%m-%d
2011-06-12

$ date -d '2 days' +%Y-%m-%d #这里你也可以用+2来表示
2011-06-16
$ date -d '-2 days ago' +%Y-%m-%d
2011-06-16

2.2. 获取指定日期的相对时间

1
2
3
4
$ date -d '20110614 next-day' +%Y-%m-%d
2011-06-15
$ date -d 'june 14 -1 day' +%Y-%m-%d
2011-06-13

以下还有一种用法,不过要注意的是,这种方式在较早的操作系统中(如RedHat 4U7)可能不支持,需使用next/last指令代替

1
$ date -d '20110614 +2 days'

3. 时间戳和日期的互相转换:

1
2
3
4
5
6
$ date --date="2011-06-14" "+%s"
1307980800
$ date --date="1970-01-01 UTC 1307980800 seconds" "+%Y-%m-%d"
2011-06-14
$ date --date="@1307980800" "+%Y-%m-%d"
2011-06-14

4. 补充:

时间戳的转换还能用awkstrftime来实现,感谢bbgg1983……

1
2
$ echo 1307980800 | awk '{T=strftime("%F %T",$1);print T}'
2011-06-14 00:00:00

或者用sed,哈哈,感谢SS……

1
2
$ echo '1307980800' |sed -r -e "s/(.*)/date -d @\1 '+%Y-%m-%d %H:%M:%S'/e"
2011-06-14 00:00:00

最后,总结一下:date命令是很灵活的,更多功能,请大家自己慢慢发掘……