Answers:
一种解决方案,使用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
prevents date
from 0-padding,因此在8月和9月仍然有效。
%m
给09
bash会为八进制解释这是由于0领先,所以这将引发一个错误,指出09: value too great for base (error token is "09")
。可以通过更改%m
为禁用0填充来解决此问题%-m
。
dconv now -f%Y%Q | tr Q q
如果您确实需要将Q小写。(PS:我们将它包装在Fedora中,date
使用前缀而不是d
,所以用“ dateconv
”。)
除以四的所有解决方案都会失败,例如11月:
% 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
真的只有十二个值需要检查...
% 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
两次(并将参数传递给)。
调用date
以检索当前的年和月,然后在shell中使用算术进行其余操作。
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