Java计算一年中的天数,或两个日期之间的天数
在任何本机Java类中是否有一种方法来计算一年中过去/将来有多少天?和中一样,这是一年(366天)还是正常的一年(365天) 还是我需要自己写 我在计算两个日期之间的天数,例如,离我的生日还有多少天。我想考虑闰年的2月29日。除了第29页,我已经完成了所有的工作。您可以查看一些非常好的伪代码:Java计算一年中的天数,或两个日期之间的天数,java,calendar,leap-year,Java,Calendar,Leap Year,在任何本机Java类中是否有一种方法来计算一年中过去/将来有多少天?和中一样,这是一年(366天)还是正常的一年(365天) 还是我需要自己写 我在计算两个日期之间的天数,例如,离我的生日还有多少天。我想考虑闰年的2月29日。除了第29页,我已经完成了所有的工作。您可以查看一些非常好的伪代码: if year modulo 400 is 0 then is_leap_year else if year modulo 100 is 0 then not_leap_yea
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中实现该逻辑。:-) gregoriacalendar
standar类有一个isLeapyear()
方法。如果您只得到一个年份号(比如,2008
),那么使用构造函数构造一个日期,然后检查isLeapYear()
方法。您确切的用例可能最好使用Joda和这个特定的类来解决。您可以使用这个类。对于您的特定需求,这应该做到:
public static int daysBetween(Date a, Date b) {
final long dMs = a.getTime() - b.getTime();
return TimeUnit.DAYS.convert(dMs, TimeUnit.MILLISECONDS);
}
老实说,我不认为闰年在这个计算中起到任何作用。也许我遗漏了你问题的某些方面
编辑:愚蠢的我,闰年魔法发生在Date.getTime()
。无论如何,您不必这样处理它。对于日期时间计算,我强烈建议使用该库。特别是对于您需要的内容,它将是一个单行程序:
Days.daysBetween(date1, date2).getDays();
我希望这能有所帮助。另一种方法是询问日历
类在给定年份中的实际最长天数:
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。tl;博士
……还有
Year.isLeap( 2015 )
java.time.Year
在Java8和更高版本中,我们有。()
长度
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 ) ;
在处理单个年份时,您可以通过比较这些年中的天数来确定已用天数。但是有一个更简单的方法;继续读下去
过去的日子
使用枚举计算经过的天数
LocalDate start = LocalDate.of( 2017 , 2 , 23 ) ;
LocalDate stop = LocalDate.of( 2017 , 3 , 11 ) ;
int daysBetween = ChronoUnit.DAYS.between( start , stop );
自动处理
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
从哪里获得java.time类
- ,及以后
- 内置的
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
- 该项目专门为Android采用了ThreeTen Backport(如上所述)
- 看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。因为Java8
一年中的天数:
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;
呸。愚蠢的Java及其所有库:-P(+1)是的,用库来做约会很糟糕。通过你自己的闰年、不同月份、闰秒的测试,加法数学是。。。无所谓。:)但是,您可以轻松地将“MyCalendar”定义为新标准,它将神奇地通过所有相关测试。@Autocracy:只有内置的日期库很糟糕。向Jon Skeet询问。是的,我在深夜写了这篇文章,但我忘了提到我正在使用Calendar类和Calendar.get(Calendar.DAY OF the_YEAR)来计算差异。我只有一个疑问-如果我这样做,例如,Calendar.add(Calendar.MONTH,14)如果是一年,它会将结果年设置为闰年吗?或者说所有年份只有365天?这看起来像是重新发明了轮子。是的,我同意,这是在我了解Java的GregoriaCalendar
类之前。撇开Java的许多其他日期/时间问题不谈,这就是本例的方法!为什么要投反对票?这是寻找闰年的“算法”。@Cem Catikkas:这肯定是正确的,但问题是“这是一个有用的答案吗?”。这是一个Java问题,因此我认为使用Java库是一个更好的答案,而重新发明轮子是不好的。谢谢你的投票!:-)我对实现整个库不感兴趣,只是为了做一个简单的计算。这很好,但不要“调整”我的英语。先生,你赢得了NoodleofDeath奖牌。事实上,这个答案在2014年的Java 8中已经过时了。现在,诸如、和java.text.SimpleTextFormat
等麻烦的旧日期时间类已被这些类所取代。请参阅。@BasilBourque我同意,如果可能的话,您应该使用java.time类。但是对于我们这些没有奢侈使用Java8的人来说,这个答案并没有过时。OP指的是java.util.Calendar和java.util.Date,这个答案对我们中的许多人仍然非常适用。这就是我一直在寻找的答案。@SamuraiSoul在项目中,java.time的大部分功能都被移植到了java 6和java 7中。在项目中进一步适应Android。因此,没有理由因为可怜的遗留类Date
/Calendar
/等等而痛苦。详情请参见。OP上说“…计算需要的天数
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;