问题描述
我需要按照以下格式从当前系统日期计算当前,上一年和下一年的季度。
根据当前日期(2020年11月2日),本季度应返回为20204
,上一季度应返回20203
,下一个季度应返回20211
。它应该是动态的,并且适用于所有日期/月份。我正在尝试使用类似下面的方法,但是它似乎没有用。请帮我解决一下这个。预先感谢。
curr_yrqtr=$(date +%Y)$(( ($(date +%-m)-1)/3+1 ))
prev_yrqtr=$(date -d "-1 month" +%Y)$(( ($(date -d "-1 month" +%-m)-1)/3+1 ))
解决方法
您的问题有很多不同的标签,这是一个Perl解决方案:
#!/usr/bin/env perl
use strict;
use warnings;
my @now = localtime( time );
my $quarter = 1 + ($now[4]+1) % 4;
my $year = $now[5] + 1900;
my @q_prev = $quarter == 1 ? ($year-1,4) : ($year,$quarter-1);
my @q_next = $quarter == 4 ? ($year+1,1) : ($year,$quarter+1);
printf "%d%d\n",@q_prev;
printf "%d%d\n",$year,$quarter;
printf "%d%d\n",@q_next;
,
看到问题如何具有几个不同的标记(bash
,ksh
,perl
),我猜想OP对产生期望结果的任何解决方案都是开放的。
如果OP的date
版本包括对%q
(四分之一)格式的支持:
read -r curr_year curr_qtr < <(date '+%Y %q')
如果OP的date
版本不支持%q
(四分之一)格式:
read -r curr_year curr_month < <(date '+%Y %m')
curr_qtr=$((curr_month / 3 + 1))
无论date
的版本如何,其余代码均相同:
prev_year="${curr_year}"
prev_qtr=$((curr_qtr - 1))
next_year="${curr_year}"
next_qtr=$((curr_qtr + 1))
case "${curr_qtr}" in
1) prev_year=$((curr_year - 1)) ; prev_qtr=4 ;;
4) next_year=$((curr_year + 1)) ; next_qtr=1 ;;
esac
echo "previous quarter : ${prev_year}${prev_qtr}"
echo "current quarter : ${curr_year}${curr_qtr}"
echo "next quarter : ${next_year}${next_qtr}"
在“ today” == 2020年11月2日运行上述内容:
previous quarter : 20203
current quarter : 20204
next quarter : 20211
,
将日期更改为01,然后将-或+ 3个月更改为正确的年份和月份数字。
curr_yrqtr=$(date +%Y)$(($(date +%-m)/3+1))
prev_yrqtr=$(date -d "$(date +%Y%m01) -3 months" +%Y)$(($(date -d "$(date +%Y%m01) -3 months" +%-m)/3+1))
next_yrqtr=$(date -d "$(date +%Y%m01) +3 months" +%Y)$(($(date -d "$(date +%Y%m01) +3 months" +%-m)/3+1))
,
使用可移植的shell脚本,您可以说:
yrmo=$(date '+%Y%m')
: $((yr = yrmo / 100)) $((mo = yrmo % 100))
# let p = quarter number less 1 (0..3)
: $(( p = (mo-1)/3 ))
printf '%d-%02d:\t%d%d\t%d%d\t%d%d\n' \
"$yr" "$mo" \
$(( yr-(p<1) )) $(( p<1 ? 4 : p+0 )) \
$(( yr )) $(( p+1 )) \
$(( yr+(p>2) )) $(( p>2 ? 1 : p+2 ))
调整年份,如果是第一季度或第四季度(p
为0或3)
然后将四分之一折叠到1..4范围内。
输出:
2020-11: 20203 20204 20211