Pregunta

He creado un método que toma dos fechas (en milisegundos) y devuelve una frase que indica la duración entre estas dos fechas.

Por el momento, tengo este código:

public static String formatDuration(long start, long end) {
    Interval interval = new Interval(start, end);
    return getPeriodFormatter().print(interval.toPeriod()).trim();
}

private static PeriodFormatter getPeriodFormatter() {
    PeriodFormatter pf = new PeriodFormatterBuilder().printZeroRarelyFirst()
        .appendYears().appendSuffix("y ", "y ")
        .appendMonths().appendSuffix("m" , "m ")
        .appendDays().appendSuffix("d ", "d ")
        .appendHours().appendSuffix("h ", "h ")
        .appendMinutes().appendSuffix("m ", "m ")
        .appendSeconds().appendSuffix("s ", "s ")
        .toFormatter();

    return pf;
}

Sin embargo, creo que entienden mal la forma en que debe definir un intervalo en JodaTime. Si intento el siguiente código de prueba:

@Test
public void foobar() {
    try {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy");
        long start = sdf.parse("10:30:00 24/06/2009").getTime();
        long end = sdf.parse("23:05:17 22/08/2009").getTime();
        System.out.println("Duration: " + formatDuration(start, end));
    } catch (Exception e) {
        e.printStackTrace();
        fail("Could not test duration.");
    }
}

Me da la siguiente salida, que está mal (sobre todo en la parte del día):

Duration: 1m 1d 12h 35m 17s

¿Cómo definir la duración correcta en JodaTime?


Ok, de hecho, lo olvidé en mi PeriodFormatter es anexar las semanas. Así que si añado las semanas, me sale el siguiente resultado, que es correcto:

Duration: 1m 4w 1d 12h 35m 17s

Así que mi pregunta cambia un poco: ¿Hay una manera de mostrar el número de días del mes en lugar de semanas o más días? En palabras de otros, en lugar de tener:

Duration: 1m 4w 1d 12h 35m 17s

Quiero tener:

Duration: 1m 29d 12h 35m 17s
¿Fue útil?

Solución

Probar.

    Period period = interval.toPeriod( PeriodType.yearMonthDayTime() );

Antes de formatear el período.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top