先说不用date命令的方法:
不嫌麻烦就多用几个判断,解决每月开头、每年开头减去一天的问题,最麻烦的是倒推到上个月最后一天,这一天究竟是28、29还是30、31,还得写个函数。
再说date的基本用法:
date +%Y%m%d 这是格式化输出,其他语言多数叫做strftime()
date -d "2 days ago" +%s -d可以输入一个日期,不过大多是相对于现在时间,+%s是输出时间戳。
date -d "2010-12-06" +%F -d可以接受ISO格式yyyy-mm-ddTHH:MM:SSZ,也可以接受日期的一些英文格式(月份英文缩写) %F就是%Y%m%d
接着搜到的我不知道的格式用法,当然对我的问题没有帮助:
格式字符中加-可以去掉前面的0,加_把前面的0变成一个空格,举例:date +%-Y%-m%-d 是 2010-12-6 (6前面的0去掉了) date +%_Y%_m%_d 是 2010-12- 6 (6前面有一个空格)
最后是谜底,date可以接受的特殊-d参数:
date -d "1970-01-01 UTC 1291622912 seconds" +%s 在前面的日期上面加上这么多秒作为输入。在我的脚本中这么用的:
1、获取当前时间 并格式化 比如 date +'%F %T'2、日期的二 则运算
GNU date 的日期加减运算是支持自然语言的,主要有三种指令:
last/next指令
ago指令
负数指令
比如 date -I &&date -I -d'last sunday -7 days'
3、字符串转换为日期、指定时间格式 比如date -d'31/Oct/2013:00:00:10 +0800' +'%F %T'
4、注 意时区问题
date 里面时间的 + - 注意格式会影响结果/时区(最安全的写法是不要带符号,用自然语言即可):
5、最后的技能:
(1)当 %H%M 遇上 [[ ]]
请看下面这段代码,很多人估计会犯的错误:
[[ `date +'%H%M'` -eq 0 ]]
恭喜你,你每天早上的 8、9 点执行脚本的话都会遇到:
value too great for base (error token is "0950") 这样的错误,
这是因为 [[]] 把 0950 当成 8 进制来解析了,所以抛异常了。
解决办法有如下 3 种,可以选择你认为最爽的一种修复:
(1.1)换成 [ 0 -eq 0950 ] &&echo 1 即可
(1.2)或者手动指定进制也行 [[ 950 -eq 10#0950 ]] &&echo 1
(1.3)让 '%H%M' 这种格式不带前导符 0:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)