为什么 java.util.Calendar 返回 2021 年 2 月的 31?
Why is java.util.Calendar returning 31 for Feb 2021?
以下代码段 returns:
28
31
我想不通,为什么。我尝试以两种方式将日历对象设置为 2021 年 2 月,我做错了什么?
月份是从零开始的,所以 Feb 是“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
已过时且容易出错。建议完全停止使用它们并切换到 modern date-time 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 which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and 。
您调用 Calendar.getInstance()
, which returns a Calendar
对象初始化为当前时间,今天表示 2021 年 3 月 31 日。
然后将 YEAR
设置为 2021,将 MONTH
设置为 1(二月),将 DAY_OF_MONTH
设置为 31。如果您向 Calendar
对象询问日期,它将解决字段和 return 解释问题的日期值:
System.out.println(c.getTime()); // prints: Wed Mar 03 11:51:55 EST 2021
看看它是怎么说的 3 月 3 日,2021 年?那是因为 2 月 31 日在 2 月 28 日之后转为 3 月 3 日。
由于 Calendar
对象现在是三月,因此 c.getActualMaximum(Calendar.DAY_OF_MONTH)
正确 returns 31.
要正确执行此操作,请调用 clear()
and set DAY_OF_MONTH
to 1, which is much easier when you use the nice 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
以下代码段 returns:
28
31
我想不通,为什么。我尝试以两种方式将日历对象设置为 2021 年 2 月,我做错了什么? 月份是从零开始的,所以 Feb 是“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
已过时且容易出错。建议完全停止使用它们并切换到 modern date-time 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 which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and
您调用 Calendar.getInstance()
, which returns a Calendar
对象初始化为当前时间,今天表示 2021 年 3 月 31 日。
然后将 YEAR
设置为 2021,将 MONTH
设置为 1(二月),将 DAY_OF_MONTH
设置为 31。如果您向 Calendar
对象询问日期,它将解决字段和 return 解释问题的日期值:
System.out.println(c.getTime()); // prints: Wed Mar 03 11:51:55 EST 2021
看看它是怎么说的 3 月 3 日,2021 年?那是因为 2 月 31 日在 2 月 28 日之后转为 3 月 3 日。
由于 Calendar
对象现在是三月,因此 c.getActualMaximum(Calendar.DAY_OF_MONTH)
正确 returns 31.
要正确执行此操作,请调用 clear()
and set DAY_OF_MONTH
to 1, which is much easier when you use the nice 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