smo*_*ris 11 command-line date
我有兴趣输出当前年度季度的表示,以及上个月的年度季度。
如果今天是 2012 年 1 月 1 日,我想得到
2012q1
Run Code Online (Sandbox Code Playgroud)
和
2011q4
Run Code Online (Sandbox Code Playgroud)
作为各自的输出。
smo*_*ris 11
一种(有点丑陋)解决方案,使用 BASH 算术评估和 GNUdate
命令:
echo $(date +%Y)q$(( ($(date +%-m)-1)/3+1 ))
echo $(date -d "-1 month" +%Y)q$(( ($(date -d "-1 month" +%-m)-1)/3+1 ))
Run Code Online (Sandbox Code Playgroud)
请注意,%-m
防止date
0-padding,因此这在 8 月和 9 月仍然有效。
除以四的所有解决方案都失败了,例如 11 月:
% echo $(( 11/4+1 ))
3
Run Code Online (Sandbox Code Playgroud)
正确的数学是:
$(( (m-1)/3 +1 ))
Run Code Online (Sandbox Code Playgroud)
因此,当月和上月的季度将是:
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
Run Code Online (Sandbox Code Playgroud)
只需要检查十二个值,真的……
% 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
Run Code Online (Sandbox Code Playgroud)
使用我的dateutils:
dconv 2012-01-01 -f '%Y%Q'
=>
2012Q1
Run Code Online (Sandbox Code Playgroud)
在%q
和%Q
标志是特定于dateutils和季度回报为数字或形式Q<NUMBER>
。