2016-03-12 3 views
0

Я пишу приложение для получения данных прошлых запасов в java. Я использую календарь выбрал и от даты при расчете шести дней в среднем, однако это не работает из-за того, чтобы календарь такой же, как от несмотря вычитания дней в последнем ...Java Calendar Не меняя значения

private BigDecimal calcMovingAvg(int days, Calendar start){ 

    Calendar to = start; 

    int temp = Functions.weekdays(start.getTime(), days); 
    temp = temp - (2 * temp); 

    start.add(start.DAY_OF_MONTH, temp); 

    BigDecimal d = new BigDecimal(String.valueOf(days)); 

    List<HistoricalQuote> histQuotes = null; 
    try { 
     //Calling a method to get stock history between start and to date 
     histQuotes = stk.getHistory(start, to, Interval.DAILY); 
     System.out.println(histQuotes); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Start уже определена и работает

я сохранить = начать, чтобы иметь дату окончания, принимая предыдущие 6 дней для усреднения

Functions.weekdays вычисляет, сколько из этих 6 дней были фактически в рабочие дни (бизнес дней) и соответственно корректирует количество (темп - количество дней, необходимое для получения 6 рабочие дни).

При сравнении, я начинаю ==, почему начало не меняется?

+2

Похоже, что переменные 'to' и' start' относятся к одному и тому же объекту Calendar. –

+0

Спасибо! Использование метода .clone работало :) –

ответ

1
Calendar to = (Calendar) start.clone(); 

    int temp = Functions.weekdays(start.getTime(), days); 
    temp = temp - (2 * temp); 

    start.add(start.DAY_OF_MONTH, temp); 

Календарь использовался в том же экземпляре. Клонирование календаря решило проблему, поскольку она создала два отдельных объекта.

1

java.time

Эта работа легче с java.time структуры, построенной в Java 8 и более поздних версий. Избегайте использования старых классов времени, таких как java.util.Calendar, поскольку они, как оказалось, плохо разработаны и трудны.

неизменные объекты

The java.time классы используют immutable objects, создавая новые объекты на основе значений старых, а не меняется (»мутирует«) оригинал. Такой подход предотвращает возникшую проблему в Вопросе.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime now = ZonedDateTime.now(zoneId); 
ZonedDateTime later = now.plusWeeks(1); // Generates a second object without modifying the first. 

Преобразовать

Лучше всего, чтобы избежать старых классов полностью, включая java.util.Date и java.util.Calendar. Но если вам нужно, вы можете конвертировать.

Новые методы были добавлены в старые классы для облегчения преобразования.

Звоните GregorianCalendar::toZonedDateTime, чтобы сгенерировать эквивалент объекта ZonedDateTime. Я ваш Calendar объект действительно GregorianCalendar, downcast.

if(cal instanceof GregorianCalendar) { 
    GregorianCalendar gCal = (GregorianCalendar) cal; // Cast. Down-casting from interface to concrete class. 
    ZonedDateTime zdt = gCal.toZonedDateTime(); 
} 

Вызвать статический метод GregorianCalendar.from(ZonedDateTime), чтобы получить GregorianCalendar объект (который реализует интерфейс Calendar) из ZonedDateTime.

java.util.Calendar cal = java.util.GregorianCalendar.from(later); 
+0

Спасибо :) К сожалению, API, который я использую, требует Календарь –

+0

@MatthewCassar. Вы можете легко конвертировать. См. Раздел «Преобразовать», который я добавил для ответа. –

+0

Да, вы правы! Сожалею! Я буду использовать это в будущем –

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