首页 > 解决方案 > 计算给定生日的下一个生日日期?

问题描述

给定生日(在 Date 对象中)计算下一个生日的最简单方法是什么?

我相信 java.time 是人们趋之若鹜的图书馆。

下面的解决方案显示了如何找到一周中的第二天,但文档似乎不支持这种情况。如何获得与下一次出现的小时、分钟相对应的 DateTime?

谢谢!

标签: javatimedate

解决方案


假设 - 你有一个java.util.Date输入,你想要一个java.util.Date输出。

第一个建议——停止使用java.util.Date。较新的java.timeAPI 实现得更好,一旦您习惯了使用它,就更容易使用

好的,首先,我们要将 转换java.util.Datejava.time.LocalDate...

public LocalDate toLocalDate(Date dateToConvert) {
    return dateToConvert.toInstant()
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
}

从那里开始,这是一个简单的案例,只需再增加一年......

LocalDate nextBirthDate = toLocalDate(someDate).plusYear(1);

请记住,java.time对象是不可变的。

最后,如果需要,您可以将LocalDateback转换为java.util.Date

public Date toUtilDate(LocalDate dateToConvert) {
    return java.util.Date.from(dateToConvert.atStartOfDay()
      .atZone(ZoneId.systemDefault())
      .toInstant());
}

但这引发了一系列关于你为什么要打扰的问题(回到java.util.Date)。一旦您可以退出该 API 并进入较新的java.timeAPI,您应该尝试并留在那里(恕我直言)

nb将日期转换为 LocalDate 或 LocalDateTime 并返回的日期对话

“from”和“with”似乎是最有希望的..但最终不支持这个用例(即不能给 LocalDate 的下一个实例给定日期和月份)

还是没看到问题。以下示例采用原始生日,当前并根据当前“年份日期”是在今天之前还是之后确定“下一个”生日

LocalDate orignalBirthDate = LocalDate.of(1972, Month.MARCH, 8);
LocalDate today = LocalDate.now();
int year = today.getYear();

LocalDate nextBirthDate = orignalBirthDate.withYear(year);
if (nextBirthDate.isBefore(today)) {
    nextBirthDate = nextBirthDate.plusYears(1);
}

System.out.println("Next birthday = " + DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(nextBirthDate));

推荐阅读