나는 현재 연도 및 전월의 분기를 표현하는 데 관심이 있습니다.
오늘이 2012 년 1 월 1 일인 경우
2012q1
과
2011q4
각 출력으로.
답변
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 월 작동합니다.
답변
내 dateutils를 사용하십시오 .
dconv 2012-01-01 -f '%Y%Q'
=>
2012Q1
%q
및 %Q
플래그는 dateutils 특정이며, 숫자 또는 형태로 분기를 반환 Q<NUMBER>
.
답변
예를 들어 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"
답변
날짜를 사용하여 형식을 분할하고 awk로 계산하고 printf를 사용하여 형식을 지정하십시오.
date +"%Y %m" | awk '{printf ("%4dq%1d\n", $1, ($2/4)+1)}'
그냥 날짜와 배쉬 :
echo $(date +%Yq)$(($(date +%m)/4+1))
답변
호기심에 대한 대안. GNU awk
가 관련된 경우 date
필요하지 않습니다.
awk 'BEGIN{print strftime("%Y")"q"int((strftime("%-m")-1)/3)+1}'
답변
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