簡體   English   中英

設置公歷但一周中的日期不正確

[英]Setting Gregorian Calendar But Not Getting Correct Day of Week

在程序的一部分中,我通過將日期設置為用戶指定的日期來操縱公歷。 我能夠打印正確的月,日和年,但是它沒有顯示正確的星期幾。 有人可以指出發生了什么嗎?

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Map.Entry;


public class MyCalendar {

    GregorianCalendar calendar;
    private HashMap<GregorianCalendar, Event> myCalHash;
    GregorianCalendar dayCounter = new GregorianCalendar(); // capture today
    Scanner sc = new Scanner(System.in);
    static MONTHS[] arrayOfMonths = MONTHS.values();
    static DAYS[] arrayOfDays = DAYS.values();

    MyCalendar(){
        calendar = new GregorianCalendar();
        myCalHash = new HashMap<GregorianCalendar, Event>();
    }

    public HashMap<GregorianCalendar, Event> getMyCalHash(){
        return myCalHash;
    }

    public void setMyCalHash(HashMap<GregorianCalendar, Event> myCalHash) {
        this.myCalHash = myCalHash;
    }

    public void viewCalendar() {

            System.out.print("[D]ay view or [M]view? ");
            char userChoice = sc.next().charAt(0);
            if(Character.toUpperCase(userChoice) == 'D'){ dayView(); }
            else if(Character.toUpperCase(userChoice) == 'M'){ monthView(); }
            else{
                System.out.println("Invalid choice.");
            }
    }   

        public void dayView(){
            //print day calendar
            //GregorianCalendar dayCounter = new GregorianCalendar(); // capture today

            System.out.println(arrayOfDays[calendar.get(Calendar.DAY_OF_WEEK) - 1] + ", " +  arrayOfMonths[calendar.get(Calendar.MONTH)] 
                    + " " + calendar.get(Calendar.DATE) + ", " + calendar.get(Calendar.YEAR));
            System.out.print("[P]revious or [N]ext or [M]ain menu ? ");
            char userChoice = sc.next().charAt(0);
            if(Character.toUpperCase(userChoice) == 'P'){
                calendar.add(Calendar.DAY_OF_MONTH, -1);
                dayView();
            }
            else if(Character.toUpperCase(userChoice) == 'N'){
                calendar.add(Calendar.DAY_OF_MONTH, 1);
                dayView();
            }
            else if(Character.toUpperCase(userChoice) == 'M'){
                return;
            }
            else{
                System.out.println("Invalid choice.");
                return;
            }
        }
        public void monthView(){
            //print month calendar
            int formatCounter = 0;
            dayCounter.set(Calendar.DAY_OF_MONTH, 1);

            System.out.println("    " + arrayOfMonths[calendar.get(Calendar.MONTH) ] + " " + calendar.get(Calendar.YEAR)); //prints the month and year

            for(int i = 0; i < arrayOfDays.length; i++){
                if(i == 0){
                    System.out.print(arrayOfDays[i]);
                }
                else{
                    System.out.print(" " + arrayOfDays[i]);
                }
            }//print days of week

            System.out.println();
            for(int i = 0; i < arrayOfDays.length; i++){
                if(!arrayOfDays[i].equals(arrayOfDays[dayCounter.get(Calendar.DAY_OF_WEEK) - 1])){
                    System.out.print("   ");
                    formatCounter++;
                }
                else{
                    System.out.print(" " + calendar.getActualMinimum(Calendar.DAY_OF_MONTH) + " ");
                    formatCounter++;
                    break;
                }
            }

            for(int i = 1; i < dayCounter.getActualMaximum(Calendar.DAY_OF_MONTH); i++){
                if(formatCounter == 7){
                    System.out.println();
                    formatCounter = 0; //reset counter
                }
                dayCounter.roll(Calendar.DAY_OF_MONTH, true);
                if(dayCounter.get(Calendar.DATE) <= 9){
                    System.out.print(" " + dayCounter.get(Calendar.DATE) + " ");
                    formatCounter++;
                }
                else{
                    System.out.print(dayCounter.get(Calendar.DATE) + " ");
                    formatCounter++;
                }


            }

            System.out.print("\n[P]revious or [N]ext or [M]ain menu ? ");
            char userChoice = sc.next().charAt(0);
            if(Character.toUpperCase(userChoice) == 'P'){
                calendar.add(Calendar.MONTH, -1);
                dayCounter.add(Calendar.MONTH, -1);
                monthView();
            }
            else if(Character.toUpperCase(userChoice) == 'N'){
                calendar.add(Calendar.MONTH, 1);
                dayCounter.add(Calendar.MONTH, 1);
                monthView();
            }
            else if(Character.toUpperCase(userChoice) == 'M'){
                return;
            }
            else{
                System.out.println("Invalid choice.");
                return;
            }
        }


    public void goTo(){
        System.out.print("Enter a date in MM/DD/YYYY format: ");
        String userDate = sc.nextLine();
        String[] dateArr = userDate.split("/");
           calendar.set(GregorianCalendar.YEAR, Integer.parseInt(dateArr[2]));
           calendar.set(GregorianCalendar.MONTH, Integer.parseInt(dateArr[0]));
           calendar.set(GregorianCalendar.DATE, Integer.parseInt(dateArr[1]));

           System.out.println(arrayOfDays[calendar.get(Calendar.DAY_OF_WEEK) - 1] + ", " +  
           arrayOfMonths[calendar.get(Calendar.MONTH) - 1] + " " + calendar.get(Calendar.DATE) + ", " + calendar.get(Calendar.YEAR));

  //more stuff

    }



}

編輯:DAYS是在testerClass中定義的枚舉,如下所示:

    enum DAYS
{
    Su, Mo, Tu, We, Th, Fr, Sa;
}

輸出示例:如果用戶輸入今天的日期(03/12/2015)程序應打印:Th,2015年3月12日,但程序正在打印:Su,2015年3月12日

另一個編輯這里是我的月份在枚舉中的定義方式:

enum MONTHS
{
    January, February, March, April, May, June, July, August, September, October, November, December;
}

Calendar月份數字從零開始,例如Calendar.MARCH == 2 您的goTo()方法goTo()這個問題,因此,它將日歷設置為錯誤的月份。

更新

看起來您想要這樣:

public void goTo(){
    System.out.print("Enter a date in MM/DD/YYYY format: ");
    String userDate = sc.nextLine();
    String[] dateArr = userDate.split("/");

    calendar.set(GregorianCalendar.YEAR, Integer.parseInt(dateArr[2]));
    calendar.set(GregorianCalendar.MONTH, Integer.parseInt(dateArr[0]) - 1);
    calendar.set(GregorianCalendar.DATE, Integer.parseInt(dateArr[1]));

    System.out.println(arrayOfDays[calendar.get(Calendar.DAY_OF_WEEK) - 1] + ", "
            + arrayOfMonths[calendar.get(Calendar.MONTH)] + " "
            + calendar.get(Calendar.DATE) + ", "
            + calendar.get(Calendar.YEAR));
    // ...
}

John Bollinger的答案指出了您看到此異常的原因,因為事實是月份是從0開始的,而不是從1開始的,並且您的goTo方法錯誤地設置了日期。

這里有幾個問題,給您一種錯誤的印象,即您在星期幾以外的所有地方都已正確設置了某些內容。

第一:

calendar.set(GregorianCalendar.MONTH, Integer.parseInt(dateArr[0]));

您解析用戶輸入,並根據用戶值(“ Aarch”,又稱03)設置日歷的月份。

但是,正如約翰指出的那樣,月份數字是從0開始的,因此日歷認為3是“ 4月”。

這很適合您的查找,因為您可以正確獲取星期幾(星期日),但對於錯誤的月份(4月),也就是2015年的第12天。

但是,您從數組中查找的結果正確地給您以下印象:“月”設置正確,因為您使用的是月的“ 日歷”值(從0開始)。

您從該值中錯誤地減去1來查找月份名稱,這使您認為星期幾是錯誤的。

您需要修復兩個位置(查找和設置):

calendar.set(GregorianCalendar.YEAR, Integer.parseInt(dateArr[2]));
calendar.set(GregorianCalendar.MONTH, Integer.parseInt(dateArr[0])-1);
calendar.set(GregorianCalendar.DATE, Integer.parseInt(dateArr[1]));

System.out.println(arrayOfDays[calendar.get(Calendar.DAY_OF_WEEK) - 1] + ", " +  
arrayOfMonths[calendar.get(Calendar.MONTH)] + " " + calendar.get(Calendar.DATE) + ", " + calendar.get(Calendar.YEAR));

暫無
暫無

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

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