net.intelie.pipes.time.CalendarPeriodBase Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of pipes-api Show documentation
Show all versions of pipes-api Show documentation
Intelie Pipes' API classes and interfaces
package net.intelie.pipes.time;
import java.time.DayOfWeek;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
public class CalendarPeriodBase implements PeriodBase {
private static final long serialVersionUID = 1L;
private final int amount;
private final ChronoField field;
private final ZoneId zone;
public CalendarPeriodBase(int amount, ChronoField field, ZoneId zone) {
this.amount = amount;
this.field = field;
this.zone = zone;
}
@Override
public long add(long timestamp) {
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zone).plus(amount, field.getBaseUnit()).toInstant().toEpochMilli();
}
@Override
public long sub(long timestamp) {
return ZonedDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zone).minus(amount, field.getBaseUnit()).toInstant().toEpochMilli();
}
@Override
public long floor(long timestamp) {
ZonedDateTime date = ZonedDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zone);
ZonedDateTime roundedFloor = truncate(date);
return roundedFloor.minus((date.get(field) - 1) % amount, field.getBaseUnit()).toInstant().toEpochMilli();
}
private ZonedDateTime truncate(ZonedDateTime date) {
if (field == ChronoField.YEAR)
return date.with(TemporalAdjusters.firstDayOfYear()).truncatedTo(ChronoUnit.DAYS);
if (field == ChronoField.MONTH_OF_YEAR)
return date.with(TemporalAdjusters.firstDayOfMonth()).truncatedTo(ChronoUnit.DAYS);
if (field == ChronoField.ALIGNED_WEEK_OF_YEAR)
return date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).truncatedTo(ChronoUnit.DAYS);
return date.truncatedTo(field.getBaseUnit());
}
@Override
public long estimateMillis() {
return field.getBaseUnit().getDuration().toMillis() * amount;
}
}