2016-09-15 64 views
0

在mac osx bsd中,date -vmon會將當前日期轉換爲星期一的日期,並且date +%w顯示星期幾。在BSD中將日期字符串轉換爲日期對象MacOSX

說,我輸入的日期格式爲mm/dd/yy,格式爲9/14/16。如何將此字符串模式轉換爲日期對象,以便我可以對其執行日期功能,如-vmon+%w

我嘗試了以下操作:startDate=$(date -jf "%m/%d/%y" "9/14/16"),然後嘗試執行$startDate +"%w"但它不起作用。我懷疑startDate不是日期,實際上是String。

如何將字符串轉換爲日期以便對其執行日期操作?

編輯:這樣做的要求是:說一個輸入日期給出。然後,對應於該日期,我想獲取本週的開始和結束工作日期,即星期一的日期和星期五的日期。然後我想獲得下週的週一和週五的日期。我怎樣才能做到這一點?

+1

您不能;沒有日期對象,只有由'date'寫入標準輸出的字符串。 – chepner

+0

謝謝@chepner。我剛剛編輯我的文章詳細解釋我的要求。 –

+0

您可能需要比bash更強大的語言,例如'python'。 GNU版本的'awk'('gawk')有一些日期時間功能,但我認爲他們會很難做到你需要的。 – cdarke

回答

2

您需要使用date兩次,一次將字符串輸入轉換爲'epoch time'(自Epoch以來的秒數 - 又名1970-01-01 00:00:00 +00:00),而一旦一個劃時代的時間轉換爲您選擇的輸出格式:

rdate="9/14/16" 
epoch_time=$(date -j -f '%m/%d/%y' "$rdate" +'%s') 
date -j -vmon -r "$epoch_time" 
date -j -vfri -r "$epoch_time" +'%w' 

這給我的輸出:

Mon Sep 12 10:14:44 PDT 2016 
5 

注意,週五是一週的第5天,所以輸出是正確的。當您指定-vdow似乎有點沒有實際意義時使用%w;你知道輸出將是5.但你也可以使用你需要的任何其他格式字符。

請注意,時間部分默認爲當前時間。你可以添加00:00:00轉換後的日期和%H:%M:%S的轉換格式(-f參數)午夜工作等

你可以把它組合到一個命令行:

$ date -j -vmon -r $(date -j -f '%m/%d/%y %H:%M:%S' "$rdate 00:00:00" +'%s') +'%Y-%m-%d %H:%M:%S %w %s' 
2016-09-12 00:00:00 1 1473663600 
$ 

在最後一個例子在Mac OS X上date的手冊頁提到了%s格式說明符,這是實現此功能的關鍵。那麼,並使用date兩次。

注意,該男子頁給出的提綱:

date [-ju] [-r seconds] [-v [+|-]val[ymwdHMS]] ... [+output_fmt] 
date [-jnu] [[[mm]dd]HH]MM[[cc]yy][.ss] 
date [-jnu] -f input_fmt new_date [+output_fmt] 
date [-d dst] [-t minutes_west] 

的「使用」的消息是不太有幫助:

usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
      [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] 

用法消息並不表明你不能使用-f-r-v,而手冊很清楚你不能。

測試:Mac OS X 10.11.6 El Capitan

+1

用法消息可能更清晰,但我認爲這意味着有兩種不重疊的方式調用'date':第一行和第二行。如果第二行以'date'開始,那麼這將非常清楚,因此將第二行與第一行的延續混淆將更難。 – chepner

+0

@chepner:啊,是的。重複命令的名稱會使它更清晰,但你是正確的。 –

+0

優秀的答案。謝謝大家的詳細澄清。是的,'man date'中的最後一個例子提到了我失蹤的'%s'。 很抱歉接受這個答案這麼晚。我被拉到另一個工作,直到今天都無法嘗試。 –