2015-09-30 2 views
-2

У меня есть прецедент, где я должен предоставить начальный четверть ввода и конец квартала как два ввода в виде строки. Например, я дам 201501 (начало квартала) и 201602 (конец квартала) как два квартальных ввода. Метод даст результат на карте как предыдущий начальный квартал и конец квартала следующим образом: предыдущий стартовый квартал 201303 предыдущий конец квартала 201404 т. Е. Будет рассчитана разность кварталов между двумя периодами времени. Затем предыдущий квартал будет на 1 квартал раньше начального квартала ввода и будет выведена разница в квартале между двумя входами, после чего он будет вычитаться из предыдущего квартала, чтобы получить предыдущий начальный квартал.Рассчитать разницу в четвертом квартале в java

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

INPUTOUTPUT ввода Строка запуска 201501 конец строки 201602 Так разница в четверть 6 Ожидаемый результат Карта с ключом значения, как previousStartQuarter 201404 previousEndQuarter 201303

+0

Мне сложно следовать вашему описанию, и я не могу ответить на ваш вопрос. – Thomas

+0

Но приведенный выше код только изменил кварталы на предыдущие кварталы, но он должен фактически подсчитать разницу кварталов, а затем изменить предыдущий квартал до 1 квартала до начала начального квартала, а затем вычесть разницу кварталов за предыдущий квартал, чтобы получить предыдущий начало квартала –

+0

Просьба предоставить ясный пример ввода, ожидаемого выхода и токового выхода. Сейчас очень неясно, о чем вы спрашиваете. – Manu

ответ

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

Надеюсь, это поможет.

+0

Спасибо Ledonid ... это помогло с минимальным изменением .... U спас мое время ... –

2

java.time

Используйте java.time рамки, встроенный в Java 8 и более поздних версий. Вдохновленный Joda-Time, определенный JSR 310. A огромный улучшение по сравнению с старыми классами времени (java.util.Date/.Calendar и т. Д.).

Проект ThreeTen-Backport переносит эти классы на Java 6 & 7. Дальнейшая адаптация к Android по проекту ThreeTenABP.

ThreeTen-Extra

Кроме того, вы можете добавить ThreeTen-Extra библиотеку, которая расширяет java.time, чтобы обеспечить дополнительную функциональность, некоторые из которых в конечном счете, может быть добавлен в java.time. Чтобы использовать эту библиотеку, добавьте свой файл jar в свой проект (or use dependency tool, Maven etc.).

Quarter & YearQuarter

ThreeTen-Extra библиотека включает в себя Quarter и YearQuarter классы, которые вы могли бы найти особенно полезным. Безопаснее передавать объекты этих типов в свой код, а не использовать строки и цифры для представления ваших кварталов.

YearQuarter currentQuarter = YearQuarter.now (ZoneId.of("America/Montreal")); 

LocalDate

A 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. 

Half-Open

Вы, возможно, ожидали 18 месяцев и 6 кварталов в результате, а не 15 месяцев и 5 кварталов. Разница заключается в том, что обычно в работе с датой мы используем подход «Half-Open» для определения промежутка времени. Начало включительно в то время как окончание эксклюзивный. В повседневной жизни мы интуитивно иногда используем такой подход, например, классную комнату, обедающую с полудня до 13:00, где в первый момент 13:00:00.0 ученики должны сидеть в классе, а не на обед. Первый момент 12:00:00.0 - это когда звонит звонок и начинается обед, поэтому включительно, в то время как первый момент 13:00:00.0 на самом деле является классом времени, после обеда, поэтому эксклюзивный, с «полуденем к одному», Открыто.

Таким образом, в рамках подхода Half-Open этот период 2015-Q1/2016-Q2 работает с начала первой четверти и приближается, но не включает начало последней четверти. Я предлагаю придерживаться подхода Half-Open во всех ваших расчетах и ​​отчетности ради логического постоянства. Но, конечно, вы можете добавить его к результату, если вы так настаиваете.

Дамп для консоли.

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

раньше: 2015-Q1 позже: 2016-Q2 = месяцев: 15 делится на 3 = четверти: 5

Более подробное обсуждение см мои ответы на подобные вопросы here и here ,

+0

спасибо за ответ. Мы на JDK 1.7 –

+0

@ Gladiator9 Большая часть java.time портирован на Java 6 и 7 и на Android. См. Мои изменения в ответах. –

+0

К сожалению, в моем комментарии должно быть отмечено, что, хотя большая часть java.time обращена к Java 6 и 7 в проекте ThreeTen-Backport, проект ThreeTen-Extra с классом 'YearQuarter' * не * back-ported и действительно требует Java 8 или более поздней версии. Таким образом, мой ответ здесь * не может * использоваться в Java 6 или Java 7. –

Смежные вопросы