微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Shell Script中计算当前,上一年和明年的季度?

如何解决如何在Shell Script中计算当前,上一年和明年的季度?

我需要按照以下格式从当前系统日期计算当前,上一年和下一年的季度。

根据当前日期(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 ))

调整年份,如果是第一季度或第四季度(p为0或3) 然后将四分之一折叠到1..4范围内。

输出:

2020-11:    20203   20204   20211

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。