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

标签 java calendar persian time4j

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

  • “1396/8/9”开始
  • 结束于 "1396/9/2"

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

在网上搜索了一下,在Time4j中找到了一个DateInterval函数。

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

最佳答案

使用转化

类(class)DateInterval专为 ISO-8601 设计,仅适用于 proleptic 公历。因此,您需要自己负责公历类型 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) 主要是为非日历类型设计的,例如 java.util.Date(因为这样的间隔总是半开的,而日历间隔在大多数业务应用程序中最好关闭)。

可选范围

关于你的术语“可选日期范围”,我不太清楚意思。你能澄清一下吗?也许您在谈论无限或半无限区间边界。这个有可能。只需不是通过 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 中处理。

关于java - 在 Time4j(波斯历)中定义日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46159435/

相关文章:

java - OSGi:如何正确安装解析答案Map<Resource,List<Wire>>?

java - Jboss 上的 Drools 项目使用什么 Maven 3 原型(prototype)?

java - HH 日期时间格式问题

html - 用草书体(如阿拉伯文)将字母加粗

java - 如何在应用程序中的 Activity 之间添加几秒钟的延迟?

java - 小部件不遵守 ID 参数

java - 为什么 Calendar 会产生 future 一个月的日期

javascript - GWT 日历计算

python-3.x - 如何使用 Hazm 规范化波斯文本

java - 检查字符串是波斯语还是英语