Неправильная дата GregorianCalendar

326
24 августа 2017, 19:40

Есть кусок кода:

private void changeCalendarDay(int daysCount,int field){
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.set(year,month,day);
    calendar.add(field,daysCount);
    year = calendar.get(GregorianCalendar.YEAR);
    month = calendar.get(GregorianCalendar.MONTH);
    day = calendar.get(GregorianCalendar.DATE);
}

Этот метод вызывается по нажатию на кнопку вот код вызова:

addDateButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        changeCalendarDay(1,GregorianCalendar.DATE);
        updateDateEditText();
    }
});

Проблема в том, что когда я на неё нажимаю, то всё работает до 30.08.2017 числа, если нажать на кнопку ещё раз, то вместо 31.08.2017 дата меняется на 01.09.2017. И такая проблема с другими месяцами... Что я делаю не так?

Вывод даты производится методом updateDateEditText():

private void updateDateEditText(){
    if(month<10) {
        currentDateEditText.setText(day+".0"+month+"."+year);
    } else {
        currentDateEditText.setText(day+"."+month+"."+year);
    }
}
Answer 1

Месяцы (поле Calendar.MONTH) нумеруются с нуля. Соответственно, 0 — это январь, а 8 — сентябрь.

Из документации:

Field number for get and set indicating the month. This is a calendar-specific value. The first month of the year in the Gregorian and Julian calendars is JANUARY which is 0; ..

Для преобразования даты в строку в заданном формате проще использовать SimpleDateFormat:

 SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
 String text = sdf.format(calendar.getTime());
Answer 2

В данном случае попробуйте воспользоваться SimpleDateFormat, он на много удобен:

import java.text.SimpleDateFormat;
import java.util.*;
public class DateTest
{
    private static final Logger LOG = Logger.getLogger(DateTest.class.getName());
    public static void main(String[] args)
    {
        System.out
                .println(
                        new SimpleDateFormat("dd.MM.yyyy")
                        .format(
                                changeCalendarDay(5, Calendar.DAY_OF_MONTH)
                        )
                );
    }
    private static Date changeCalendarDay(int daysCount, int field)
    {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.set(2017, 10, 10);
        calendar.add(field, daysCount);
        return calendar.getTime();
    }
}
READ ALSO
Can&#39;t scale and move components in IntelliJ [требует правки]

Can't scale and move components in IntelliJ [требует правки]

I can't scale and move components in IntelliJ with its GridLayoutThe problem is when I move/scale components they don't move to the exact place

219
Как добавить лишную строку в TextVIew

Как добавить лишную строку в TextVIew

Хочу добавить одну лишную строчкуЕсли в TextView указать maxLines = 4

201
RandomAccessFile Java, добавление/замена строк в файле txt

RandomAccessFile Java, добавление/замена строк в файле txt

Здравствуйте! Задача добавить следующую строку после определенной, но у меня почему то выходит именно замена следующей строки, но самое главное...

376
Spring OAuth повторный запрос информации

Spring OAuth повторный запрос информации

Я пытаюсь сделать OAuth 20 авторизацию с помощью стандартных средств Spring Security OAuth, никаких дополнительных настроек не применяется, конфигурация...

184