如何在终端上正确打印月份日历

问题描述

您好,在此先感谢您的帮助。我有一个程序,应该根据月和年的用户输入来打印当前月日历。该程序可以正常工作,但是我在格式化方面遇到问题,并且该月的第一天未在适当的日期开始。

示例输出

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的答案所示,通过标准库可以更可靠地完成此操作。