簡體   English   中英

如何在java中顯示日歷

[英]How to display calendar in java

我目前正在做一個問題集,我必須創建一個顯示一年中所有月份的日歷,包括其中的月份中的日期。 但是,我對每個月第一行的間距有疑問。 在課堂上我們只學習了 switch 語句,if、else、while、do-while、for 循環

這是我的一個月中當前顯示的內容:

輸出圖片 圖片中沒有顯示我的輸入,但我寫的是 2016 年和 5 年開始的工作日。

所期望的輸出圖像 同樣,所期望的圖像。 我認為我的問題可能是我使用的方程式: int firstDayEachMonth = (daysMonth + firstDayYear)%7; 雖然老師把這個方程給了我們用,但是好像不行。

如您所見,第一行的空格一直在左側,它應該與指定的日期對齊,在這種情況下為 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();
        }
            
    }
}   

我們不能使用不同的庫(如Calendar ),只能使用掃描儀。

你能試試這個例子嗎? 我可以看到以下輸出:

   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();
        }
    }
}

由於這似乎是一項家庭作業,因此我不會費心為您提供正確的算法。 這將違背你——或其他有同樣問題的人——練習你的編程和分析技能的目的。

for (int space = 1; space <= firstDayEachMonth; space++)這一行中for (int space = 1; space <= firstDayEachMonth; space++)您可以完全忽略firstDayEachMonth結果並使用您的firstDayYear計數器。 該計數器具有一年中的起始工作日,並且它在經過的每一天遞增。 此外,有必要定義您的一周是從 0 還是 1 開始。

在這部分中,您已經在此處設置了本周末的換行符:

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

當你達到這個條件時,我會重置firstDayYear因為因為你使用它作為參數來設置你的空間,你永遠不會讓這個數字大於 7。這樣你就可以在日歷上正確布置每周的行,並且唯一的問題是在屏幕上以正確的格式呈現它。

當您像這樣打印星期System.out.println("Sun Mon Tue Wed Thu Fri Sat"); 請注意,您的名稱長度為 3 加 5 個空格。 所以這一行System.out.printf("%3d ", daysDisplay); 應該有一個寬度為 3 個空格的數字,這解釋了%3d的用法,加上 5 個空格。 在這種情況下,你有 6 個空格,你總是給你錯誤的偏移量,並且會在某些行上造成一些麻煩。

這些是我注意到的事情,我希望它有所幫助。 和平!

時間

我建議您使用現代 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();
            }
        }
    }
}

示例運行:

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  

Trail: Date Time 中了解有關現代日期時間 API 的更多信息。


* 出於任何原因,如果您必須堅持使用 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();

    }    

}
}

導入 java.util.Scanner;

公共類 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;
}

}

這是全年的日歷:


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("");
       }
     }
 }


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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM