有没有办法让Java8持续一年的时间来说明闰年?

时间:2015-04-27 15:03:22

标签: java java-8 duration

我需要一年中的天数,我想使用Java8的新时间api。

但是,我不能Duration.ofDays(365),因为它没有说明闰年。由于Duration.of(1, ChronoUnit.YEARS)

java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration无效

我查看了“期间”,但从几年到几天它似乎没有用。

我觉得我在这里错过了一些东西?如果年份是闰年,我可以写一些东西来增加一天,但似乎我应该能够开箱即用。

2 个答案:

答案 0 :(得分:41)

根据Getting Duration using the new dateTime API中您应该使用的回复

Period p = Period.ofYears(1);

了解Duration(确切的纳秒数<1天)和Period(变量> 1天)之间的差异非常重要。

例如,

Duration不会考虑闰日,夏令时或闰秒,并且预计持续时间不到一天,最多几天。因此,如果您能够使用Period,那就更好了。

由于不同的年份有不同的天数,如果您想查找一年中的天数,您需要指定您正在谈论的年份。

如果您想要特定年份的天数,可以使用

Year.of(year).length()

如果您希望从现在开始一年的日期,可以使用

LocalDate.now().plusYears(1)

LocalDate.now().plus(Period.ofYears(1))

如果您需要两个日期之间的天数,可以使用

ChronoUnit.DAYS.between(start, end)

因此,要查找从现在开始一年的日期,您可以使用

LocalDate today = LocalDate.now();
long days = ChronoUnit.DAYS.between(today, today.plusYears(1));

如果您想查看一年的会员资格是否仍然有效,可以使用

Period membershipLength = Period.ofYears(1);
LocalDate membershipStart = ...;
LocalDate membershipEnd = membershipStart.plus(membershipLength);

LocalDate today = LocalDate.now();
boolean memberShipEnded = today.isAfter(membershipEnd);
boolean membershipValid = !membershipEnded;

答案 1 :(得分:9)

很明显,您不希望持续时间(=两个日期之间),而是特定日期的年份长度。

LocalDate dateLeap = LocalDate.of(2004, Month.MARCH, 1);
System.out.println("leap year of " + dateLeap
    + " has days: " + dateLeap.lengthOfYear());
  2004-03-01的闰年有几天:366

Java 8 Date&amp;时间惊人的完成。

如果您的意思是,2004年1月5日至2005年1月5日= 366 和2004年3月2日至2005年3月2日= 365

int lengthOfYear(LocalDate date) {
    return date.getMonthValue() <= 2
        ? date.lengthOfYear()               // Count Feb in this year
        : date.plusYears(1).lengthOfYear(); // Count Feb in next year
}

说明:基本上长度是365.但是如果日期是> = 3月,则计算下一年的2月,否则计算今年的2月。

请注意plusYears(1)不会改变DAY或MONTH。

2月29日也不会考虑闰秒或小时/小时。