Java 计算一年中或两个日期之间的天数tl;博士java.time.Year关于 java.time
在任何原生Java类中,有没有一种方法可以计算特定年份中曾经/将要有多少天?例如,它是闰年(366天)还是正常年(365天)?
还是我需要自己写?
我正在计算两个日期之间的天数,例如,离我生日还剩多少天。我想考虑一下闰年的2月29日。除了29日,我已经完成了所有的事情。
在任何原生Java类中,有没有一种方法可以计算特定年份中曾经/将要有多少天?例如,它是闰年(366天)还是正常年(365天)?
还是我需要自己写?
我正在计算两个日期之间的天数,例如,离我生日还剩多少天。我想考虑一下闰年的2月29日。除了29日,我已经完成了所有的事情。
另一种方法是向全班询问给定年份中的实际最大天数:Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int numOfDays = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(numOfDays);
这将为双死一年返回366,对于正常年份,这将返回365。
请注意,我使用了 代替 ,这将始终返回 366。getActualMaximum
getMaximum
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 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。