Pregunta

Estoy teniendo problemas para usar PeriodFormatter de Joda Time. Quiero uno para informar de días, horas, minutos y segundos, pero mi intento parece estar envolviendo semanas. Lo que debería hacer de manera diferente?

import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;

public class Problems {

    public static void main(String[] args) {

        PeriodFormatter formatter = new PeriodFormatterBuilder()
            .printZeroNever()
            .appendDays()
            .appendSuffix(" day", " days")
            .appendSeparator(", ")
            .appendHours()
            .appendSuffix(" hour", " hours")
            .appendSeparator(", ")
            .appendMinutes()
            .appendSuffix(" minute", " minutes")
            .appendSeparator(", ")
            .appendSeconds()
            .appendSuffix(" second", " seconds")
            .toFormatter();

        DateTime now = new DateTime();
        DateTime justUnderAWeekAgo = now.minusDays(7).plusMinutes(1);
        DateTime justOverAWeekAgo = now.minusDays(7).minusMinutes(1);
        System.out.println(now);
        System.out.println(justUnderAWeekAgo);
        System.out.println(justOverAWeekAgo);
        // I am happy with the following:
        System.out.println(
            formatter.print(new Period(justUnderAWeekAgo, now)));
        // But not with this (outputs "1 minute" but I want "7 days, 1 minute"):
        System.out.println(
            formatter.print(new Period(justOverAWeekAgo, now)));
    }
}

EDIT: Creo que puedo ver por qué esto no está funcionando - es decir, que el formateador sólo imprime diversos valores de la época, y desde Períodos almacenar un valor de semanas, el valor para los días en mi periodo problema es de hecho 0. Pero todavía tengo una buena manera de hacer esto ...

¿Fue útil?

Solución

El problema en su caso es que usted no pide su PeriodFormatter para mostrar las semanas.

Dos posibilidades:

Solución 1: Mostrar la semana:

PeriodFormatter formatter = new PeriodFormatterBuilder()
        .printZeroNever()
        .appendWeeks()
        .appendSuffix(" week", " weeks")
        .appendSeparator(", ")
        .appendDays()
        .appendSuffix(" day", " days")
        .appendSeparator(", ")
        .appendHours()
        .appendSuffix(" hour", " hours")
        .appendSeparator(", ")
        .appendMinutes()
        .appendSuffix(" minute", " minutes")
        .appendSeparator(", ")
        .appendSeconds()
        .appendSuffix(" second", " seconds")
        .toFormatter();

La segunda salida en su ejemplo será:

1 week, 1 minute

Solución 2: mostrar sólo los días por lo que tendrá que utilizar el PeriodType.yearMonthDayTime():

new Period(justUndeAWeekAgo, now, PeriodType.yearMonthDayTime());

El uso de esta segunda solución, puede mantener su PeriodFormatter como lo es ahora. La segunda salida en su ejemplo será entonces:

7 days, 1 minute
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top