4
A
回答
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
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」不被視爲無效的八進制數。
相關問題
- 1. Unix的日期時間差異
- 2. 日期差異
- 3. 日期差異
- 4. 日期差異
- 5. php日期差異?
- 6. 日期差異Javascript
- 7. PHP日期差異
- 8. 按日期差異
- 9. SQL日期差異
- 10. PHP日期差異
- 11. Sqlite日期差異
- 12. Sharepoint日期差異
- 13. SVNKit日期差異
- 14. Javascript日期差異
- 15. MySQL日期差異
- 16. php日期差異
- 17. jquery日期差異
- 18. 差異日期我在表
- 19. 日期差異在php
- 20. Moment.js在UTC日期差異
- 21. 2日期jquery日期對象差異
- 22. 日期差異MS SQL
- 23. 日期比較差異
- 24. JavaScript日期差異天
- 25. SQL中的日期差異
- 26. IOS中的日期差異
- 27. 差異日期計算
- 28. 準確日期差異
- 29. 差異日期:總天數
- 30. PHP中的日期差異?
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個月舊的價值 –