Java 无法初始化GregorianCalendar对象
我是Java的完全初学者,我一直在编写简单的测试程序来复习我读到的一些材料。下面的代码块工作不正确。它应该接受用户提供的年、月和日期,然后创建一个用年、月和日期初始化的GregorianCalendar对象。但是,当我尝试返回GregorianCalendar变量的月份时,它总是返回我初始化月份变量的月份。我不知道为什么Java 无法初始化GregorianCalendar对象,java,date,calendar,Java,Date,Calendar,我是Java的完全初学者,我一直在编写简单的测试程序来复习我读到的一些材料。下面的代码块工作不正确。它应该接受用户提供的年、月和日期,然后创建一个用年、月和日期初始化的GregorianCalendar对象。但是,当我尝试返回GregorianCalendar变量的月份时,它总是返回我初始化月份变量的月份。我不知道为什么 import java.util.*; public class Prac { public static void main(String[] args){
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));
}
}
另外,我知道我本可以使用开关块,但不知怎的,它给了我奇怪的错误 String.equals
您对字符串的比较不正确
=
操作符检查对象是否相同——表示相同的内存位置和所有内容
你要做的是方法
这将只检查字符串的值是否相等
此外,除非您使用的是Java1.7+,否则您将无法对字符串使用开关大小写。这并不是问题的一部分,但知道这一点仍然很好。答案是正确的,应该被接受。您通常应该避免使用=
与对象进行比较,而是调用equals
或isEqual
等方法
此外,您可以调用String::equalsIgnoreCase
方法,而不是将字符串更改为小写
boolean sameIgnoringCase = thisString.equalsIgnoreCase( thatString ) ;
java.time
现代方法使用现代java.time类
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
enum比较月份,而不仅仅是数字或文本。该课程提供了12个实例,一年中每个月一个
Month month = ld.getMonth() ; // Get `Month` enum object.
你可以
请注意,Java中的一个怪癖意味着您不能在开关内以Month
(即Month.janur
)作为janur
的前缀。作为一种习惯,我经常将enum类名与对象名一起使用,除非在开关中禁止使用
此外,您还可以找到方便的EnumSet
和EnumMap
Set< Month > winter = EnumSet.of( Month.DECEMBER , Month.JANUARY , Month.FEBRUARY ) ;
boolean isWinter = winter.contains( myLocalDate.getMonth() ) ;
Setwinter=EnumSet.of(Month.十二月、Month.一月、Month.二月);
布尔值isWinter=winter.contains(myLocalDate.getMonth());
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。搜索“Java中的字符串相等”mon==“一月”
并不像你想象的那样。啊,我早该知道的。非常感谢。此外,您可能希望使用日历中为月份定义的常量,而不是硬编码的整数值(Calendar.JANUARY等)。@FrankPavageau很好,月份总是因为它们的零相关性而绊倒我D
switch( month ) {
case JANUARY:
…
case FEBRUARY:
…
default:
…
}
Set< Month > winter = EnumSet.of( Month.DECEMBER , Month.JANUARY , Month.FEBRUARY ) ;
boolean isWinter = winter.contains( myLocalDate.getMonth() ) ;