Есть кусок кода:
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);
}
}
Месяцы (поле 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());
В данном случае попробуйте воспользоваться 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();
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей