我是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));
}
}
另外,我知道我可以使用一个开关块,但它以某种方式给了我奇怪的错误。
答案 0 :(得分:2)
String.equals
您正在比较错误的字符串。
==
运算符检查对象是否相同 - 意味着相同的内存位置和所有内容。
您要做的是String::equals
方法。
if(mon.equals("january") {
...
} else if(mon.equals("feburary") {
...
} ...
这将仅检查字符串的值是否相等。
此外,除非您使用的是java 1.7+,否则您将无法使用字符串开关案例。这不是问题的一部分,但仍然很有用。
答案 1 :(得分:0)
Answer by Shaded是正确的,应该被接受。您通常应避免使用==
与对象进行比较,而是调用equals
或isEqual
等方法。
此外,您可以调用String::equalsIgnoreCase
方法,而不是将字符串更改为小写。
boolean sameIgnoringCase = thisString.equalsIgnoreCase( thatString ) ;
现代方法使用现代 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( month ) {
case JANUARY:
…
case FEBRUARY:
…
default:
…
}
请注意,Java中的怪癖意味着您不能在JANUARY
前加Month
(即Month.JANUARY
)作为开关的前缀。作为一种习惯,我经常使用带有对象名称的枚举类名称,除非在禁止它的switch
中。
此外,您可能会发现EnumSet
和EnumMap
方便。
Set< Month > winter = EnumSet.of( Month.DECEMBER , Month.JANUARY , Month.FEBRUARY ) ;
boolean isWinter = winter.contains( myLocalDate.getMonth() ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。