GregorianCalendar не корректный вывод первых чисел месяца
Подскажите пожалуйста в чем ошибка. При выводе текущего месяца 1 число начинается со вторника.
public class Calendartest {
public static void main(String[] args) {
// построить объекты d текущей даты
GregorianCalendar d = new GregorianCalendar();
int today = d.get(Calendar.DAY_OF_MONTH);
int month = d.get(Calendar.MONTH);
// установить объект d на начало месяца
d.set(Calendar.DAY_OF_MONTH, -1);
int weekday = d.get(Calendar.DAY_OF_WEEK);
// получить первый день недели (воскресенье в США)
int firstDayOfWeek = d.getFirstDayOfWeek();
// определить отступ, требующийся в первой строке
int indent = 0;
while (weekday != firstDayOfWeek){
indent++;
d.add(Calendar.DAY_OF_MONTH, -1);
weekday = d.get(Calendar.DAY_OF_WEEK);
}
// вывести названия дней недели
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
do
{
System.out.printf("%3s ", weekdayNames[weekday]);
d.add(Calendar.DAY_OF_MONTH, 1);
weekday = d.get(Calendar.DAY_OF_WEEK);
}
while (weekday != firstDayOfWeek);
System.out.println();
for (int i = 0; i < indent; i++)
System.out.print(" ");
d.set(Calendar.DAY_OF_MONTH, 1);
do {
//вывести день недели
int day = d.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d", day);
// пометить текущий день знаком *
if (day == today) System.out.print("*");
else System.out.print(" ");
//продвинуть объект d к следующему дню
d.add(Calendar.DAY_OF_MONTH, 1);
weekday = d.get(Calendar.DAY_OF_WEEK);
//начать очередную неделю с новой строки
if (weekday == firstDayOfWeek) System.out.println();
}
while (d.get(Calendar.MONTH) == month);
// завершить цикл, когда в объекте d устанавливается
// первый день следующего месяца
// перевести строку, если требуется
if (weekday != firstDayOfWeek) System.out.println();
}
}
Ответы (2 шт):
Т.к. в библиотеке первый день недели не понедельник, то вам нужно поправить вычисление переменной indent. А также подкорректировать печатание "пустых" дней в первой строке (каждый день недели в календаре занимает у вас четыре символа, а на пустой день вы выводите всего один, понятно, что их не хватает). Поставьте для начала туда, например, точку, чтобы было нагляднее, сколько пустых дней выводится. После этого будет проще корректировать вычисление indent.
for (int i = 0; i < indent; i++)
System.out.print(" . ");
Для определения indent цикл не нужен, ведь уже есть Calendar.DAY_OF_WEEK, нужно к нему просто прибавить/отнять какое-то фиксированное число.
Такая формула у меня на сегодня работает:
indent = today % 7 + weekday - 1;
Но нужно ее проверить на понедельнике и воскресенье.
public static void main(String[] args) {
// построить объекты d текущей даты
GregorianCalendar d = new GregorianCalendar();
int today = d.get(Calendar.DAY_OF_MONTH);
int month = d.get(Calendar.MONTH);
// установить объект d на начало месяца
d.set(Calendar.DAY_OF_MONTH, 1);
int weekday = d.get(Calendar.DAY_OF_WEEK);
// получить первый день недели (воскресенье в США)
int firstDayOfWeek = d.getFirstDayOfWeek();
// определить отступ, требующийся в первой строке
int indent = 1;
while (weekday != firstDayOfWeek){
indent++;
d.add(Calendar.DAY_OF_MONTH, -1);
weekday = d.get(Calendar.DAY_OF_WEEK);
}
// вывести названия дней недели
String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();
do
{
System.out.printf("%3s ", weekdayNames[weekday]);
d.add(Calendar.DAY_OF_MONTH, 1);
weekday = d.get(Calendar.DAY_OF_WEEK);
}
while (weekday != firstDayOfWeek);
System.out.println(" ");
for (int i = 1; i < indent; i++)
System.out.printf("%3s ", " ");
d.set(Calendar.DAY_OF_MONTH, 1);
do {
//вывести день недели
int day = d.get(Calendar.DAY_OF_MONTH);
System.out.printf("%3d", day);
// пометить текущий день знаком *
if (day == today) System.out.print("*");
else System.out.print(" ");
//продвинуть объект d к следующему дню
d.add(Calendar.DAY_OF_MONTH, 1);
weekday = d.get(Calendar.DAY_OF_WEEK);
//начать очередную неделю с новой строки
if (weekday == firstDayOfWeek) System.out.println();
}
while (d.get(Calendar.MONTH) == month);
// завершить цикл, когда в объекте d устанавливается
// первый день следующего месяца
// перевести строку, если требуется
if (weekday != firstDayOfWeek) System.out.println();
}
}
