Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java计算一年中的天数,或两个日期之间的天数_Java_Calendar_Leap Year - Fatal编程技术网

Java计算一年中的天数,或两个日期之间的天数

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

在任何本机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_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;