以下代码段返回:
28
31
我不明白为什么。我试着用两种方式将日历对象设置为2021年2月,我做错了什么?月份是以零为基数的,所以二月是"零";1〃;。
import java.util.Calendar;
import java.util.GregorianCalendar;
public class HelloWorld{
public static void main(String []args){
Calendar g = new GregorianCalendar(2021, 1, 28);
System.out.println(g.getActualMaximum(Calendar.DAY_OF_MONTH));
int year = 2021;
int month = 1;
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH));
}
}
或者这种情况只会发生吗,因为我在3月29日、30日或31日调用Calendar.getInstance((,而我不调用
c.set(Calendar.DAY_OF_MONTH, {any day below 29});
java.util
日期时间API及其格式API、SimpleDateFormat
已过时且错误。建议完全停止使用它们,并切换到现代日期时间API*。
使用现代日期时间API:
import java.time.Month;
import java.time.Year;
public class Main {
public static void main(String[] args) {
System.out.println(YearMonth.of(2021, Month.FEBRUARY).lengthOfMonth());
}
}
输出:
28
从跟踪:日期时间了解有关现代日期时间API的更多信息。
使用传统API:
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Main {
public static void main(String[] args) {
// 1st Feb 2021
Calendar cal = new GregorianCalendar(2021, Calendar.FEBRUARY, 1);
System.out.println(cal.getActualMaximum(Calendar.DAY_OF_MONTH));
}
}
输出:
28
*出于任何原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen Backport将Java.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API
您调用Calendar.getInstance()
,它返回一个初始化为当前时间的Calendar
对象,即今天的2021年3月31日。
然后将YEAR
设置为2021,将MONTH
设置为1(2月(,并将DAY_OF_MONTH
保留为31。如果您向Calendar
对象询问日期,它会解析字段并返回一个解释问题的日期值:
System.out.println(c.getTime()); // prints: Wed Mar 03 11:51:55 EST 2021
看看它是怎么说的2021年3月3日?这是因为2月31日在2月28日之后,变成了3月3日。
由于Calendar
对象现在处于三月,因此c.getActualMaximum(Calendar.DAY_OF_MONTH)
正确地返回31。
要正确地执行此操作,请调用clear()
并将DAY_OF_MONTH
设置为1,这在使用漂亮的set(year, month, date)
辅助方法时要容易得多。
int year = 2021;
int month = Calendar.FEBRUARY/*1*/;
Calendar c = Calendar.getInstance();
c.clear();
c.set(year, month, 1);
System.out.println(c.getTime()); // prints: Mon Feb 01 00:00:00 EST 2021
System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH)); // prints: 28