package org.mafagafogigante.dungeon.date; import org.mafagafogigante.dungeon.util.DungeonMath; import org.jetbrains.annotations.NotNull; import java.io.Serializable; /** * Represents a nonnegative amount of time. */ public class Duration implements Comparable<Duration>, Serializable { /** * The duration, in milliseconds. */ private final long duration; /** * Constructs a Duration from a specified start date to an end date. * * @param start the starting instance * @param end the ending instance */ public Duration(@NotNull Date start, @NotNull Date end) { long difference = end.getTime() - start.getTime(); if (difference >= 0) { duration = difference; } else { throw new IllegalArgumentException("end is before start."); } } /** * Constructs a Duration from the specified duration, in milliseconds. * * @param duration the duration, in milliseconds */ Duration(long duration) { this.duration = duration; } public long getSeconds() { return duration / 1000; } @Override public int compareTo(@NotNull Duration duration) { return Long.compare(this.duration, duration.duration); } @Override public boolean equals(Object object) { if (this == object) { return true; } if (object == null || getClass() != object.getClass()) { return false; } Duration duration = (Duration) object; return this.duration == duration.duration; } @Override public int hashCode() { return (int) (duration ^ (duration >>> 32)); } @Override public String toString() { if (duration < DungeonTimeUnit.DAY.milliseconds) { return "Less than a day"; } TimeStringBuilder builder = new TimeStringBuilder(); int years = DungeonMath.safeCastLongToInteger(duration / DungeonTimeUnit.YEAR.milliseconds); long monthsLong = (duration % DungeonTimeUnit.YEAR.milliseconds) / DungeonTimeUnit.MONTH.milliseconds; int months = DungeonMath.safeCastLongToInteger(monthsLong); long daysLong = (duration % DungeonTimeUnit.MONTH.milliseconds) / DungeonTimeUnit.DAY.milliseconds; int days = DungeonMath.safeCastLongToInteger(daysLong); builder.set(DungeonTimeUnit.YEAR, years); builder.set(DungeonTimeUnit.MONTH, months); builder.set(DungeonTimeUnit.DAY, days); return builder.toString(); } }