为什么java.util.Calendar在2021年2月返回31



以下代码段返回:

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 BackportJava.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

相关内容

  • 没有找到相关文章

最新更新