问题描述
您好,在此先感谢您的帮助。我有一个程序,应该根据月和年的用户输入来打印当前月日历。该程序可以正常工作,但是我在格式化方面遇到问题,并且该月的第一天未在适当的日期开始。
示例输出:
recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView,int newState) {
super.onScrollStateChanged(recyclerView,newState);
//some code when initially scrollState changes
}
@Override
public void onScrolled(RecyclerView recyclerView,int dx,int dy) {
super.onScrolled(recyclerView,dx,dy);
//Some code while the list is scrolling
linearlayoutmanager lManager = (linearlayoutmanager) recycler.getLayoutManager();
int firstElementPosition = lManager.findFirstVisibleItemPosition();
}
});
2020年10月将在星期四开始,但是 October 2020
------------------------------
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 29 30 31
打印在1
下。 10月4日是星期日,因此这是新行开始的地方。
请参阅附件我的代码。再次感谢
Mon
解决方法
我建议您使用modern date-time API进行操作。从 Trail: Date Time 了解有关现代日期时间API的更多信息。
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in); // Scan for user input
System.out.print("Please enter a month between 1 and 12 (e.g. 5): "); // Prompt user to enter month
int m = input.nextInt();
System.out.print("Please enter a full year (e.g. 2018): "); // Prompt user to enter year
int y = input.nextInt();
printMonth(y,m);
}
static void printMonth(int year,int month) {
YearMonth ym = YearMonth.of(year,month);
System.out.println("Sun Mon Tue Wed Thu Fri Sat");
int counter = 1;
// Get day of week of 1st date of the month and print space for as many days as
// distant from SUN
int dayValue = LocalDate.of(year,month,1).getDayOfWeek().getValue();
for (int i = 0; i < dayValue; i++,counter++) {
System.out.printf("%-4s","");
}
for (int i = 1; i <= ym.getMonth().length(ym.isLeapYear()); i++,counter++) {
System.out.printf("%-4d",i);
// Break the line if the value of the counter is multiple of 7
if (counter % 7 == 0) {
System.out.println();
}
}
}
}
示例运行:
Please enter a month between 1 and 12 (e.g. 5): 9
Please enter a full year (e.g. 2018): 2020
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 29 30
注意:在Formatter上了解有关格式化打印的信息。
,我认为您的getStartDay
方法不会返回您期望的星期几。它似乎在星期三返回1到星期二返回7。例子:
Month Start day of week getStartDay()
------------------------------------------------
July 2020 Wednesday 1
August 2020 Saturday 4
September 2020 Tuesday 7
October 2020 Thursday 2
您的代码中可能还会存在一两个问题,但是我认为您应该首先解决这一基本问题。
这是一项很好的练习,您肯定在学习。对于生产代码,永远不会实施Zeller算法或任何其他算法来查找几个月和一周中的几天。如Arvind Kumar Avinash的答案所示,通过标准库可以更可靠地完成此操作。