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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
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()
。 无论如何,你不必这样处理它。