簡體   English   中英

如何讓bash date腳本返回相對於非當前時間的星期幾?

[英]How do I get the bash date script to return a day of the week relative to a non-current time?

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

你可以使用一個小數字算術:

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

好吧,使用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)
              }'

你可以在這里看到它 幾乎。 由於ideone (我很喜歡)不允許將命令行變量傳遞給gawk (或者我懶得想出來;-)),我不得不將它們嵌入到BEGIN塊中。

如果你願意,可以將上面的內容轉換為datecalc.awk (使用!#/usr/bin/gawk -f腳本,它使用ARGV[n]變量而不是-v提供的變量,這樣你就可以從shell腳本中輕松調用它。

如果你安裝了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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM