List of usage examples for org.joda.time Duration compareTo
public int compareTo(ReadableDuration other)
From source file:kr.debop4j.timeperiod.calendars.CalendarDateAdd.java
License:Apache License
@Override public DateTime add(DateTime start, Duration offset, SeekBoundaryMode seekBoundary) { log.trace("add. start [{}] + offset [{}]? ?? ... seekBoundary=[{}]", start, offset, seekBoundary);/*from www. j a v a2 s . c o m*/ if (getWeekDays().size() == 0 && getExcludePeriods().size() == 0 && getWorkingHours().size() == 0) return start.plus(offset); Pair<DateTime, Duration> endPair = (offset.compareTo(ZERO) < 0) ? calculateEnd(start, Durations.negate(offset), SeekDirection.Backward, seekBoundary) : calculateEnd(start, offset, SeekDirection.Forward, seekBoundary); DateTime end = endPair.getV1(); log.trace("add. start [{}] + offset [{}] => end=[{}] seekBoundary=[{}]", start, offset, end, seekBoundary); return end; }
From source file:kr.debop4j.timeperiod.calendars.CalendarDateAdd.java
License:Apache License
@Override public DateTime subtract(DateTime start, Duration offset, SeekBoundaryMode seekBoundary) { log.trace("subtract. start [{}] - offset [{}]? ?? ... seekBoundary=[{}]", start, offset, seekBoundary);//from www . j a va2 s . c om if (getWeekDays().size() == 0 && getExcludePeriods().size() == 0 && getWorkingHours().size() == 0) return start.minus(offset); Pair<DateTime, Duration> endTuple = (offset.compareTo(ZERO) < 0) ? calculateEnd(start, Durations.negate(offset), SeekDirection.Forward, seekBoundary) : calculateEnd(start, offset, SeekDirection.Backward, seekBoundary); DateTime end = endTuple.getV1(); log.trace("subtract. start [{}] - offset [{}] => end=[{}] seekBoundary=[{}]", start, offset, end, seekBoundary); return end; }
From source file:kr.debop4j.timeperiod.calendars.CalendarDateAdd.java
License:Apache License
/** * ? offset ? ?? .//from w ww . ja va 2s. co m * * @param start ? * @param offset * @param seekDir ? * @param seekBoundary ? * @return ? ? ?, */ @Override protected Pair<DateTime, Duration> calculateEnd(DateTime start, Duration offset, SeekDirection seekDir, SeekBoundaryMode seekBoundary) { log.trace( "? offset ? ?? ... start=[{}], offset=[{}], seekDir=[{}], seekBoundary=[{}]", start, offset, seekDir, seekBoundary); Guard.shouldBe(offset.compareTo(ZERO) >= 0, "offset ? 0 ?? ? . offset=[%d]", offset.getMillis()); DateTime end = null; DateTime moment = start; Duration remaining = offset; WeekRange week = new WeekRange(start, getTimeCalendar()); while (week != null) { super.getIncludePeriods().clear(); super.getIncludePeriods().addAll(getAvailableWeekPeriods(week)); log.trace(" =[{}]", StringTool.listToString(super.getIncludePeriods())); Pair<DateTime, Duration> result = super.calculateEnd(moment, remaining, seekDir, seekBoundary); end = result.getV1(); remaining = result.getV2(); log.trace("? . end=[{}], remaining=[{}]", end, remaining); if (end != null || remaining == null) break; if (seekDir == SeekDirection.Forward) { week = findNextWeek(week); if (week != null) moment = week.getStart(); } else { week = findPreviousWeek(week); if (week != null) moment = week.getEnd(); } } log.trace( "? offset ? ?? . start=[{}], offset=[{}], seekDir=[{}], seekBoundary=[{}], end=[{}], remaining=[{}]", start, offset, seekDir, seekBoundary, end, remaining); return Pair.create(end, remaining); }
From source file:kr.debop4j.timeperiod.calendars.DateAdd.java
License:Apache License
/** start ? offset ? ?? . */ public DateTime add(DateTime start, Duration offset, SeekBoundaryMode seekBoundary) { if (isTraceEnable) log.trace("Add. start=[{}] + offset=[{}]? ?? . seekBoundaryMode=[{}]", start, offset, seekBoundary);//from ww w . j a va 2 s. c o m if (getIncludePeriods().size() == 0 && getExcludePeriods().size() == 0) return start.plus(offset); Pair<DateTime, Duration> results = offset.compareTo(Duration.ZERO) < 0 ? calculateEnd(start, Durations.negate(offset), SeekDirection.Backward, seekBoundary) : calculateEnd(start, offset, SeekDirection.Forward, seekBoundary); DateTime end = (results != null) ? results.getV1() : null; Duration remaining = (results != null) ? results.getV2() : null; if (isDebugEnable) log.debug( "Add. start=[{}] + offset=[{}] ? end=[{}], remaining=[{}]. seekBoundaryMode=[{}]", start, offset, end, remaining, seekBoundary); return end; }
From source file:kr.debop4j.timeperiod.calendars.DateAdd.java
License:Apache License
/** start ? offset ? ( ??) ?? . */ public DateTime subtract(DateTime start, Duration offset, SeekBoundaryMode seekBoundary) { if (isTraceEnable) log.trace("Subtract. start=[{}] - offset=[{}]? ?? . seekBoundaryMode=[{}]", start, offset, seekBoundary); Pair<DateTime, Duration> results = offset.compareTo(Duration.ZERO) < 0 ? calculateEnd(start, Durations.negate(offset), SeekDirection.Forward, seekBoundary) : calculateEnd(start, offset, SeekDirection.Backward, seekBoundary); DateTime end = (results != null) ? results.getV1() : null; Duration remaining = (results != null) ? results.getV2() : null; if (isDebugEnable) log.debug(/*from w ww . ja v a 2s.c o m*/ "Subtract. start=[{}] - offset=[{}] ? end=[{}], remaining=[{}]. seekBoundaryMode=[{}]", start, offset, end, remaining, seekBoundary); return end; }
From source file:kr.debop4j.timeperiod.calendars.DateAdd.java
License:Apache License
/** * ? offset ? ?? .// w w w .j a v a 2s . c om * * @param start ? * @param offset * @param seekDir ? * @param seekBoundary ? * @return ? ?, */ protected Pair<DateTime, Duration> calculateEnd(DateTime start, Duration offset, SeekDirection seekDir, SeekBoundaryMode seekBoundary) { if (isTraceEnable) log.trace( "? ? ?? ... start=[{}], offset=[{}], seekDir=[{}], seekBoundary=[{}]", start, offset, seekDir, seekBoundary); shouldBe(offset.compareTo(Duration.ZERO) >= 0, "offset? 0 ??? . offset=[%d]", offset.getMillis()); Duration remaining = offset; DateTime end; // search periods ITimePeriodCollection searchPeriods = new TimePeriodCollection(this.includePeriods); if (searchPeriods.size() == 0) searchPeriods.add(TimeRange.Anytime); // available periods ITimePeriodCollection availablePeriods = new TimePeriodCollection(); if (excludePeriods.size() == 0) { availablePeriods.addAll(searchPeriods); } else { if (isTraceEnable) log.trace(" ? ."); TimeGapCalculator<TimeRange> gapCalculator = new TimeGapCalculator<>(); for (ITimePeriod p : searchPeriods) { if (excludePeriods.hasOverlapPeriods(p)) { if (isTraceEnable) log.trace(" ? ? ? "); for (ITimePeriod gap : gapCalculator.getGaps(excludePeriods, p)) availablePeriods.add(gap); } else { availablePeriods.add(p); } } } if (availablePeriods.size() == 0) { if (isTraceEnable) log.trace(" period ."); return Pair.create(null, remaining); } if (isTraceEnable) log.trace(" ? ? ? ..."); TimePeriodCombiner periodCombiner = new TimePeriodCombiner<TimeRange>(); availablePeriods = periodCombiner.combinePeriods(availablePeriods); if (isTraceEnable) log.trace(" ? ."); Pair<ITimePeriod, DateTime> result = (seekDir == SeekDirection.Forward) ? findNextPeriod(start, availablePeriods) : findPrevPeriod(start, availablePeriods); ITimePeriod startPeriod = result.getV1(); DateTime seekMoment = result.getV2(); // ? . if (startPeriod == null) { if (isTraceEnable) log.trace(" ? ."); return Pair.create(null, remaining); } // offset ? 0 ??, ? ? seekMoment . if (offset.isEqual(Duration.ZERO)) { if (isTraceEnable) log.trace("offset ? 0?, ? ? seekMoment ."); return Pair.create(seekMoment, remaining); } if (seekDir == SeekDirection.Forward) { for (int i = availablePeriods.indexOf(startPeriod); i < availablePeriods.size(); i++) { ITimePeriod gap = availablePeriods.get(i); Duration gapRemaining = new Duration(seekMoment, gap.getEnd()); if (isTraceEnable) log.trace("Seek forward. gap=[{}], gapRemaining=[{}], remaining=[{}], seekMoment=[{}]", gap, gapRemaining, remaining, seekMoment); boolean isTargetPeriod = (seekBoundary == SeekBoundaryMode.Fill) ? gapRemaining.compareTo(remaining) >= 0 : gapRemaining.compareTo(remaining) > 0; if (isTargetPeriod) { end = seekMoment.plus(remaining); remaining = null; return Pair.create(end, remaining); } remaining = remaining.minus(gapRemaining); if (i == availablePeriods.size() - 1) return Pair.create(null, remaining); seekMoment = availablePeriods.get(i + 1).getStart(); // next period } } else { for (int i = availablePeriods.indexOf(startPeriod); i >= 0; i--) { ITimePeriod gap = availablePeriods.get(i); Duration gapRemaining = new Duration(gap.getStart(), seekMoment); if (isTraceEnable) log.trace("Seek backward. gap=[{}], gapRemaining=[{}], remaining=[{}], seekMoment=[{}]", gap, gapRemaining, remaining, seekMoment); boolean isTargetPeriod = (seekBoundary == SeekBoundaryMode.Fill) ? gapRemaining.compareTo(remaining) >= 0 : gapRemaining.compareTo(remaining) > 0; if (isTargetPeriod) { end = seekMoment.minus(remaining); remaining = null; return Pair.create(end, remaining); } remaining = remaining.minus(gapRemaining); if (i == 0) return Pair.create(null, remaining); seekMoment = availablePeriods.get(i - 1).getEnd(); } } if (isTraceEnable) log.trace(" ?? ."); return Pair.create(null, remaining); }
From source file:kr.debop4j.timeperiod.calendars.DateAdd.java
License:Apache License
/** * start periods? ? ? ? ? , start period . * * @param start ??//from w w w .j ava 2s . co m * @param periods ? * @return period ? ?? */ private static Pair<ITimePeriod, DateTime> findNextPeriod(DateTime start, Iterable<? extends ITimePeriod> periods) { if (isTraceEnable) log.trace("?? ? ? ... start=[{}], periods=[{}]", start, StringTool.listToString(periods)); ITimePeriod nearest = null; DateTime moment = start; Duration difference = TimeSpec.MaxDuration; for (ITimePeriod period : periods) { // ? start ??? (before) if (period.getEnd().compareTo(start) < 0) continue; // start ? ?... if (period.hasInside(start)) { nearest = period; moment = start; break; } // ? ? ? Duration periodToMoment = new Duration(start, period.getStart()); if (periodToMoment.compareTo(difference) >= 0) continue; difference = periodToMoment; nearest = period; moment = period.getStart(); } if (isTraceEnable) log.trace("?? ? ? . start=[{}], moment=[{}], neearest=[{}]", start, moment, nearest); return Pair.create(nearest, moment); }
From source file:kr.debop4j.timeperiod.calendars.DateAdd.java
License:Apache License
/** * start periods ? ? ? ? , start period . * * @param start ??//w w w .j a v a 2 s. c om * @param periods ? * @return period ? ?? */ private static Pair<ITimePeriod, DateTime> findPrevPeriod(DateTime start, Iterable<? extends ITimePeriod> periods) { if (isTraceEnable) log.trace("?? ? ? ... start=[{}], periods=[{}]", start, StringTool.listToString(periods)); ITimePeriod nearest = null; DateTime moment = start; Duration difference = TimeSpec.MaxDuration; for (ITimePeriod period : periods) { // ? start ??? (after) if (period.getStart().compareTo(start) > 0) continue; // start ? ?... if (period.hasInside(start)) { nearest = period; moment = start; break; } // ? ? ? Duration periodToMoment = new Duration(start, period.getEnd()); if (periodToMoment.compareTo(difference) >= 0) continue; difference = periodToMoment; nearest = period; moment = period.getEnd(); } if (isTraceEnable) log.trace("?? ? ? . start=[{}], moment=[{}], neearest=[{}]", start, moment, nearest); return Pair.create(nearest, moment); }
From source file:kr.debop4j.timeperiod.DateTimeSet.java
License:Apache License
@Override public boolean isMoment() { Duration duration = getDuration(); return (duration != null) && (duration.compareTo(Duration.ZERO) == 0); }
From source file:kr.debop4j.timeperiod.test.samples.TimeBlockPeriodRelationTestData.java
License:Apache License
public TimeBlockPeriodRelationTestData(DateTime start, DateTime end, Duration duration) { Guard.shouldBe(duration.compareTo(Duration.ZERO) >= 0, "duration? 0??? ? ."); setReference(new TimeBlock(start, end, true)); DateTime beforeEnd = start.minus(duration); DateTime beforeStart = beforeEnd.minus(reference.getDuration()); DateTime insideStart = start.plus(duration); DateTime insideEnd = end.minus(duration); DateTime afterStart = end.plus(duration); DateTime afterEnd = afterStart.plus(reference.getDuration()); after = new TimeBlock(beforeStart, beforeEnd, true); startTouching = new TimeBlock(beforeStart, start, true); startInside = new TimeBlock(beforeStart, insideStart, true); insideStartTouching = new TimeBlock(start, afterStart, true); enclosingStartTouching = new TimeBlock(start, insideEnd, true); enclosing = new TimeBlock(insideStart, insideEnd, true); enclosingEndTouching = new TimeBlock(insideStart, end, true); exactMatch = new TimeBlock(start, end, true); inside = new TimeBlock(beforeStart, afterEnd, true); insideEndTouching = new TimeBlock(beforeStart, end, true); endInside = new TimeBlock(insideEnd, afterEnd, true); endTouching = new TimeBlock(end, afterEnd, true); before = new TimeBlock(afterStart, afterEnd, true); allPeriods.add(reference);/*from w w w. j av a 2s . c o m*/ allPeriods.add(after); allPeriods.add(startTouching); allPeriods.add(startInside); allPeriods.add(insideStartTouching); allPeriods.add(enclosingStartTouching); allPeriods.add(enclosing); allPeriods.add(enclosingEndTouching); allPeriods.add(exactMatch); allPeriods.add(inside); allPeriods.add(insideEndTouching); allPeriods.add(endInside); allPeriods.add(endTouching); allPeriods.add(before); }