计算java

时间:2015-09-30 11:57:08

标签: java

我有一个用例,我必须提供输入开始季度和结束季度作为字符串的两个输入。例如,我将提供201501(开始季度)和201602(结束季度)作为两季度输入。该方法将地图中的输出作为上一个开始季度和结束季度,如下所示 上一季度为201303年 上一季度为201404 即首先计算两个时间段之间的四分之一差异。然后上一季度将是输入开始季度之前的1个季度,并且将导出两个输入之间的季度差异,然后将从上一个季度减去以获得前一个开始季度。

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 201404 previousEndQuarter 201303

2 个答案:

答案 0 :(得分:2)

java.time

使用Java 8及更高版本中内置的java.time框架。受JSR 310定义的Joda-Time的启发。对旧的日期时间类(java.util.Date/.Calendar等)的大量改进。

ThreeTen-Backport项目将这些类带入Java 6&amp; 7. ThreeTenABP项目进一步适应Android。

ThreeTen-EXTRA

此外,您可以添加扩展java.time的ThreeTen-Extra库以提供额外的功能,其中一些最终可能会添加到java.time中。要使用此库,请将其jar文件添加到项目中(or use dependency tool, Maven etc.)。

Quarter&amp; YearQuarter

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.

半开

你可能一直期待18个月和6个季度,而不是15个月和5个季度。不同之处在于,通常在日期时间工作中,我们使用“半开”方法来定义时间跨度。开头是包含,而结尾是独占。在日常生活中,我们直观地有时会使用这种方法,例如从中午到下午1点吃午餐的课堂,在13:00:00.0的第一时刻,学生应该坐在课堂上而不是去吃午餐。 12:00:00.0的第一个时刻是响铃和午餐开始的时候,所以包含,而13:00:00.0的第一个时刻实际是课时,午餐后,所以独家,“中午对齐”半开放。

因此,在半开放式方法中,2015年第一季度/ 2016年第二季度的这一跨度从第一季度开始到上一季度但不包括上一季度的开始。我建议在所有计算和报告中坚持半开放方法,以保持逻辑稳定性。但是,如果你坚持的话,当然你可以自由地添加一个。

转储到控制台。

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

更快:2015年第一季度到后期:2016年第二季度=月份:15除以3 =季度:5

有关详细讨论,请参阅我对类似问题的答案herehere

答案 1 :(得分:1)

以下代码应该可以满足您的需求:

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;
}

我希望它有所帮助。