Java 计算一年中或两个日期之间的天数tl;博士java.time.Year关于 java.time

2022-09-01 21:28:32

在任何原生Java类中,有没有一种方法可以计算特定年份中曾经/将要有多少天?例如,它是闰年(366天)还是正常年(365天)?

还是我需要自己写?

我正在计算两个日期之间的天数,例如,离我生日还剩多少天。我想考虑一下闰年的2月29日。除了29日,我已经完成了所有的事情。


答案 1

另一种方法是向全班询问给定年份中的实际最大天数:Calendar

Calendar cal = Calendar.getInstance();
cal.setTime(new Date());

int numOfDays = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(numOfDays);

这将为双死一年返回366,对于正常年份,这将返回365。

请注意,我使用了 代替 ,这将始终返回 366。getActualMaximumgetMaximum


答案 2

tl;博士

Year.of( 2015 ).length()

...和。。。

Year.isLeap( 2015 )

java.time.Year

在Java 8及更高版本中,我们有java.time包。(教程)

length

该类表示单个年份值。您可以询问其长度。Year

int daysInYear = Year.of( 2015 ).length();

isLeap

你也可以问一年是否是闰年。

Boolean isLeapYear = Year.isLeap( 2015 );

例如,使用 Java 的三元运算符获取一年中的天数,例如:

minVal = (a < b) ?a : b;

在我们的例子中,我们想要一年中的天数。对于非闰年,这是365,对于闰年,这是366。

int daysInYear = ( Year.isLeap( 2015 ) ) ? 366 : 365 ;

一年中的某一天

您可以获取日期的一年中的某一天编号。这个数字从1到365,或闰年366。

int dayOfYear = LocalDate.now( ZoneId.of( "America/Montreal" ).getDayOfYear() ;

从另一个方向走,获取一年中某一天的日期。

Year.now( ZoneId.of( "America/Montreal" ) ).atDay( 159 ) ;

在处理单个年份时,您可以通过比较这些一年中的某一天的数字来确定已用天数。但是有一种更简单的方法;请继续阅读。

已用天数

使用 ChronoUnit 枚举计算已用天数。

LocalDate start = LocalDate.of( 2017 , 2 , 23 ) ;
LocalDate stop = LocalDate.of( 2017 , 3 , 11 ) ;
int daysBetween = ChronoUnit.DAYS.between( start , stop );

自动处理闰年


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter


推荐