Skip to content

Instantly share code, notes, and snippets.

@ncornette
Last active October 20, 2015 15:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ncornette/6586e38698a49bc6f56f to your computer and use it in GitHub Desktop.
Save ncornette/6586e38698a49bc6f56f to your computer and use it in GitHub Desktop.
package com.vsct;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
public class DateDiffTest {
@Test
public void test_DateDiff() throws Exception {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS ZZZ");
Date date1 = dateFormat.parse("2007-03-24T10:00:00.000 UTC");
Date date2 = dateFormat.parse("2007-03-25T12:01:01.001 UTC");
assertEquals("1 days 02h 01m 01s", daysDuration(date2.getTime() - date1.getTime()));
assertEquals("26h 01m 01s", hoursDuration(date2.getTime() - date1.getTime()));
}
/**
* Formats Date/Time difference to String in hours
*/
public static String hoursDuration(long durationMillis) {
DateDiff dateDiff = new DateDiff(durationMillis, TimeUnit.HOURS);
return String.format("%02dh %02dm %02ds",
dateDiff.get(TimeUnit.HOURS),
dateDiff.get(TimeUnit.MINUTES),
dateDiff.get(TimeUnit.SECONDS));
}
/**
* Formats Date/Time difference to String in days
*/
public static String daysDuration(long durationMillis) {
DateDiff dateDiff = new DateDiff(durationMillis, TimeUnit.DAYS);
long days = dateDiff.get(TimeUnit.DAYS);
return String.format((days>0 ? "%d days " : "") + "%02dh %02dm %02ds",
dateDiff.get(TimeUnit.DAYS),
dateDiff.get(TimeUnit.HOURS),
dateDiff.get(TimeUnit.MINUTES),
dateDiff.get(TimeUnit.SECONDS));
}
/**
* Calculates Time units for a Date Difference
*/
private static class DateDiff {
private static final TimeUnit[] TIME_UNITS = TimeUnit.values();
long[] mTimeUnitResult = new long[TIME_UNITS.length];
public DateDiff(long millis) {
this(millis, TimeUnit.DAYS);
}
public DateDiff(long millis, TimeUnit baseUnit) {
for (int r = baseUnit.ordinal(); r >= 0; r--) {
TimeUnit unit = TIME_UNITS[r];
mTimeUnitResult[r] = unit.convert(millis, TimeUnit.MILLISECONDS);
millis -= unit.toMillis(mTimeUnitResult[r]);
}
}
public long get(TimeUnit unit) {
return mTimeUnitResult[unit.ordinal()];
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment