1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| package test;
import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
public class ElapsedTime {
private static final List TIME_CONSTANTS = Arrays.asList(new Integer[] {
new Integer(Calendar.MILLISECOND)
, new Integer(Calendar.SECOND)
, new Integer(Calendar.MINUTE)
, new Integer(Calendar.HOUR_OF_DAY)
, new Integer(Calendar.DATE)
, new Integer(Calendar.MONTH)
, new Integer(Calendar.YEAR)
});
public static long elapsedTime(GregorianCalendar c1, GregorianCalendar c2, int type) {
return elapsedTime(c1, c2, type, false);
}
public static long elapsedTime(GregorianCalendar c1, GregorianCalendar c2, int type, boolean clear) {
long elapsed = 0;
GregorianCalendar gc1;
GregorianCalendar gc2;
Integer t = new Integer(type);
if (!TIME_CONSTANTS.contains(t)) {
throw new IllegalArgumentException("bad required Calendar type for elapsed time calculation");
}
if (c1.before(c2)) {
gc1 = (GregorianCalendar) c1.clone();
gc2 = (GregorianCalendar) c2.clone();
} else {
gc1 = (GregorianCalendar) c2.clone();
gc2 = (GregorianCalendar) c1.clone();
}
// At this point "gc1 <= gc2"
if (clear) {
// We only clear MILLISECONDS, SECONDS, MINUTE, HOUR regarding the type asked
for (int i = 0; i <= TIME_CONSTANTS.indexOf(t) && i < 4; i++) {
gc1.set(((Integer)TIME_CONSTANTS.get(i)).intValue(), 0);
gc2.set(((Integer)TIME_CONSTANTS.get(i)).intValue(), 0);
}
}
// Regarding what we ask for elpased time
// We use different calculation type
if (TIME_CONSTANTS.indexOf(t) > 3) {
// With such a computation Calendar is responsible of bissextil years and more problems on date
gc1.add(t.intValue(), 1);
while (gc1.before(gc2) || gc1.equals(gc2)) {
gc1.add(t.intValue(), 1);
elapsed++;
}
} else {
// A faster one for MILLISECONDS/SECONDS/MINUTES/HOUR
long millis = gc2.getTimeInMillis() - gc1.getTimeInMillis();
if (type==Calendar.MILLISECOND) {
elapsed = millis;
} else if (type==Calendar.SECOND) {
elapsed = millis / 1000;
} else if (type==Calendar.MINUTE) {
elapsed = millis / (1000 * 60);
} else if (type==Calendar.HOUR_OF_DAY) {
elapsed = millis / (1000 * 60 * 24);
}
}
return elapsed;
}
public static void main(String[] args) {
GregorianCalendar c1 = new GregorianCalendar(2002, 02, 01);
GregorianCalendar c2 = new GregorianCalendar(2005, 01, 01);
printElapsedTime(c1, c2, true);
c1 = new GregorianCalendar(2002, 02, 01, 12, 0, 0);
c2 = new GregorianCalendar(2002, 02, 01, 15, 1, 1);
printElapsedTime(c1, c2, false);
c2.set(Calendar.MILLISECOND, 115);
printElapsedTime(c1, c2, false);
printElapsedTime(c1, c2, true);
}
private static void printElapsedTime(GregorianCalendar c1, GregorianCalendar c2, boolean clear) {
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss SSS");
System.out.println(MessageFormat.format("calcul de temps écoulé entre {0} et {1}, clear mode [{2}]", new Object[] {df.format(c1.getTime()), df.format(c2.getTime()), Boolean.valueOf(clear)}));
System.out.println("années: " + ElapsedTime.elapsedTime(c1, c2, Calendar.YEAR, clear));
System.out.println("mois: " + ElapsedTime.elapsedTime(c1, c2, Calendar.MONTH, clear));
System.out.println("jours: " + ElapsedTime.elapsedTime(c1, c2, Calendar.DATE, clear));
System.out.println("heures: " + ElapsedTime.elapsedTime(c1, c2, Calendar.HOUR_OF_DAY, clear));
System.out.println("minutes: " + ElapsedTime.elapsedTime(c1, c2, Calendar.MINUTE, clear));
System.out.println("secondes: " + ElapsedTime.elapsedTime(c1, c2, Calendar.SECOND, clear));
System.out.println("millis: " + ElapsedTime.elapsedTime(c1, c2, Calendar.MILLISECOND, clear));
System.out.println("");
}
} |
Partager