2017-01-18 61 views
3

例如,給定日期爲'2016-12-31',n爲2,預期產出爲'2016-12-29'。

我調查date命令,並從當前日期起n天前是很容易:
date -d "2 days ago" +%Y-%m-%dn天前從命令行給定日期起

+1

我將標記從[tag:unix]更改爲[tag:linux],因爲此表達式的'-d'行爲是[GNU擴展名](https://www.gnu.org/software/coreutils/manual /html_node/Options-for-date.html),在[POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html),[BSD](http:// www。 unix.com/man-page/FreeBSD/1/date/)等。 – pilcrow

+0

儘管@ pilcrow的評論,我已經提供了一個BSD的答案以及解決GNU或BSD的方法。另請注意,GNU不需要Linux內核,也不一定意味着Linux發行版。我添加了「gnu」標籤並返回了「unix」標籤,同時保留了「linux」。 –

回答

4

只是提到你要兩天從抽取日期:

$ date -d "2016-12-31 2 days ago" +%Y-%m-%d 
2016-12-29 

或者更好一點grammatically-明智的:

$ date -d "2016-12-31 -2 days" +%Y-%m-%d 
2016-12-29 
+1

有用,謝謝 – cheng

+1

沒想到命令會這麼厲害 – cheng

+1

@cheng的確,它實在是太厲害了!注意它有時可能會奇怪地工作:[日期處理第一個參數不正確,如果它不是1](http://unix.stackexchange.com/q/211796/40596)。 – fedorqui

0

如果你沒有GNU日期,也許你有BSD date而不是。在這種情況下,你可以這樣做:請注意,這不是POSIX,也不是GNU。

這告訴BSD日期不要更改時鐘(-j)並將輸入作爲UNIX time(1970/01/01 00:00:00之後的秒,UTC,-f %s)。提供的時間是當前時間的數學替換($(date +%s),使用與輸出相同的格式)減去一天(86400)乘以二的秒數。

我已經在過去,編寫的代碼,以查找GNU和故障轉移到BSD:

# Usage: _epoch2datefmt UNIX_TIME [+FORMAT] 
if date -d @1484850179 +%s >/dev/null 2>&1 
    then _epoch2datefmt() { date -d @"[email protected]"; } # GNU 
    else _epoch2datefmt() { date -jf %s "[email protected]"; } # BSD 
fi 

對於這個問題,它可以讓你寫:

_epoch2datefmt $(($(date +%s) - 86400 * 2)) 

這是相對日期有點不切實際;您最好調整助手函數,以便GNU版本不需要額外的命令。

相關問題