Как я могу получить первый день месяца с помощью календаря Java?
Я написал программу, которая принимает данные от пользователя с указанием года и месяца, и пытаюсь распечатать месяц. Я могу напечатать месяц, и мой интервал работает. Однако я не могу заставить дни работать. Первый день месяца подходит для января 2018 года, но это неправильно, когда я делаю это для другого года или более позднего месяца. Я должен использовать календарь пакетов Java. Я напечатал код ниже, что-то не так с моим кодом? Есть ли способ это исправить?
import java.util.Calendar;
import.java.util.Scanner;
public class MonthCalendar {
public static void main(String[] args) {
int year; // year
int startDayOfMonth;
int spaces;
int month;
//Creates a new Scanner
Scanner scan = new Scanner(System.in);
//Prompts user to enter year
System.out.println("Enter a year: ");
year = scan.nextInt();
//Prompts user to enter month
System.out.println("Enter the number of the month: ");
month = scan.nextInt();
//Calculates the 1st day of that month
Calendar cal = Calendar.getInstance();
cal.set(year, month - 1, 1);
int day = cal.get(Calendar.DAY_OF_WEEK) - 1;
// months[i] = name of month i
String[] months = {
" ",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
// days[i] = number of days in month i
int[] days = {
0,
31,
28,
31,
30,
31,
30,
31,
31,
30,
31,
30,
31
};
// check for leap year
if ((((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) && month == 2)
days[month] = 29;
// print calendar header
// Display the month and year
System.out.println(" " + months[month] + " " + year);
// Display the lines
System.out.println("___________________________________________");
System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
// spaces required
spaces = (days[month + 1] + day) % 7;
// print the calendar
for (int i = 0; i < spaces; i++)
System.out.print(" ");
for (int i = 1; i <= days[month]; i++) {
System.out.printf(" %4d ", i);
if (((i + spaces) % 7 == 0) || (i == days[month])) System.out.println();
}
System.out.println();
}
1 ответ
Как уже отмечалось в комментариях, ваша проблема не в самом вычислении даты, а в том, как вы устанавливаете пробелы изначально:
spaces = (days[month+1] + day )%7;
Это должно быть вместо:
spaces = day;
Вам нужно только знать, в какой день недели вы находитесь, чтобы знать, как далеко вы должны продвинуться за первую неделю в отношении пробелов. Поэтому, если вы находитесь в воскресенье, вы продвигаетесь на 0 пробелов, но если вы во вторник, вы хотите продвинуться на 2 пробела, и так далее, и так далее. В конце вы продвигаетесь на столько пробелов, сколько вы начинаете в будний день. day
переменная содержит
Взгляните на код, дающий правильный вывод на февраль 2018 года в Ideone
Который дает следующий вывод:
Enter a year:
2018
Enter the number of the month:
2
February 2018
___________________________________________
Sun Mon Tue Wed Thu Fri Sat
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28