2

我想定义一个这样的日期范围:

  • 从...开始"1396/8/9"
  • 结束于"1396/9/2"

并获取这两个日期之间的日期。

我通过互联网搜索,我发现了DateIntervalTime4j中的一个功能。

是否可以使用此方法在波斯日历中定义可选日期范围?如果是,我该如何使用这种方法来达到我的目的?

4

1 回答 1

1

使用转换

DateInterval类是为 ISO-8601 设计的,它仅适用于公历。因此,您将自己负责 gregorian 类型PlainDate和目标类型之间的转换PersianCalendar

DateInterval interval =
  DateInterval.between(
    PersianCalendar.of(1396, 8, 9).transform(PlainDate.axis()),
    PersianCalendar.of(1396, 9, 2)).transform(PlainDate.axis());

对于反向转换:

PersianCalendar start = interval.getStartAsCalendarDate().transform(PersianCalendar.axis());

当然,您也可以每天循环遍历您的时间间隔:

interval
  .streamDaily()
  .map(d -> d.transform(PersianCalendar.axis()))
  .forEach(System.out::println);

边注:

DateInterval默认情况下是关闭的(在大多数与业务日期相关的应用程序中都需要),但可以通过调用interval.withOpenEnd().

选择:

甚至还有一种方法可以将实例PersianCalendar直接存储在一个区间中,即SimpleInterval(注意:在 v4.31 版本之前总是半开!)。例子:

SimpleInterval<PersianCalendar> pInterval =
  SimpleInterval.onTimeLine(PersianCalendar.axis()).between(
    PersianCalendar.of(1396, 8, 9),
    PersianCalendar.of(1396, 9, 2).plus(CalendarDays.ONE)
  );

通过普通的 for 循环进行日常循环:

for (
  PersianCalendar pcal = pInterval.getStart().getTemporal(); 
  pcal.isBefore(pInterval.getEnd().getTemporal(); 
  pcal = pcal.plus(CalendarDays.ONE)
) {
  System.out.println(pcal);
}

但是,我真的不推荐使用SimpleInterval,因为 a) 它的功能少于DateIntervalb) 主要是为非日历类型设计的java.util.Date(因为这样的间隔总是半开的,而日历间隔在大多数业务应用程序中最好关闭)。

可选范围

关于您的术语“可选日期范围”,我不清楚其含义。你能澄清一下吗?也许您正在谈论无限或半无限区间边界。这个有可能。between(...)只需通过since(...)or而不是通过构建间隔until(...)。但这会影响您的循环代码(您不能从无穷大或直到无穷大循环。)。

更新(2017-10-21)

从 v4.31 版本开始,该类SimpleInterval已得到增强,因此它可以以更好的方式处理日历类型,即始终关闭而不是半开(当然,即时间隔仍将是半开的)。为此目的引入了一些新方法,例如on(TimeAxis)。链接后面的 javadoc 显示了一个示例:

 PersianCalendar start = PersianCalendar.of(1392, PersianMonth.ESFAND, 27);
 PersianCalendar end = PersianCalendar.of(1393, PersianMonth.FARVARDIN, 6);

 SimpleInterval<PersianCalendar> i1 =
   SimpleInterval.on(PersianCalendar.axis()).between(start, end);
 SimpleInterval<PersianCalendar> i2 =
   SimpleInterval.on(PersianCalendar.axis()).between(
     end.minus(CalendarDays.ONE),
     end.plus(CalendarDays.ONE));

 System.out.println(
   interval.findIntersection(
     SimpleInterval.on(PersianCalendar.axis()).between(
       end.minus(CalendarDays.ONE), end.plus(CalendarDays.ONE))).get());
 // [AP-1393-01-05/AP-1393-01-06]

这样的日历间隔可以在内部IntervalCollectionIntervalTree照常处理。

于 2017-09-12T03:58:15.587 回答