如何让bash date脚本返回相对于非当前时间的星期几?

时间:2012-02-09 00:24:47

标签: linux bash date

使用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日期是否有某种方式可以根据一周的相对日期返回一天?

3 个答案:

答案 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