简体   繁体   English

如何在java中显示日历

[英]How to display calendar in java

I'm currently doing a problem set where I have to create a calendar displaying all the months of a year, including the days of the month within it.我目前正在做一个问题集,我必须创建一个显示一年中所有月份的日历,包括其中的月份中的日期。 However I'm having issues with the spacing of the first line of each month.但是,我对每个月第一行的间距有疑问。 In class we have only learned switch statements, if, else, while, do-while, for loops在课堂上我们只学习了 switch 语句,if、else、while、do-while、for 循环

Here is what is currently displayed for one of my months:这是我的一个月中当前显示的内容:

Image of output In the picture is doesn't show my inputs, but what I wrote was 2016 for the year and 5 for the weekday that the year starts in.输出图片 图片中没有显示我的输入,但我写的是 2016 年和 5 年开始的工作日。

Image of output of what what is desired Again, a picture of what is desired.所期望的输出图像 同样,所期望的图像。 I think my problem is possibly the equation I used which is: int firstDayEachMonth = (daysMonth + firstDayYear)%7;我认为我的问题可能是我使用的方程式: int firstDayEachMonth = (daysMonth + firstDayYear)%7; though the teacher gave this equation to us to use, but it seems like it doesn't work.虽然老师把这个方程给了我们用,但是好像不行。

As you can see the spaces on the first line is all the way to the left, it should be aligned with the designated dates, in this case for January, Jan 1st should align on Friday and Jan 2nd should align with Saturday but it is currently on Sunday and Monday.如您所见,第一行的空格一直在左侧,它应该与指定的日期对齐,在这种情况下为 1 月,1 月 1 日应与周五对齐,1 月 2 日应与周六对齐,但目前是周日和周一。

    import java.util.Scanner;

    public class DisplayCalendar
       {
        public static void main(String[] args)
        {
        //Create a new scanner 
        Scanner input = new Scanner(System.in);
        
        // Prompt user to enter year 
        System.out.print("Enter a year: ");
        int year = input.nextInt();
        
        // Prompt user to enter first day of the year
        System.out.print("Enter the weekday that the year starts: ");
        int firstDayYear = input.nextInt();
        
        // A for loop that prints out each month
        for(int month = 1; month <= 12; month++)
        {
            // Set the value of the amount of days in a month
            int daysMonth = 0;
            
            // Set value of the month 
            String monthDisplay = "";   
            
            // Find name of each month and number of days
            switch(month)
            {
                case 1: monthDisplay = "January"; 
                    daysMonth = 31;
                    break;
                
                case 2: 
                    monthDisplay = "February";
                    int leapYear = 0;
                    while (leapYear > -1)
                    {   
                        // Count all years that are divisible by 4 to be a leap year.
                        leapYear += 4;
                        
                        // If the year inputted is a leap year, the days of the month will be 29.
                        if (year == leapYear)
                        {
                            daysMonth = 29;
                            break;
                        }
                        
                        else 
                        {
                            daysMonth = 28;
                        }
                    }
                    break;

                case 3: monthDisplay = "March";
                    daysMonth = 31;
                    break;
                
                case 4: monthDisplay = "April";
                    daysMonth = 30;
                    break; 
                
                case 5: monthDisplay = "May";
                    daysMonth = 31;
                    break;
                
                case 6: monthDisplay = "June";
                    daysMonth = 30;
                    break; 
                
                case 7: monthDisplay = "July";
                    daysMonth = 31;
                    break;
                
                case 8: monthDisplay = "August";
                    daysMonth = 31;
                    break;
                
                case 9: monthDisplay = "September";
                    daysMonth = 30;
                    break;
            
                case 10: monthDisplay = "October";
                    daysMonth = 31;
                    break;
                
                case 11: monthDisplay = "November";
                    daysMonth = 30;
                    break;
                
                case 12: monthDisplay = "December";
                    daysMonth = 31;
                    break; 
                
                // If the month is not recognized, dialog box will be displayed, and then exits program. 
                default : System.out.print("Invalid: Your month is not recognized. ");
                    System.exit(0); 

            }
            // Display the month and year
            System.out.println("                      "+ monthDisplay + " " + year);
            
            // Display the lines
            System.out.println("_____________________________________");
            
            // Display the days of the week
            System.out.println("Sun     Mon     Tue     Wed     Thu     Fri     Sat");
            
            // Print spaces depending on the day the month starts.
            int firstDayEachMonth = (daysMonth + firstDayYear)%7;
            for (int space = 1; space <= firstDayEachMonth; space++)
                System.out.print("   ");

            // Print the days 
            for (int daysDisplay = 1; daysDisplay <= daysMonth; daysDisplay++)
            {
                if (firstDayYear%7 == 0)
                    System.out.println();
                
                System.out.printf("%3d      ", daysDisplay);
                firstDayYear += 1;
            }
            System.out.println();
        }
            
    }
}   

We can't use the different libraries (like Calendar ), only keeping with scanner.我们不能使用不同的库(如Calendar ),只能使用扫描仪。

Can you try this example?你能试试这个例子吗? I can see the following output:我可以看到以下输出:

   February 2016
   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
package general;

import java.util.Scanner;

public class DisplayCalendar {

    public static void main(String[] args) {
        int Y = 2016;    // year
        int startDayOfMonth = 5;
        int spaces = startDayOfMonth;

        // startDayOfMonth

        // months[i] = name of month i
        String[] months = {
                "",                               // leave empty so that we start with months[1] = "January"
                "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
            };

            for (int M = 1; M <= 12; M++) {

            // check for leap year
            if  ((((Y % 4 == 0) && (Y % 100 != 0)) ||  (Y % 400 == 0)) && M == 2)
                days[M] = 29;

            
            // print calendar header
            // Display the month and year
            System.out.println("          "+ months[M] + " " + Y);

            // Display the lines
            System.out.println("_____________________________________");
            System.out.println("   Sun  Mon Tue   Wed Thu   Fri  Sat");

            // spaces required
               spaces = (days[M-1] + spaces)%7;
            
            // print the calendar
            for (int i = 0; i < spaces; i++)
                System.out.print("     ");
            for (int i = 1; i <= days[M]; i++) {
                System.out.printf(" %3d ", i);
                if (((i + spaces) % 7 == 0) || (i == days[M])) System.out.println();
            }
            
            System.out.println();
        }
    }
}

Since this seems to be a homework, I won't bother to give you the right algorithm.由于这似乎是一项家庭作业,因此我不会费心为您提供正确的算法。 That would defeat the purpose of you - or other people with the same problem - practice your programming and analytical skills.这将违背你——或其他有同样问题的人——练习你的编程和分析技能的目的。

In this line for (int space = 1; space <= firstDayEachMonth; space++) you can totally ignore firstDayEachMonth result and use your firstDayYear counter.for (int space = 1; space <= firstDayEachMonth; space++)这一行中for (int space = 1; space <= firstDayEachMonth; space++)您可以完全忽略firstDayEachMonth结果并使用您的firstDayYear计数器。 This counter has the starting weekday of the year and it is incremented each day that passes.该计数器具有一年中的起始工作日,并且它在经过的每一天递增。 Also, it is necessary to define if your week starts in 0 or 1.此外,有必要定义您的一周是从 0 还是 1 开始。

In this part, you are already setting a line break for the end of the week here in:在这部分中,您已经在此处设置了本周末的换行符:

if (firstDayYear%7 == 0)
   System.out.println();

I would reset firstDayYear when you reach this condition because since you are using it as parameter to set your spaces, you'll never have this number going greater than 7. This way you have each week line laid out correctly on the calendar and the only problem would be presenting it in the right format on the screen.当你达到这个条件时,我会重置firstDayYear因为因为你使用它作为参数来设置你的空间,你永远不会让这个数字大于 7。这样你就可以在日历上正确布置每周的行,并且唯一的问题是在屏幕上以正确的格式呈现它。

When you print the days of the week header like this System.out.println("Sun Mon Tue Wed Thu Fri Sat");当您像这样打印星期System.out.println("Sun Mon Tue Wed Thu Fri Sat"); mind that you have the names with length 3 plus 5 whitespaces.请注意,您的名称长度为 3 加 5 个空格。 So this line System.out.printf("%3d ", daysDisplay);所以这一行System.out.printf("%3d ", daysDisplay); should have a digit with a width of 3 spaces, which explains the use of %3d , plus 5 whitespaces.应该有一个宽度为 3 个空格的数字,这解释了%3d的用法,加上 5 个空格。 In this case you have 6 whitespace that you always give you the wrong offset and will cause some hell on some lines.在这种情况下,你有 6 个空格,你总是给你错误的偏移量,并且会在某些行上造成一些麻烦。

These are the things I've noticed and I hope it helps.这些是我注意到的事情,我希望它有所帮助。 Peace!和平!

java.time时间

I recommend you do it using the modern Date-Time API * which has been part of the standard library since Java SE 8.我建议您使用现代 Date-Time API * 来完成,它自 Java SE 8 以来一直是标准库的一部分。

import java.time.LocalDate;
import java.time.YearMonth;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // Test harness
        Scanner input = new Scanner(System.in);
        System.out.print("Please enter a month between 1 and 12 (e.g. 5): ");
        int m = input.nextInt();

        System.out.print("Please enter a full year (e.g. 2018): ");
        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();
        if (dayValue != 7)
            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();
            }
        }
    }
}

A sample run:示例运行:

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  

Learn more about the modern Date-Time API from Trail: Date Time .Trail: Date Time 中了解有关现代日期时间 API 的更多信息。


* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project . * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和您的 Android API 工作级别仍然不符合 Java-8,请检查 通过 desugaringHow to use ThreeTenABP in Android Project 可用的 Java 8+ APIs

public class Exercice5_29DisplayCalenderDay {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
      //Create a new scanner 
    Scanner input = new Scanner(System.in);

    // Prompt user to enter year 
    System.out.print("Enter a year: ");
    int year = input.nextInt();

    // Prompt user to enter first day of the year
    System.out.println("Enter the weekday that the year starts: ");
    int day = input.nextInt();
    int dayCounter = day;
     int nbrOfDays = 0;
     String  monthx = ""; 
    for (int month= 1; month <=12; month++)
    {

                        // Switch to chose the month 
              switch (month)
             {
                  case 1: monthx = "January";
                             nbrOfDays = 31;
                             break;
                  case 2: monthx = "February";
                                     if ( year % 4 == 0 && year % 100 !=0 || year % 400 == 0)
                      {
                             nbrOfDays = 29;
                             break;
                      }
                                     else
                         {  nbrOfDays = 28;
                             break;
                         }
                 case 3: monthx = "March";
                             nbrOfDays = 31;
                             break; 
                  case 4: monthx = "April";
                             nbrOfDays = 30;
                             break; 
                         case 5: monthx = "May";
                             nbrOfDays = 31;
                             break;

                         case 6: monthx = "June";
                             nbrOfDays = 30;
                             break;
                          case 7: monthx = "July";
                             nbrOfDays = 31;
                             break;
                          case 8: monthx = "August";
                             nbrOfDays = 31;
                             break;
                    case 9: monthx = "September";
                             nbrOfDays = 30;
                             break; 
                    case 10: monthx = "October";
                             nbrOfDays = 31;
                             break; 
                    case 11: monthx = "November";
                             nbrOfDays = 30;
                             break; 
                         case 12: monthx = "December";
                             nbrOfDays = 31;
                             break;                  
             }

                 System.out.printf("%15s %d  \n", monthx , year);
                 System.out.println("----------------------------");
                 System.out.printf("%s %s %s %s %s %s %s\n ", "Sun","Mon","Tue", "Wed", "Thu","Fri","Sat");

                 for (int space =1; space<=day; space++) 
                 {
                     System.out.printf("%4s", "    ");
                 }
                 for (int i = 1; i <=nbrOfDays; i++)
                 {
                    dayCounter++;
                    if ( dayCounter% 7==0)
                     System.out.printf("%- 4d\n", i);
                    else
                    System.out.printf("%-4d", i);

                 }
                 day = (day + nbrOfDays)%7;

                         System.out.println();

    }    

}
}

import java.util.Scanner;导入 java.util.Scanner;

public class DisplayCalendar {公共类 DisplayCalendar {

public static void main(String[] args) {
    String Months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
    int numday[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    Scanner in = new Scanner(System.in);
    System.out.println("enter the year");
    int year = in.nextInt();
    if ((((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))) {
        numday[1] = 29;
    }
    System.out.println("enter the day start the year ");
    int day = in.nextInt();
    for (int i = 1; i <= 12; i++) {
        System.out.println("\t" + Months[i - 1]+" "+ year);
        System.out.println("ـــــــــــــــــــــــــ");
        System.out.printf("%-4s%-4s%-4s%-4s%-4s%-4s%-4s\n","Sun","Mon","Tue","Wed","Thu","Fri","Sat");
        day = manh(day, numday[i - 1]);
    }

}

public static int manh(int day, int numday) {
    int a[][] = new int[6][7];
    int counter = 1;
    int j = 0;
    for (int i = 0; i < 6; i++) {
        for (j = day; j < 7; j++) {
            a[i][j] = counter;
            day++;
            counter++;
            if (counter == numday + 1) {
                break;
            }
        }
        day = 0;
        if (counter == numday + 1) {
            break;
        }

    }
    for (int i = 0; i < 6; i++) {
        for (int f = 0; f < 7; f++) {
            System.out.printf("%-4s", a[i][f] == 0 ? "" : a[i][f]);
        }
        System.out.println();

    }
    int dayret = j + 1;
    return dayret >= 7 ? 0 : dayret;
}

} }

This is the Calendar for the whole year:这是全年的日历:


public class Main { 

    /***************************************************************************
     *  Given the month, day, and year, return which day
     *  of the week it falls on according to the Gregorian calendar.
     *  For month, use 1 for January, 2 for February, and so forth.
     *  Returns 0 for Sunday, 1 for Monday, and so forth.
     ***************************************************************************/
     public static int day(int month, int day, int year) {
         int y = year - (14 - month) / 12;
         int x = y + y/4 - y/100 + y/400;
         int m = month + 12 * ((14 - month) / 12) - 2;
         int d = (day + x + (31*m)/12) % 7;
         return d;
     }
 
     // return true if the given year is a leap year
     public static boolean isLeapYear(int year) {
         if  ((year % 4 == 0) && (year % 100 != 0)) return true;
         if  (year % 400 == 0) return true;
         return false;
     }
 
     public static void main(String[] args) {
         int[] a = {1,2,3,4,5,6,7,8,9,10,11,12};   // month (Jan = 1, Dec = 12)
         int year = 2022; // year
         
         // months[i] = name of month i
         String[] months = {
             "",                               // leave empty so that months[1] = "January"
             "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
         };
         
         for(int month : a){
 
         // check for leap year
         if (month == 2 && isLeapYear(year)) days[month] = 29;
 
 
         // print calendar header
         System.out.println("   " + months[month] + " " + year);
         System.out.println(" S  M Tu  W Th  F  S");
 
         // starting day
         int d = day(month, 1, year);
 
         // print the calendar
         for (int i = 0; i < d; i++)
             System.out.print("   ");
         for (int i = 1; i <= days[month]; i++) {
             System.out.printf("%2d ", i);
             if (((i + d) % 7 == 0) || (i == days[month])) System.out.println();
         }
         System.out.println("");
       }
     }
 }


Reference: https://introcs.cs.princeton.edu/java/21function/Calendar.java.html参考: https ://introcs.cs.princeton.edu/java/21function/Calendar.java.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM