使用bash日期,我可以让它返回相对于当前时间的一周中的某一天。
date --d='last Sunday' #Returns date of the Sunday before today
我也可以让它返回相对于其他日期的一天
date --d='02/1/2012 -2 days' #Returns date two days before Feb. 1, 2012
但是如何才能让它返回相对于某些非当前时间的星期几?我想做的是:
date --d='Sunday before 02/1/2012' #Doesn't work! I want Sunday before Feb. 1
如果可能的话,我甚至希望能够链接字符串,以便我可以参考新日期的相对日期:
# Should return 2 days before the Sunday before Feb. 1, 2012
date --d='Sunday before 02/1/2012 - 2 days'
虽然这种链接并不重要。 bash日期是否有某种方式可以根据一周的相对日期返回一天?
答案 0 :(得分:9)
你可以使用一个小数字算术:
base="02/1/2012"
feb1_dayofweek=$( date -d $base +%w )
target_dayofweek=0 # sunday
date -d "$base - $(( (7 + feb1_dayofweek - target_dayofweek) % 7 )) days"
结果:
Sun Jan 29 00:00:00 EST 2012
答案 1 :(得分:4)
使用bash可以通过一些循环来完成(例如,将您想要用作Unix%s格式的变量的引用作为参考,而不是将其减去24 * 60 * 60,检查它是否为星期日,并打印出来如果这是真的......)
或者您可以使用awk
awk -v BASEDATE="2011 02 02" -v DIW="Sun" -v BEF="2"
'BEGIN { ct=BASEDATE " 00 00 00"
ct=mktime(ct)
while (strftime("%a",ct) != DIW) { ct-=24*60*60 }
ct-=BEF*24*60*60
print strftime("%Y-%m-%d %a",ct)
}'
You can see it in action here。几乎。由于ideone(我很喜欢)不允许将命令行变量传递给gawk
(或者我懒得弄明白;-)),我不得不将它们嵌入BEGIN
阻止。
如果您愿意,可以将上述内容转换为datecalc.awk
(!#/usr/bin/gawk -f
脚本,该脚本使用ARGV[n]
个变量而不是-v
个变量,以便您轻松调用来自你的shell脚本。
答案 2 :(得分:2)
如果安装了libfaketime,这很容易做到
export LD_PRELOAD=/usr/lib/libfaketime.so.1
$ FAKETIME='2012-02-01 00:00:00' date --d='last sunday'
Sun Jan 29 00:00:00 EST 2012
您可以通过动态设置FAKETIME来链接它。这将变得混乱,但会起作用:
$ FAKETIME=$(FAKETIME='2012-02-01 00:00:00' date --d="last sunday" '+%Y-%m-%d %H:%M:%S') date --d="-2 days"
Fri Jan 27 00:00:00 EST 2012