SHELL下date命令的用法

date命令如何获得上星期的日期?

1
date -d "-1 week" "+%Y%m%d %A"

举一反三:date命令获得前天,昨天,明天,后天,上个月,下个月的日期

1
2
3
4
5
6
7
8
9
10
11
date -d "-2 day" "+%Y%m%d %A" 或 date –date="2 days ago" "+%Y%m%d %A"

date -d "-1 day" "+%Y%m%d %A" 或 date –date="1 day ago" "+%Y%m%d %A"

date -d "1 day" "+%Y%m%d %A"

date -d "2 day" "+%Y%m%d %A"

date -d "-1 month" "+%Y%m%d %A"

date -d "1 month" "+%Y%m%d %A"

还有其他用法:

date +%s 可以得到UNIX的时间戳;

1
2
3
$ cat utc.sh
#!/bin/sh
date -d '1970-01-01 UTC '$1' seconds' +"%Y-%m-%d %T"
1
2
$ utc 1176736543
2007-04-16 23:15:43

可以把UNIX时间戳转换成当前系统时间

另外要注意下日期字串中的相对项问题:
比如今天是08年3月30日,date -d "last month" +%Y%m%d 得到的结果会显示为20080301,因为一个月前,即2月30日是无效的。

Relative items 向前或向后调整指定日期(如不指出日期为当前日期)。相对项的效果是累积的。这里有一些例子: examples:

1 year
1 year ago
3 years
2 days

时间的单位可以用字串 ‘year’ 或 ‘month’ 替换,表示移动整年或整月。有一些模糊的单位,像 years 和 months 时间段并不一致。精确的单位有 ‘fortnight’ 表示 14 天,’week’ 是 7 天,’day’ 是 24 小时,’hour’ 是 60 分钟, ‘minute’ 或 ‘min’ 是 60 秒,’second’ 或 ‘sec’ 是一秒。单位后面可以有后缀 ‘s’,但被忽略。

时间单位前面可以跟乘数,它是一个符号数。没有符号的数字认为是正数。没有给出乘数隐含为 1。相对时间后面的 ‘ago’ 字串等于乘数值为-1。

字串 ‘tomorrow’ 值为将来的一天(等于 ‘day’),字串 ‘yesterday’ 值为过去的一天(等于 ‘day ago’)。

字串 ‘now’ 或 ‘today’ 相对项等同于用零值替代,如果没有被前面项目修改,这些字串代表当前时间。它们也可以用来强调其他项,如 ‘12:00 today’。字串 ‘this’ 也代表零值,但常用于 ‘this thursday’ 这样的日期字串里面。

当相对项让日期跨越时钟调整边界时,典型的例子是夏时制,日期和时间的结果也要相应地调节。

模糊的单位会另相对项出现问题。例如,’2003-07-31 -1 month’ 可以等于 2003-07-01,这是因为 2003-06-31 是一个无效的日期。为了更可靠地确定上一个月,你可以询问当前月十五号的上一个月,例如:

1
2
3
4
5
6
$ date -R
Thu, 31 Jul 2003 13:02:39 -0700
$ date –date='-1 month' +'Last month was %B?'
Last month was July?
$ date –date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
Last month was June!

还有,要小心处理夏令时闰年日期和时间的改变。一些情形下它们增加或减少 24 小时,所以开始日历计算前,最好先将 TZ 环境变量设成 ‘UTC0’。