您的位置:首页 > 运维架构 > Shell

shell 获取昨天日期

2013-07-06 13:47 260 查看
曾经做项目要获取昨天的日期,那时找到很多方法,最终根据TZ来获取昨天的日期,那时感觉这个很牛,觉得自己不懂别人也就不懂吧,我用了,别人就应该觉得我牛!嘿嘿…题外话。不过昨天又碰到了这个问题,这次是可以向脚本中传参来获取N天前的日期,看到别人写的好麻烦,心想如果用时区来写不简单的很吗,那样就不用判断年月日了吧,于是昨天用了3、4行达到了别人用3、40行要实现的内容,成就感还是有一点的



shell获取昨天日期的几种方式

1)TZ='GMT+16' date +%Y%m%d

2)date -d 'yesterday' +%Y%m%d

3)date -d "1 day ago" +%Y%m%d

4)date +%Y%m%d --date='last day'

今天本来是想系统的看看的,没想到方法真是很多啊!大家可以用“shell 时区 昨天”等关键字搜索,答案遍地。当然我也找到了一篇比较好的记录下来,以便日后自己学习方便,并在此表示感谢http://scmbob.org/special_usage_of_date.html





date非常规用法总结

以下讨论的内容主要涉及到3个方面:

1. 数字域的填充用法
2. 相对日期的获得

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

1. 数字域的填充:

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

$ date
+%m

06

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

短线(-): 表示不填充数字域

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

Examples:

$ date
+%d/%m

14/06

$ date
+%-d/%-m

14/6

$ date
+%_d/%_m

14/ 6 #注意/和6之间有个空格

2. 相对日期的获得

1), 获取相对当前日期的相对日期。

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

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

主要有三种指令:

last/next指令

ago指令

负数指令

1> last/next指令:

#今天的时间

$ 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. ago指令:

#同理,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

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

$ 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), 获取指定日期的相对时间

$ 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指令代替

$ date
-d '20110614 +2 days'

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

$ 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……

$ echo 1307980800
| awk '{T=strftime("%F %T",$1);print T}'

2011-06-14 00:00:00

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

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

2011-06-14 00:00:00

最后,总结一下:date命令是很灵活的,更多功能,请大家自己慢慢发掘……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: