在Time4j中定义日期范围(波斯日历)

时间:2017-09-11 15:38:53

标签: java calendar persian time4j

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

  • "1396/8/9"
  • 开始
  • 结束"1396/9/2"

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

我在互联网上搜索,在Time4j中找到了DateInterval函数。

是否可以使用此方法在波斯日历中定义可选日期范围?如果是,我如何才能将此方法用于我的目的?

1 个答案:

答案 0 :(得分:0)

使用转化

班级DateInterval仅适用于ISO-8601,适用于普通格里高利历。因此,您自己应该对格里高利类型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)它的功能少于DateInterval,而b)主要是针对非{calendrical类型的java.util.Date而设计的(因为在大多数业务应用程序中,这些间隔总是半开,而日历间隔应该更好地关闭)。

可选范围

关于您的期限&#34;可选日期范围&#34;,我不清楚其含义。你能澄清一下吗?也许你在谈论无限或半无限的区间边界。这个有可能。只是按between(...)而不是since(...)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内处理。

相关问题