Java计算一年中的天数

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

或者我需要自己写吗?

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

GregorianCalendar类有一个isLeapyear()方法。 如果你所拥有的只是年份数(比如2008 ),那么使用这个构造函数构造一个日期,然后检查isLeapYear()方法。

另一种方法是向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。

对于DateTime计算,我强烈建议使用JodaTime库。 特别是对于你需要的东西,它将是一个衬里:

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

我希望这有帮助。

TL;博士

 Year.of( 2015 ) .length() 

java.time

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

length

Year类表示单年值。 你可以询问它的长度。

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

isLeap

您也可以询问一年是否是闰年。

 Boolean isLeapYear = Year.isLeap( 2015 ); 

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

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 ); 

自动处理闰年 。


关于java.time

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

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

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

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

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

GregorianCalendar.isLeapYear(int year)

您可以在Wikipedia页面查看一些非常好的伪代码:

 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中实现这种逻辑。 🙂

您可以通过Joda和此具体示例最好地解决您的确切用例 。

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