我想定义一个这样的日期范围:
"1396/8/9"开始"1396/9/2"得到这两个日期之间的日期。
我在网上搜索,在Time4j中找到了一个Time4j函数。
是否可以使用此方法来定义波斯日历中的可选日期范围?如果是,我如何使用这个方法来达到我的目的?
发布于 2017-09-12 03:58:15
使用转换
类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 (
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]可以像往常一样在IntervalCollection或IntervalTree中处理这样的日历间隔。
https://stackoverflow.com/questions/46159435
复制相似问题