如何在 Shell 脚本中计算当前、上一年和下一年的季度?
How to calculate current, previous and next year quarter in Shell Script?
我需要根据以下格式的当前 sysdate 计算当前、上一年和下一年的季度。
根据当前日期(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 ))
如果在第 1 或第 4 季度(p
为 0 或 3),则调整年份
并将四分之一折叠到范围 1..4.
输出:
2020-11: 20203 20204 20211
我需要根据以下格式的当前 sysdate 计算当前、上一年和下一年的季度。
根据当前日期(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 ))
如果在第 1 或第 4 季度(p
为 0 或 3),则调整年份
并将四分之一折叠到范围 1..4.
输出:
2020-11: 20203 20204 20211