首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Time4j (波斯日历)中定义日期范围

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

Stack Overflow用户
提问于 2017-09-11 15:38:53
回答 1查看 386关注 0票数 2

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

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

得到这两个日期之间的日期。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-12 03:58:15

使用转换

DateInterval是为ISO-8601而设计的,这是为推广的公历而设计的。因此,您将对gregorian PlainDate和目标类型PersianCalendar之间的转换负责。

代码语言:javascript
复制
DateInterval interval =
  DateInterval.between(
    PersianCalendar.of(1396, 8, 9).transform(PlainDate.axis()),
    PersianCalendar.of(1396, 9, 2)).transform(PlainDate.axis());

对于反向转换:

代码语言:javascript
复制
PersianCalendar start = interval.getStartAsCalendarDate().transform(PersianCalendar.axis());

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

代码语言:javascript
复制
interval
  .streamDaily()
  .map(d -> d.transform(PersianCalendar.axis()))
  .forEach(System.out::println);

附带说明:

DateInterval默认关闭(在大多数与业务日期相关的应用程序中是必要的),但是可以通过调用interval.withOpenEnd()将其配置为半打开。

备选方案:

甚至有一种方法可以将PersianCalendar实例直接存储在一个间隔中,即SimpleInterval (注意:在V4.31发行版之前始终是半开的!)。示例:

代码语言:javascript
复制
SimpleInterval<PersianCalendar> pInterval =
  SimpleInterval.onTimeLine(PersianCalendar.axis()).between(
    PersianCalendar.of(1396, 8, 9),
    PersianCalendar.of(1396, 9, 2).plus(CalendarDays.ONE)
  );

每天通过一个普通的循环循环:

代码语言:javascript
复制
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显示了一个示例:

代码语言:javascript
复制
 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中处理这样的日历间隔。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46159435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档