2016-11-13 123 views
4
#####DATE1=201609 
#### DATE2=201508 

如何計算這兩個日期之間的區別,並得到輸出的無月的計數 即日期差異在UNIX

201609-201508=13month 

回答

0

你可以試試下面的解決方案 -

[[email protected] ~]$ cat time.awk 
{ 
diff1=((substr($1,1,4)) - (substr($2,1,4))) 
diff2=((substr($1,5,2)) - (substr($2,5,2))) 
if(diff1 > 0) 
     { 
     if(diff2 > 0) 
       { 
       print (diff1+diff2) 
       } 
     else if (diff2 = 0) 
       { 
       print (diff1+diff2) 
       } 
       else 
       { 
       diff2=(12+((substr($1,5,2)-(substr($2,5,2))))) 
       diff1=(diff1-1) 
       print (diff1+diff2) 
       } 
     } 
else if(diff1 == 0) 
     { 
     if(diff2 > 0) 
       { 
       print (diff1+diff2) 
       } 
     else if (diff2 == 0) 
       { 
       print (diff1+diff2) 
       } 
     else 
       { 
       print "Argument 2 is greater than 1" 
       } 
     } 
else 
     { 
     print "Argument 2 is greater than 1" 
     } 
} 

測試案例 -

[[email protected] ~]$ cat time1.txt && awk -f time.awk time1.txt 
201611 201601 
10 
[[email protected] ~]$ cat time2.txt && awk -f time.awk time2.txt 
201601 201611 
Argument 2 is greater than 1 
[[email protected] ~]$ cat time3.txt && awk -f time.awk time3.txt 
201511 201601 
Argument 2 is greater than 1 
[[email protected] ~]$ cat time4.txt && awk -f time.awk time4.txt 
201611 201611 
0 
+0

oldest_year_month_temp = 201602 NUM_PART_RETAIN = 20 oldest_year_month ='日期--date = 「$(oldest_year_month_temp +%Y%M) - $ NUM_PART_RETAIN月」「+%Y%M'如何獲得20個月舊的價值 –

2

時差的計算通常是一項複雜的工作,即使是單個日曆類型(並且有many)。許多編程語言都有對日期和時間操作操作的內置支持,包括計算時間差。但不幸的是,流行shell中最有用的功能是date命令,它缺少這個功能。

因此,我們應該用另一種語言編寫一個腳本,或者做一些假設,比如一年中的天數。

例如,在Perl任務只有四行代碼完成:

perl -e $(cat <<'PerlScript' 
use Time::Piece; 
my $t1 = Time::Piece->strptime($ARGV[0], '%Y%m'); 
my $t2 = Time::Piece->strptime($ARGV[1], '%Y%m'); 
printf "%d months\n", ($t1 - $t2)->months; 
PerlScript 
) 201609 201508 

然而,Time::Piece對象的區別是它實際上假定

存在的Time::Seconds實例一天24小時,一週7天,一年內爲 年365.24225天,一年爲12個月。

這間接證實了我關於任務複雜性的話。

然後讓我們做同樣的假設,並寫了一個簡單外殼腳本:

DATE1=201609 
DATE2=201508 

printf '(%d - %d)/2629744.2\n' \ 
    $(date -d ${DATE1}01 +%s) \ 
    $(date -d ${DATE2}01 +%s) | bc 

其中2629744.2是在一個月的秒數,即3600 * 24 * (365.24225/12)

請注意,大多數shell不支持浮點運算。這就是爲什麼我們需要調用外部工具,如bc

腳本輸出13。這是一個便攜式版本。例如,您可以在標準shell,Bash,Korn shell或Zsh中運行它。如果你想結果放入一個變量,只是在$(...)包裹printf命令:

months=$(printf '(%d - %d)/2629744.2\n' \ 
    $(date -d ${DATE1}01 +%s) \ 
    $(date -d ${DATE2}01 +%s) | bc) 

printf '%d - %d = %d months\n' $DATE1 $DATE2 $months 
0

讓我們嘗試一些快速和骯髒的,不會對在歷史上所有個月工作,但它可能不夠好:轉換到YYYYMM月數年以來0:

$ ym2m() { 
    if [[ $1 =~ ^([0-9]{4})([0-9]{2})$ ]]; then 
     echo $((10#${BASH_REMATCH[1]} * 12 + 10#${BASH_REMATCH[2]})) 
    else 
     return 1 
    fi 
} 

$ ym2m 201609 
24201 

$ ym2m 201508 
24188 

$ echo $(($(ym2m 201609) - $(ym2m 201508))) 
13 

注:

  • 需要的bash版本4.3(我想)
  • ym2m =>「年 - 月月」
  • 在算術表達式使用10#number,確保「08」和「09」不被視爲無效的八進制數。