Пользовательский григорианский календарный месяц - PullRequest
1 голос
/ 21 ноября 2011

Как создать экземпляр календаря в зависимости от ввода пользователя?Я пробовал:

Calendar cal = new GregorianCalendar(2011, Calendar.t.getMonth(month), 1);

Но не справился.

import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.Scanner;

public class Test {
    public static void main(String[] args){
        Test t = new Test();
        Scanner sc = new Scanner(System.in);

        System.out.print("Enter a month: ");
        String month = sc.next();

        Calendar cal = new GregorianCalendar(2011, Calendar.JANUARY, 1);

        int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.print("There are "+days+" days in "+month+".");
    }
    private String getMonth(String month){
        return month;
    }
}

Или, может быть, более практичный способ сделать это?Спасибо.

Ответы [ 4 ]

2 голосов
/ 21 ноября 2011

Вам нужно добавить один к месяцу, так как он начинается с 0, а не 1:

int month = sc.nextInt();
Calendar cal = new GregorianCalendar(2011, month + 1, 1);

или если вы хотите, чтобы пользователь вставлял строку, а не числовое значение, вы можете сделать что-то вроде:

String month = sc.nextLine();
int iMonth = -1;
if(month.equalsIgnoreCase("January"))  iMonth = 0;
else if(month.equalsIgnoreCase("February")) iMonth = 1;
// and so on ...
Calendar cal = new GregorianCalendar(2011, iMonth, 1);
1 голос
/ 21 ноября 2011

Используйте Joda Time вместо нативного Java GregorianCalendar. Гораздо лучше!

 // From Joda Time documentatio
 // setup date object for midday on Christmas 2004
 Chronology chrono = GregorianChronology.getInstance();
 DateTime dt = new DateTime(2004, 12, 25, 12, 0, 0, 0, chrono);
0 голосов
/ 21 ноября 2011

GregorianCalendar не предназначен для непосредственного создания экземпляра (читайте javadocs), используйте вместо него Calendar.getInstance() и присваивайте значения с помощью set(int...) методов.

0 голосов
/ 21 ноября 2011

Для каждого перечисления в Java есть статическая функция valueOf (String), которая преобразует строку в соответствующее перечисление. К сожалению, константы класса Calendar, такие как Calendar.JANUARY, являются константами, а не enum. Лучше всего было бы создать перечисление с названием месяцев, связать эти месяцы с константами Календаря, а затем, после ввода ввода пользователя в верхнем регистре, использовать функцию valueOf.

С кодом:

public enum Months {

    JANUARY (0),
    FEBRUARY (1),
    MARS (2) // and so on

    private int value;

    test(int value){
        this.value = value;
    }
}

А в вашем классе есть такая функция:

private int monthFromString(String userInputMonth) {
   return Months.valueOf(userInputMonth);
}
...