回答:
BASH算術評価とGNU date
コマンドを使用する1つの(ちょっと醜い)ソリューション:
echo $(date +%Y)q$(( ($(date +%-m)-1)/3+1 ))
echo $(date -d "-1 month" +%Y)q$(( ($(date -d "-1 month" +%-m)-1)/3+1 ))
なお、%-m
防止date
、これはまだ8月と9月のために動作しますので、0パディングから、。
%m
与え09
、これはというエラーがスローされますので、先頭の0までの8進数によると解釈しようとしているbashの09: value too great for base (error token is "09")
。これは、に変更%m
して0パディングを無効にすることで修正できます%-m
。
私のdateutilsを使用してください:
dconv 2012-01-01 -f '%Y%Q'
=>
2012Q1
%q
そして%Q
フラグはdateutilsに固有のものであり、数値として、またはフォームで四半期を返しますQ<NUMBER>
。
dconv now -f%Y%Q | tr Q q
Qを小文字にする必要がある場合。(PS:これをFedoraでパッケージ化するdate
ので、プレフィックスとしての代わりにd
" dateconv
"を使用します。)
たとえば11月など、4で割るすべてのソリューションは失敗します。
% echo $(( 11/4+1 ))
3
正しい計算は次のとおりです。
$(( (m-1)/3 +1 ))
したがって、今月と前月の四半期は次のようになります。
echo curr ${y}q$(((m-1)/3+1))
if [ $m = 1 ]; then
echo prev $((y-1))q4
else
echo prev ${y}q$(((m-2)/3+1))
fi
チェックする値は12個だけです、本当に…
% for m in {1..12}; do echo $m Q$(((m-1)/3+1)); done
1 Q1
2 Q1
3 Q1
4 Q2
5 Q2
6 Q2
7 Q3
8 Q3
9 Q3
10 Q4
11 Q4
12 Q4
おそらく、直接的な解決策はありません。
awk
非常に多くのバックティックを回避するために使用できます。
date +"%Y %m" | awk '{q=int($2/4)+1; printf("%sq%s\n", $1, q);}'
date +"%Y %m" | awk '{q=int($2/4);y=$1;if (q==0){q=4;y=y-1;}; printf("%sq%s\n", y, q);}'
perl
解決策はきれいになりますがperl
とDateTime
重いの前提条件です。
#!/usr/bin/perl
use DateTime;
my $today = DateTime->now;
print "today: " . $today->year . "q" . $today->quarter . "\n";
my $ago = DateTime->now->subtract( months=> 4);
print "some time ago: " . $ago->year . "q" . $ago->quarter . "\n"
date
です。これは、2回の呼び出し(およびパラメーターの受け渡し)を回避するためです。
呼び出しdate
て現在の年と月を取得し、残りをシェルの算術で実行します。
set $(date '+%Y %m');
this_quarter=${1}q$(($2 / 4 + 1))
if [ $2 -eq 1 ]; then
last_month_quarter=$(($1 - 1))q4
else
last_month_quarter=${1}q$((($2 - 1) / 4 + 1))
fi
今四半期および先月の四半期の基本的な計算:
y1=$(date +%Y)
m1=$(date +%m)
q1=$(( (m1 - 1) / 3 + 1))
y2=$(( y1 - (m1 == 1) ))
m2=$(( (m1 + 10) % 12 + 1 ))
q2=$(( (m2 - 1) / 3 + 1 ))
echo This Quarter: $((y1))q$q1
echo Last Month Quarter: $((y2))q$q2
スクリプトは次の部分を使用します。
現在、%q
この情報を表示するためのフォーマットがあります。
2016年11月30日のcoreutils-8.26リリースログから:
新機能
...
dateが%q形式を受け入れて、四半期を出力するようになりました。
そしてはい、それはうまくいきます!
$ date "+%q"
4
$ date "+%Yq%q"
2016q4