All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.intelie.pipes.time.CalendarPeriodBase Maven / Gradle / Ivy

There is a newer version: 0.25.5
Show newest version
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;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy