답변:
BASH 산술 평가 및 GNU date
명령을 사용하는 하나의 (킨다 못생긴) 솔루션 :
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
0 패딩에서,이 때문에 여전히 8 월과 9 월 작동합니다.
%m
제공 09
이라는 오류가 발생합니다 그래서 bash는 시도는 인해 선도 0 진수로 해석한다 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 : 우리는 이것을 " 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
. 두 번 호출하고 매개 변수를 전달하지 않기 때문 입니다.
날짜를 사용하여 형식을 분할하고 awk로 계산하고 printf를 사용하여 형식을 지정하십시오.
date +"%Y %m" | awk '{printf ("%4dq%1d\n", $1, ($2/4)+1)}'
그냥 날짜와 배쉬 :
echo $(date +%Yq)$(($(date +%m)/4+1))
2012q0
이 잘못 출력 됩니다.
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 릴리스 로그 에서 :
새로운 기능
...
날짜는 이제 연중 분기를 출력하기 위해 % q 형식을 허용합니다.
그리고 그렇습니다!
$ date "+%q"
4
$ date "+%Yq%q"
2016q4