首页 > 解决方案 > 在 UNIX BASH 中计算上一个季度月和年的结束

问题描述

我对 Unix 很陌生,在 UNIX Bash 中计算上一个季度月末和年份时需要帮助

例如:- 如果今天的日期是2021-05-11,输出需要是032021(2021 年 3 月) 如果今天的日期是2021-01-31,输出需要是122020(2020 年 12 月)

我确实尝试了案例陈述,并且按预期工作。

m=$(date +%m)
y=$(date +%Y)

if [ $m -ge 1 -a $m -le 3 ]; then
     prev_qtr_mon=12
     prev_qtr_yr=`expr $y - 1`
elif [ $m -ge 4 -a $m -le 6 ]; then
     prev_qtr_mon=03
     prev_qtr_yr=$y
elif [ $m -ge 7 -a $m -le 9 ]; then
     prev_qtr_mon=06
     prev_qtr_yr=$y
elif [ $m -ge 10 -a $m -le 12 ]; then
     prev_qtr_mon=09
     prev_qtr_yr=$y
fi
echo ${prev_qtr_mon}
echo ${prev_qtr_yr}
acct_dt=${prev_qtr_mon}${prev_qtr_yr}
echo ${acct_dt}

有没有一种有效的方法来实现这一点而不是大案例陈述?你能帮忙吗?

标签: bashunix

解决方案


我认为这是一个关于数学的问题,而不是关于编程的问题。如果您的月份存储在 上m,如您的示例代码中所示,则该语句

((quartnum=M/4))

给你quartnum一个从 0 到 3 的数字,其中 0 是第一节,3 是最后一节。这是 m 实际所在的季度。

季度则少一个或多 3 个(取决于您喜欢如何看待它),并且您必须调整年度边界处的环绕。我会用 +3 而不是 -1 来避免使用负数进行模计算:

((prevquartnum=(quartnum+3)%4))

要将季度映射到一个月,您可以使用一个不太优雅但简单的表格:

quartmonth=(3 6 9 12) 

这表明第一季度(即 prevquartnum 0)与三月相关联,第二季度与六月相关联,依此类推。您现在得到所需的月份${quartmonth[$prevquartnum]}

我会用一个简单的方法来处理年份if:如果m是 3 或更少,你必须从年份中减去 1。否则,它只是当前年份。


推荐阅读