2012-08-07 86 views
6

我正在運行SunOS。在solaris中獲取昨日的日期

bash-3.00$ uname -a 
SunOS lvsaishdc3in0001 5.10 Generic_142901-02 i86pc i386 i86pc 

我需要找到Yesterday's date in linux以正確的格式從命令提示符傳遞。當我試圖像這樣在我的殼prompt-

bash-3.00$ date --date='yesterday' '+%Y%m%d' 
date: illegal option -- date=yesterday 
usage: date [-u] mmddHHMM[[cc]yy][.SS] 
     date [-u] [+format] 
     date -a [-]sss[.fff] 

我總是得到最新illegal option,爲什麼會這樣呢? 我在做什麼錯?

更新: -

bash-3.00$ date --version 
date: illegal option -- version 
usage: date [-u] mmddHHMM[[cc]yy][.SS] 
     date [-u] [+format] 
     date -a [-]sss[.fff] 
+0

這對我在linux下工作正常 – 2012-08-07 22:35:21

+0

這不適合我。有沒有你需要的信息,比如爲什麼它不工作? – AKIWEB 2012-08-07 22:37:26

+0

'date --version'說什麼? (在你的問題中發佈結果,而不是發表評論,因爲格式化會被弄糟) – 2012-08-07 22:38:18

回答

8

試試這個下面的事情。它應該工作

YESTERDAY=`TZ=GMT+24 date +%Y%m%d`; echo $YESTERDAY 
+0

這是什麼格式? 20120901還是201291? – mouthpiec 2012-11-26 09:48:31

+0

使用此解決方案如果您在午夜(-1h,+ 1h)周圍運行此批次,則可能會遇到問題。它取決於TZ,因此請確保設置當前的TZ,即CET或GMT + 1等。 – 2016-04-14 12:16:25

3

試試這個:

DATE_STAMP=`TZ=GMT+24 date +%Y%m%d` 

其中GMT是時區,你可能需要根據時間差從GMT必須改變24。無論是你還是可以將GMT更改爲更舒適的時區,例如CST

2

由於larsks建議,你可以使用Perl:

perl -e 'use POSIX qw(strftime); print strftime "%a %b %e %H:%M:%S %Y",localtime(time()- 3600*24);' 

http://blog.rootshell.be/2006/05/04/solaris-yesterday-date/

稍加修改要得到YYYYMMDD格式使用此

perl -e 'use POSIX qw(strftime); print strftime "%Y%m%d",localtime(time()- 3600*24);' 

此鏈接介紹如何格式化日期和時間strftime

http://perltraining.com.au/tips/2009-02-26.html

+0

如何從該perl腳本獲取'YearMonthDay'?像20120706 – AKIWEB 2012-08-07 23:06:37

+0

我編輯了我上面的答案,以包含您請求的YearMonthDay格式。 – amdn 2012-08-08 05:00:17

2

純bash的解決方案

#!/bin/bash                                        

# get and split date                                      
today=`date +%Y%m%d` 
year=${today:0:4} 
month=${today:4:2} 
day=${today:6:2} 

# avoid octal mismatch                                     
if ((${day:0:1} == 0)); then day=${day:1:1}; fi 
if ((${month:0:1} == 0)); then month=${month:1:1}; fi 

# calc                                         
day=$((day-1)) 
if ((day==0)); then 
    month=$((month-1)) 
    if ((month==0)); then 
     year=$((year-1)) 
     month=12 
    fi 
    last_day_of_month=$((((62648012>>month*2&3)+28)+(month==2 && y%4==0))) 
    day=$last_day_of_month 
fi 

# format result                                       
if ((day<10)); then day="0"$day; fi 
if ((month<10)); then month="0"$month; fi 
yesterday="$year$month$day" 
echo $yesterday 
+0

所有的日期計算都讓我重新發明輪子。爲什麼不使用內置的工具? – Jens 2013-07-26 11:32:30

+0

'day = last_day_of_month'語句中有額外的空格;修復它,我會給你一個+1,尤其是因爲否則你的解決方案是唯一一個總是在任何時區給出正確答覆的方案。 – jlliagre 2013-09-06 07:22:59

+0

@Jens,可能有一個工具可以解決內置的問題,但可以將其作爲答覆。所有(當前)剩下的答覆或多或少都會給出錯誤的日期。如果你想要一個完美的圓形,但沒有找到,可能需要重新創建輪子。接受的答案是相當方形的方向盤... – jlliagre 2013-09-06 07:31:14

0

播放上Solaris10的非GMT的環境中,我得到這個:

# date 
Fri Jul 26 13:09:38 CEST 2013 (OK) 

# (TZ=CEST+24 date) 
Thu Jul 25 11:09:38 CEST 2013 (ERR) 

# (TZ=GMT+24 date) 
Thu Jul 25 11:09:38 GMT 2013 (OK) 

# (TZ=CEST+$((24-$((`date "+%H"`-`date -u "+%H"`)))) date) 
Thu Jul 25 13:09:38 CEST 2013 (OK) 

正如你colud看,我已經和我想獲得CEST,但是TZ = CEST + 24給了我錯誤的CEST數據; GMT + 24給了我正確的數據,但無法使用。

爲了得到正確的結果,我必須使用GMT + 22(錯誤的命令,正確的結果)或CEST + 22(錯誤的值,但是對於正確的TZ finnaly正確的結果)

1

SunOS中TZ=$TZ+24 date +'%Y/%m/%d'

+0

這是獨特和完美的解決方案。只要TZ變量設置正確,它就可以在TZ工作。謝謝 – 2016-04-14 12:21:55

0

給出的純bash解決方案@olivecoder與任何其他解決方案相比都非常可靠,但有一個錯誤需要糾正。當月份的第一天下降時,腳本失敗,日期的值爲「last_day_of_month」。@olivecoder已經錯過$day=last_day_of_month,它應該是

day=$last_day_of_month; 

這種修正它的工作原理很不錯了。

使用時區-24使用它時有一些問題基於時間。在某些情況下會在前天進行。所以我認爲它不可靠。

+0

我按照建議修正了我的解決方案。謝謝! – olivecoder 2016-07-18 08:05:08