无法初始化GregorianCalendar对象

时间:2012-09-05 19:43:41

标签: java date calendar

我是Java的初学者,我一直在制作简单的测试程序来回顾我读过的一些材料。以下代码块工作不正常。它应该接受用户的年,月和日,然后创建一个用年,月和日初始化的GregorianCalendar对象。但是,当我尝试返回GregorianCalendar变量的月份时,它总是返回我用月初始化月份变量的月份。我不知道为什么。

import java.util.*;
public class Prac {
    public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    System.out.print("Enter Year: ");
    int YEAR = input.nextInt();
    System.out.print("Enter Month: ");
    String MONTH_STRING = input.next();
    System.out.print("Enter Date: ");
    int DATE = input.nextInt();
    int MONTH = 10;
    String mon = MONTH_STRING.toLowerCase();

    if (mon == "january") {
        MONTH = 0;
    } else if (mon == "february") {
        MONTH = 1;
    } else if (mon == "march") {
        MONTH = 2;
    } else if (mon == "april") {
        MONTH =3;
    } else if (mon == "may"){
        MONTH =4;
    } else if (mon == "june"){
        MONTH =5;
    } else if (mon == "july"){
        MONTH =6;
    } else if (mon == "august"){
        MONTH=7;
    } else if (mon == "september"){
        MONTH=8;
    } else if (mon == "october"){
        MONTH=9;
    } else if (mon == "november"){
        MONTH=10;
    } else if (mon == "december"){
        MONTH =11;
    }

    GregorianCalendar entDate = new GregorianCalendar(YEAR,MONTH,DATE);
    System.out.println(entDate.get(Calendar.MONTH));
    }
}

另外,我知道我可以使用一个开关块,但它以某种方式给了我奇怪的错误。

2 个答案:

答案 0 :(得分:2)

String.equals

您正在比较错误的字符串。

==运算符检查对象是否相同 - 意味着相同的内存位置和所有内容。

您要做的是String::equals方法。

if(mon.equals("january") {
    ...
} else if(mon.equals("feburary") {
    ...
} ...

这将仅检查字符串的值是否相等。

此外,除非您使用的是java 1.7+,否则您将无法使用字符串开关案例。这不是问题的一部分,但仍然很有用。

答案 1 :(得分:0)

Answer by Shaded是正确的,应该被接受。您通常应避免使用==与对象进行比较,而是调用equalsisEqual等方法。

此外,您可以调用String::equalsIgnoreCase方法,而不是将字符串更改为小写。

boolean sameIgnoringCase = thisString.equalsIgnoreCase( thatString ) ;

java.time

现代方法使用现代 java.time 类。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

您可以将月份设置为一个数字,1月至12月的数字为1-12。

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

使用Month枚举而不仅仅是数字或文字来比较月份。该课程提供了十几个实例,一年中每个月都有一个实例。

Month month = ld.getMonth() ;  // Get `Month` enum object.

你可以switch on an enum

switch( month ) {
    case JANUARY: 
        …
    case FEBRUARY: 
        …
    default:
        …
}

请注意,Java中的怪癖意味着您不能在JANUARY前加Month(即Month.JANUARY)作为开关的前缀。作为一种习惯,我经常使用带有对象名称的枚举类名称,除非在禁止它的switch中。

此外,您可能会发现EnumSetEnumMap方便。

Set< Month > winter = EnumSet.of( Month.DECEMBER , Month.JANUARY , Month.FEBRUARY ) ;
boolean isWinter = winter.contains( myLocalDate.getMonth() ) ;

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore