2012-02-18 71 views
0

我在BASH編程方面還很新,而且我正在爲一個問題而絞盡腦汁。我正在嘗試爲我的工作編寫腳本,以便在給定的包在正常結束日期之前取消的情況下計算退款。現在簡單的東西,如輸入和其他這樣的東西,我敢肯定,我可以通過谷歌搜索和實驗(儘管你應該選擇幫助我,我會非常感激)。確定日期之間的差異

我不知道我能找到自己的方法是一個腳本或一組命令,可以計算兩個日期之間的天數/月數,並使用該變量計算總數ammount的退款。我會嘗試解釋我在這裏要做的事情:

輸入兩個日期(MM/DD/YYYY格式)並獲得IE和3個月和13天的差異。

輸入基礎月率

(基礎×月數)+((鹼基/ 30)*天數)= ammount的客戶使用

輸入倍受客戶如何祈禱, - ammount的使用= ammount的來退還

則優選它打印它,人們可以用它來「展示自己的作品」

的方式,我知道這是一個有點過分的要求與幫助,但我真的可以用一隻手的日期計算器。

感謝您提前提供任何幫助!

PS我做了一些預先搜索,我發現了類似的問題,但沒有真正符合我需要的東西。

+0

見http://www.unix.com/tips-tutorials/31944-simple -date-時間calulation-bash.html。 – 2012-02-18 03:48:22

+1

一些事情。通常,在提問時,你應該已經試着解決你的問題,並有代碼張貼顯示你已經嘗試了什麼,以及你的期望輸出是什麼。當你用一種新語言編寫某些東西時,即使它看起來有效,也要準備好拋出你的第一次嘗試。日期數學更容易在其他語言中完成。你將能夠在bash中做的最好的轉換爲秒,執行數學,然後將其轉換回來。 – jordanm 2012-02-18 03:56:01

+0

一個常見的模式是將所有時間數據轉換爲簡單的串行格式,例如Unix紀元(自1970-01-01午夜以來的秒數),並對這些值進行所有內部計算。然後轉換回人類可讀的顯示目的是相當簡單的 - 只要記住保持絕對時間(2012-02-18 12:34:56)與相對(例如兩週的持續時間)分開。如果您正在處理時區,則您也需要在內部將所有內容都轉換爲UTC。 – tripleee 2012-02-18 13:50:51

回答

0

python,你可以使用datetime.strptime()方法從datetime模塊:

$ from=01/25/2011 to=01/30/2012 
$ dur=`python -c "from datetime import datetime; print((datetime.strptime('$to', '%m/%d/%Y')-datetime.strptime('$from', '%m/%d/%Y')).days)"` 
$ echo $dur 
370 
0

假設你不想days要大於30,這將做的工作在bash:

date1="12/20/2011" 
date2="02/18/2012" 

y1=${date1/*\/*\//} 
y2=${date2/*\/*\//} 

m1=${date1/\/*\/*/} 
m2=${date2/\/*\/*/} 

d1=${date1/\/$y1/} 
d1=${d1/$m1\//} 
d2=${date2/\/$y2/} 
d2=${d2/$m2\//} 

m=$(($y2 * 12 - $y1 * 12 + $m2 - $m1)) 
d=$(($d2 - $d1)) 
test $d -lt 0 && { d=$(($d + 30)); m=$(($m - 1)); } 

echo "$m month(s) and $d day(s)." 

日期解析可以簡化爲以下,如果您總是有2個字符DDMM

y1=${date1:6:4} 
y2=${date2:6:4} 

m1=${date1:0:2} 
m2=${date2:0:2} 

d1=${date1:3:2} 
d2=${date2:3:2} 
+0

但是,請注意它是不是簡單的在bash中對浮點數進行算術運算。 awk解決方案即將到來,在這種情況下可能會更好。 – jfg956 2012-02-18 10:59:11

0

使用awk的,你可以:

date1="12/20/2011" 
date2="02/19/2012" 
echo -e "$date1\n$date2" | awk -F "/" -v base=15 ' 
    NR == 1 {m1=$1; d1=$2; y1=$3} 
    NR == 2 {m2=$1; d2=$2; y2=$3} 
    END{m=12*(y2-y1) + m2-m1; d=d2-d1; m=d<0 ? m-1 : m; d=d<0 ? d+30 : d 
    print m " month(s) and " d " day(s)" 
    print "refund: " (base*m + (base/30.0)*d) "€"}' 
2

使用我dateutils你可以去

ddiff '2010-12-05' '2012-04-10' -f '%mmo %dd' 
=> 
    16mo 5d