コマンドラインから年四半期の日付を生成する方法は?


10

現在の年四半期と前月の年四半期の表現を出力することに興味があります。

今日が2012年1月1日の場合、

2012q1

そして

2011q4

それぞれの出力として。

回答:


10

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パディングから、。


2
非推奨のバッククォートの代わりに$(...)を使用します。それらは簡単にネストできます。
ユーザー不明の

1
好奇心をそそらないでください。なぜ他の回答では除数として4を使用するのですか
LiuYan刘研

2
@LiuYan刘研:わかりません。四半期には3か月あるので、3が正しい除数だと思います。(最初は私も混乱しましたが)
smokris 2013年

9月に%m与え09、これはというエラーがスローされますので、先頭の0までの8進数によると解釈しようとしているbashの09: value too great for base (error token is "09")。これは、に変更%mして0パディングを無効にすることで修正できます%-m
マシュー

5

私のdateutilsを使用してください

dconv 2012-01-01 -f '%Y%Q'
=>
  2012Q1

%qそして%Qフラグはdateutilsに固有のものであり、数値として、またはフォームで四半期を返しますQ<NUMBER>


dconv now -f%Y%Q | tr Q qQを小文字にする必要がある場合。(PS:これをFedoraでパッケージ化するdateので、プレフィックスとしての代わりにd" dateconv"を使用します。)
mattdm

5

たとえば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

1
+1「失敗のために分割されるすべてのソリューション」の場合。あなたが正しい!答えは3で割るべきであるので、3ヶ月の最後の四半期
スティーブン・泉

4

おそらく、直接的な解決策はありません。

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解決策はきれいになりますがperlDateTime重いの前提条件です。

#!/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 / awk行が好きdateです。これは、2回の呼び出し(およびパラメーターの受け渡し)を回避するためです。
smokris

4

フォーマットを日付で分割し、awkで計算し、printfでフォーマットします。

date +"%Y %m" | awk '{printf ("%4dq%1d\n", $1, ($2/4)+1)}'

ちょうど日付とbash:

echo $(date +%Yq)$(($(date +%m)/4+1))

最初の行2012q0は正しくない出力です。
smokris

@smokris:あなたは正しい-私は私のテストの間違った行を選んだ。
ユーザー不明の

4

好奇心としての代替手段。GNU awkが関与している場合、date必要ありません。

awk 'BEGIN{print strftime("%Y")"q"int((strftime("%-m")-1)/3)+1}'

3

呼び出し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

2

今月の四半期

date +"%Yq$(expr $(expr $(date +%m) - 1) / 3 + 1)"

昨月の年-四半期

date +"%Yq$(expr $(expr $(date -d '-1 month' +%m) - 1) / 3 + 1)"

2

今四半期および先月の四半期の基本的な計算:

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

スクリプトは次の部分を使用します。

  1. $(unix-cmd)-シェルスクリプトのコマンドを評価します
  2. $((expr))-数式を評価します
  3. 再マッピング1..12-> 1..4は次の数学(m-1)/ 3 + 1を使用します
  4. 前月の評価はモジュロ数学を使用します

2

現在、%qこの情報を表示するためのフォーマットがあります。

2016年11月30日のcoreutils-8.26リリースログから:

新機能
...
dateが%q形式を受け入れて、四半期を出力するようになりました。

そしてはい、それはうまくいきます!

$ date "+%q"
4
$ date "+%Yq%q"
2016q4

0

ISO週カレンダーに基づく13週の会計四半期が必要な場合、残念ながら、新しい便利な%qは機能しません。以下は、awk / strftimeを使用した@manatworkの日付のないソリューションのバージョンです。

awk 'BEGIN{$x=int((strftime("%V")-1)/13)+1;print strftime("%G")"q"($x>4?4:$x)}'

最後の小さな3値ビットは、最後の四半期が14週間あるISOうるう週を扱います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.