![](/img/trans.png)
[英]Gregorian Calendar: Getting a user's (day_of_the_week) from their own birthday input
[英]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.