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

humanize.time.DurationHelper Maven / Gradle / Ivy

The newest version!
package humanize.time;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.ocpsoft.prettytime.Duration;
import org.ocpsoft.prettytime.PrettyTime;
import org.ocpsoft.prettytime.TimeUnit;
import org.ocpsoft.prettytime.impl.DurationImpl;

import com.google.common.base.Preconditions;

/**
 * Helper to create {@link Duration}s outside {@link PrettyTime}.
 * 
 */
public class DurationHelper
{

    public static Duration calculateDuration(Date ref, Date then, List timeUnits)
    {
        return calculateDuration(then.getTime() - ref.getTime(), timeUnits);
    }

    public static Duration calculateDuration(long difference, List timeUnits)
    {
        long absoluteDifference = Math.abs(difference);

        List units = new ArrayList(timeUnits);

        DurationImpl result = new DurationImpl();

        for (int i = 0; i < units.size(); ++i)
        {
            TimeUnit unit = (TimeUnit) units.get(i);
            long millisPerUnit = Math.abs(unit.getMillisPerUnit());
            long quantity = Math.abs(unit.getMaxQuantity());

            boolean isLastUnit = i == units.size() - 1;

            if ((0L == quantity) && (!(isLastUnit)))
            {
                quantity = ((TimeUnit) units.get(i + 1)).getMillisPerUnit() / unit.getMillisPerUnit();
            }

            if ((millisPerUnit * quantity <= absoluteDifference) && (!(isLastUnit)))
                continue;
            result.setUnit(unit);
            if (millisPerUnit > absoluteDifference)
            {
                result.setQuantity(0L > difference ? -1L : 1L);
            } else
            {
                result.setQuantity(difference / millisPerUnit);
            }
            result.setDelta(difference - (result.getQuantity() * millisPerUnit));
            break;
        }

        return result;
    }

    public static List calculatePreciseDuration(Date ref, Date then, List units)
    {
        Preconditions.checkNotNull(then, "Date to calculate must not be null.");

        if (null == ref)
        {
            ref = new Date();
        }

        List result = new ArrayList();
        long difference = then.getTime() - ref.getTime();
        Duration duration = calculateDuration(difference, units);
        result.add(duration);
        while (0L != duration.getDelta())
        {
            duration = calculateDuration(duration.getDelta(), units);
            result.add(duration);
        }
        return result;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy