有没有任何原生Java类中的方法,可以计算特定年份有多少天?就是说,它是一个闰年(366天)还是普通年(365天)?
还是说我需要自己编写代码?
我正在计算两个日期之间的天数,例如我生日前还有多少天。我想考虑闰年二月29日。除了那一天以外,我都已经搞定了。
另一种方法是询问 Calendar
类在给定年份中的实际最大天数:
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int numOfDays = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(numOfDays);
这将返回闰年366天,普通年365天。
请注意,我使用了getActualMaximum
而不是getMaximum
,后者总是返回366。
Year.of( 2015 ).length()
…和…
Year.isLeap( 2015 )
java.time.Year
length
Year
类表示单个年份值。您可以查询其长度。
int daysInYear = Year.of( 2015 ).length();
isLeap
您还可以询问一年是否为闰年。
Boolean isLeapYear = Year.isLeap( 2015 );
在我们的例子中,我们想要得到一年中的天数。对于非闰年来说,这是365天,而对于闰年来说,是366天。minVal = (a < b) ? a : b;
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。Interval
, YearWeek
, YearQuarter
和 更多。GregorianCalendar
标准类有一个isLeapYear()
方法。如果你只想获得一个年份(比如说2008
),那么可以使用这个构造函数构造一个日期,然后在之后检查isLeapYear()
方法。
一年中的天数:
LocalDate d = LocalDate.parse("2020-12-31"); // import java.time.LocalDate;
return d.lengthOfYear(); // 366
距离我的生日还有几天:
LocalDate birth = LocalDate.parse("2000-02-29");
LocalDate today = LocalDate.now(); // or pass a timezone as the parameter
LocalDate thisYearBirthday = birth.withYear(today.getYear()); // it gives Feb 28 if the birth was on Feb 29, but the year is not leap.
LocalDate nextBirthday = today.isAfter(thisYearBirthday)
? birth.withYear(today.getYear() + 1)
: thisYearBirthday;
return DAYS.between(today, nextBirthday); // import static java.time.temporal.ChronoUnit.DAYS;
对于日期时间计算,我强烈推荐使用JodaTime库。特别是对于你所需的情况,这只需要一行代码:
Days.daysBetween(date1, date2).getDays();
if year modulo 400 is 0
then is_leap_year
else if year modulo 100 is 0
then not_leap_year
else if year modulo 4 is 0
then is_leap_year
else
not_leap_year
GregorianCalendar
类之前。除了Java的许多其他日期/时间问题之外,在这种情况下那是正确的选择! - Platinum Azurepublic static int daysBetween(Date a, Date b) {
final long dMs = a.getTime() - b.getTime();
return TimeUnit.DAYS.convert(dMs, TimeUnit.MILLISECONDS);
}
java.util.Date
,java.util.Calendar
和java.text.SimpleTextFormat
现在已经成为遗留系统,被Java.time类所取代。请参阅Oracle的教程。 - Basil BourqueDate
/Calendar
等类。详情请参见我的回答。 - Basil Bourque