如何在 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;

看到这个问题有几个不同的标志(bashkshperl),我猜 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