专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java修炼终极指南:69. 获取一个季度的第一天和最后一天

temp10 2024-10-06 02:05:54 java教程 10 ℃ 0 评论


假设我们通过这个简单的类来表示一个季度的第一天和最后一天:

Java修炼终极指南:69. 获取一个季度的第一天和最后一天

public final class Quarter {
  private final Date firstDay;
  private final Date lastDay;
  // ...
}


接下来,我们有一个`java.util.Date`对象,我们想要获取包含这个日期的季度的第一天和最后一天。为此,我们可以使用JDK 8中的`IsoFields.DAY_OF_QUARTER`(我们在上一个问题中介绍了`IsoFields`)。但是,在使用`IsoFields`之前,我们必须将给定的`java.util.Date`转换为`LocalDate`,如下所示:

LocalDate localDate = date.toInstant()
  .atZone(ZoneId.systemDefault()).toLocalDate();


一旦我们将给定的`Date`转换为`LocalDate`,我们就可以通过`IsoFields.DAY_OF_QUARTER`轻松提取季度的第一天。接下来,我们向这个日期添加2个月,以移动到季度的最后一个月(一个季度有3个月,所以一年有4个季度),并依赖于`java.time.temporal.TemporalAdjusters`,更确切地说是`lastDayOfMonth()`来获取季度的最后一天。最后,我们将两个获得的`LocalDate`转换为`Date`。以下是完整的代码:

public static Quarter quarterDays(Date date) {
  LocalDate localDate = date.toInstant()
    .atZone(ZoneId.systemDefault()).toLocalDate();
  LocalDate firstDay
    = localDate.with(IsoFields.DAY_OF_QUARTER, 1L);
  LocalDate lastDay = firstDay.plusMonths(2)
    .with(TemporalAdjusters.lastDayOfMonth());
  return new Quarter(
    Date.from(firstDay.atStartOfDay(
      ZoneId.systemDefault()).toInstant()),
    Date.from(lastDay.atStartOfDay(
      ZoneId.systemDefault()).toInstant())
  );
}


当然,如果你直接使用`LocalDate`,这些转换是不需要的。但是,这样,你有机会学到更多的东西。在打包的代码中,你可以找到更多的例子,包括一个完全依赖于`Calendar` API的例子。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表