Java计算一年中的天数

时间:2011-01-24 21:44:05

标签: java calendar leap-year

在任何本机Java类中是否有一个方法来计算特定年份中/将会有多少天?如同,是Leap year(366天)还是正常年份(365天)?

或者我是否需要自己编写?

我正在计算两个日期之间的天数,例如,我生日前剩余的天数。我想考虑闰年2月29日。除了29日,我完成了所有工作。

9 个答案:

答案 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)

TL;博士

Year.of( 2015 )
    .length()

java.time

在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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

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

答案 3 :(得分:6)

对于DateTime计算,我强烈建议您使用JodaTime库。特别是对于你所需要的,它将是一个班轮:

Days.daysBetween(date1, date2).getDays();

我希望这会有所帮助。

答案 4 :(得分:6)

JAVA 8

一年中的天数:

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()。无论如何,你不必这样处理它。