在任何本机Java类中是否有一个方法来计算特定年份中/将会有多少天?如同,是Leap year(366天)还是正常年份(365天)?
或者我是否需要自己编写?
我正在计算两个日期之间的天数,例如,我生日前剩余的天数。我想考虑闰年2月29日。除了29日,我完成了所有工作。
答案 0 :(得分:46)
另一种方法是向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.
答案 1 :(得分:15)
GregorianCalendar
标准类有isLeapyear()
方法。如果你只有一个年份数(比如2008
),那么使用this构造函数构建一个日期,然后检查isLeapYear()
方法。
答案 2 :(得分:10)
Year.of( 2015 )
.length()
在Java 8及更高版本中,我们有java.time package。 (Tutorial)
length
Year
类代表单年值。你可以询问它的长度。
int daysInYear = Year.of( 2015 ).length();
isLeap
您也可以询问一年是否是闰年。
Boolean isLeapYear = Year.isLeap( 2015 );
例如,使用Java的ternary operator获取一年中的天数,例如:
minVal =(a
在我们的情况下,我们想要一年中的天数。非闰年为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 );
自动处理Leap Year。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 3 :(得分:6)
对于DateTime计算,我强烈建议您使用JodaTime库。特别是对于你所需要的,它将是一个班轮:
Days.daysBetween(date1, date2).getDays();
我希望这会有所帮助。
答案 4 :(得分:6)
一年中的天数:
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;
答案 5 :(得分:4)
答案 6 :(得分:3)
您可以查看the Wikipedia page以获得一些非常好的伪代码:
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
我相信你可以弄清楚如何在Java中实现这种逻辑。 : - )
答案 7 :(得分:3)
使用Joda和特定的example可以最好地解决您的确切用例。
答案 8 :(得分:1)
您可以使用TimeUnit课程。对于您的特定需求,应该这样做:
public static int daysBetween(Date a, Date b) {
final long dMs = a.getTime() - b.getTime();
return TimeUnit.DAYS.convert(dMs, TimeUnit.MILLISECONDS);
}
老实说,我并没有看到闰年在这个计算中扮演什么角色。也许我错过了你问题的某些方面?
编辑:愚蠢的我,闰年的魔力发生在Date.getTime()
。无论如何,你不必这样处理它。