【问题标题】:How to calculate current, previous and next year quarter in Shell Script?如何在 Shell Script 中计算当前、上一个和下一个季度?
【发布时间】:2023-12-06 22:43:02
【问题描述】:

我需要按照以下格式从当前 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 ))

【问题讨论】:

  • 考虑在bash date format quarter 上运行谷歌搜索,然后仔细阅读所有点击(包括相当多的 SE/SO 问答)

标签: shell ksh


【解决方案1】:

看到问题有几个不同的标志(bashkshperl),我猜 OP 对任何产生所需结果的解决方案都是开放的。

如果 OP 的 date 版本包括对 %q(季度)格式的支持:

read -r curr_year curr_qtr < <(date '+%Y %q')

如果date 的OP 版本不支持%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}"

在“今天”== 2020 年 11 月 2 日的情况下运行上述内容:

previous quarter : 20203
current  quarter : 20204
next     quarter : 20211

【讨论】:

  • 如果可能的话,请告诉我Shell脚本解决方案。 %q 不适合我。提前致谢。
  • @prabu ;更新以包含替代代码,以防 date 不支持 %q 格式
【解决方案2】:

您的问题有很多不同的标签,这是一个 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;

【讨论】:

  • 很抱歉。我刚刚包含 PERL 以获得更高的答案可能性。我现在已经删除了。如果可能的话,你能告诉我Shell Script解决方案吗?谢谢。
【解决方案3】:

将日期更改为 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))

【讨论】:

    【解决方案4】:

    使用可移植的 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
    

    【讨论】:

      最近更新 更多