在java中计算年季度差

  • 本文关键字:季度差 计算 java java
  • 更新时间 :
  • 英文 :


我有一个用例,我必须提供输入开始季度和结束季度作为两个输入字符串。例如,我将提供201501(开始季度)和201602(结束季度)作为两个季度输入。该方法将在映射中给出前一个开始季度和结束季度的输出,如下所示上一季度为201303年上一季度为201404年首先计算两个时间段之间的季度差。然后上一个季度将比输入的开始季度早一个季度,两个输入之间的季度差将被导出,然后从上一个季度减去它,得到上一个开始季度。

public static Map<String,String> getPreviousQuarter( String  start,String end){
    String prevStartQuarter=    calulatePreviousQuarter(start);
    String prevEndQuarter=calulatePreviousQuarter(end);
    Map<String,String> returnMap = new HashMap<String,String>();
    returnMap.put("previousStartQuarter", prevStartQuarter);
    returnMap.put("previousEndQuarter",prevEndQuarter);
    System.out.println("the reurnmap is" +returnMap);
    return returnMap;
    }
        private static String calulatePreviousQuarter(String input)
        {
            int yearVal=0;
            String year = input.substring(0,4);
            String quarter = input.substring(4);
            if(quarter.equalsIgnoreCase("01"))
            {
                 yearVal =  Integer.valueOf(year)-1;
                 quarter ="04";
            }
            else
            {
                yearVal = Integer.valueOf(year);
                switch(quarter)
                {
                case "02":
                    quarter ="01";  
                    break;
                case "03":
                    quarter ="02";  
                    break;
                case "04":
                    quarter ="03";  
                    break;
                    default:
                        break;
                }
            }
            return String.valueOf(yearVal)+quarter;
        }

输入输出输入字符串开始201501字符串结束201602所以四分之一差是6预期输出映射键,值为previousStartQuarter 201404previousEndQuarter 201303

java.time

使用java。时间框架内置于Java 8及以后版本中。受JSR 310定义的Joda-Time启发。对旧的日期时间类(java.util.Date/。日历等)。

ThreeTen-Backport项目将这些类引入Java 6 &7. 通过ThreeTenABP项目进一步适应Android。

<标题> ThreeTen-Extra h1> 外,您可以添加扩展java的ThreeTen-Extra库。提供额外功能的时间,其中一些可能最终会添加到java.time中。要使用这个库,将它的jar文件添加到您的项目中(或者使用依赖工具,Maven等)。

Quarter &YearQuarter h1> ThreeTen-Extra库包括QuarterYearQuarter类,您可能会发现它们特别有用。在代码中传递这些类型的对象比使用字符串和数字来表示硬币更安全。
YearQuarter currentQuarter = YearQuarter.now ( ZoneId.of( "America/Montreal" ) );

LocalDate

LocalDate是一个只有日期的值,没有时间和时区。但是要确定"今天",我们需要一个时区,因为世界各地的日期因时区而异。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
YearQuarter currentQuarter = YearQuarter.from( today );

加、减、比较

你可以做四分之一,加,减,和更多的数学。

YearQuarter nextQuarter = currentQuarter.plusQuarters( 1 );
YearQuarter previousQuarter = currentQuarter.minusQuarters( 1 );

我们可以将四分之一之间的差计算为四分之一的数量。我看不出有什么直接的方法,但是我们可以用月数除以3,因为一个季度总是3个月。

YearQuarter sooner = YearQuarter.of ( 2015 , 1 );
YearQuarter later = YearQuarter.of ( 2016 , 2 );

我们可以用下面两行所示的两种方法中的任何一种来获得月数,第一行被注释掉了。

//  Months months = Months.between ( sooner.atDay ( 1 ) , later.atDay ( 1 ) );
long months = ChronoUnit.MONTHS.between ( sooner.atDay ( 1 ) , later.atDay ( 1 ) );

结果是15个月,我们除以3得到5,五个季度过去了。

    long quarters = ( months / 3 ); // In real work I would define a static constant "MONTHS_PER_QUARTER" to replace the literal “3” seen here.
<标题>半开的h1> 可能预期的结果是18个月零6个季度,而不是15个月零5个季度。区别在于,在日期时间工作中,我们通常使用"半开放"方法来定义时间跨度。开头包含,结尾不包含。在日常生活中,我们有时会直观地使用这种方法,比如一个教室从中午到下午1点吃午饭,在13:00:00.0的第一个时刻,学生们被期望坐在教室里而不是出去吃午饭。12:00:00.0的第一个时刻是上课铃响,午餐开始的时候,所以包含,而13:00:00.0的第一个时刻实际上是午饭后的上课时间,所以排他,"noon-to-one"是Half-Open。

因此,在Half-Open方法中,2015-Q1/2016-Q2的跨度从第一季度开始,一直到但不包括最后一个季度开始。我建议在你所有的计算和报告中都坚持半开放的方法,以保持逻辑上的一致性。当然,如果你坚持的话,你可以在结果中添加一个。

转储到控制台

System.out.println ( "sooner: " + sooner + " to later: " + later + " = months: " + months + " divided by 3 = quarters: " + quarters );

早:2015-Q1到晚:2016-Q2 =月:15除以3 =季度:5

有关更多讨论,请参阅我在这里和这里对类似问题的回答。

下面的代码应该满足您的要求:

public static Map<String, String> getPreviousQuarter(String start,
        String end) {
    String prevStartQuarter = calulatePreviousQuarter(start);
    String prevEndQuarter = calulatePreviousQuarter(end);
    int len=1;
    while(!start.equals(prevEndQuarter)){
        prevEndQuarter=calulatePreviousQuarter(prevEndQuarter);
        len++;
    }
    String tmp=prevStartQuarter;
    for(int i=0;i<len;i++){
        tmp=calulatePreviousQuarter(tmp);
    }
    Map<String, String> returnMap = new HashMap<String, String>();
    returnMap.put("previousStartQuarter", prevStartQuarter);
    returnMap.put("previousEndQuarter", tmp);
    System.out.println("the reurnmap is" + returnMap);
    return returnMap;
}
private static String calulatePreviousQuarter(String input) {
    int yearVal = 0;
    String year = input.substring(0, 4);
    String quarter = input.substring(4);
    if (quarter.equalsIgnoreCase("01")) {
        yearVal = Integer.valueOf(year) - 1;
        quarter = "04";
    } else {
        yearVal = Integer.valueOf(year);
        switch (quarter) {
        case "02":
            quarter = "01";
            break;
        case "03":
            quarter = "02";
            break;
        case "04":
            quarter = "03";
            break;
        default:
            break;
        }
    }
    return String.valueOf(yearVal) + quarter;
}

最新更新