2009-09-17 6 views
56

Estoy usando la biblioteca Joda-Time con Java. Tengo algunas dificultades para convertir un objeto Período en una cadena con el formato "x días, x horas, x minutos".Período de la cadena

Estos objetos de período se crean primero añadiéndoles una cantidad de segundos (se serializan en XML como segundos y luego se vuelven a crear a partir de ellos). Si simplemente uso los métodos de getHours() etc. en ellos, todo lo que obtengo es cero y el total de cantidad de segundos con getSeconds.

¿Cómo puedo hacer que Joda calcule los segundos en los campos respectivos, como días, horas, etc.?

+1

Relacionado: http://stackoverflow.com/q/10829870/11236 – ripper234

Respuesta

91

Necesita normalizar el período porque si lo construye con el número total de segundos, entonces ese es el único valor que tiene. La normalización se romperá abajo en el número total de días, minutos, segundos, etc.

Editar por ripper234 - Adición de una TL;DR version:

public static void main(String[] args) { 
    PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder() 
    .appendDays() 
    .appendSuffix(" day", " days") 
    .appendSeparator(" and ") 
    .appendMinutes() 
    .appendSuffix(" minute", " minutes") 
    .appendSeparator(" and ") 
    .appendSeconds() 
    .appendSuffix(" second", " seconds") 
    .toFormatter(); 

    Period period = new Period(72, 24, 12, 0); 

    System.out.println(daysHoursMinutes.print(period)); 
    System.out.println(daysHoursMinutes.print(period.normalizedStandard())); 
} 

imprimirá: PeriodFormat.getDefault().print(period)

Por ejemplo :

24 minutes and 12 seconds
3 days and 24 minutes and 12 seconds

Para que pueda ver la salida para el período no normalizado simplemente ignora el número de horas (no convirtió las 72 horas a 3 días).

+0

o.O ... Supongo que debería haber sido más detallado. – Jherico

+0

Gracias por la excelente respuesta. –

+1

-1 de mí, porque esto es difícil de localizar. – Trejkaz

12
Period period = new Period(); 
    // prints 00:00:00 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
    period = period.plusSeconds(60 * 60 * 12); 
    // prints 00:00:43200 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
    period = period.normalizedStandard(); 
    // prints 12:00:00 
    System.out.println(String.format("%02d:%02d:%02d", period.getHours(), period.getMinutes(), period.getSeconds())); 
+2

Lástima que no se puede pasar la cadena de formato a Período o su formateador para obtener este efecto. – greenoldman

22

También puede utilizar el formateador predeterminado, lo cual es bueno para la mayoría de los casos:

Period period = new Period(startDate, endDate); 
System.out.println(PeriodFormat.getDefault().print(period)) 
+0

No diría "la mayoría de los casos", pero es útil, sí. – skaffman

+0

Debe ser parte de la respuesta aceptada. – ripper234

+0

Si sus usuarios realmente se preocupan por el número de segundos de facción, sin embargo, es muy útil. –

2
PeriodFormatter daysHoursMinutes = new PeriodFormatterBuilder() 
    .appendDays() 
    **.appendSuffix(" day", " days") 
    .appendSeparator(" and ") 
    .appendMinutes() 
    .appendSuffix(" minute", " minutes")** 
    .appendSeparator(" and ") 
    .appendSeconds() 
    .appendSuffix(" second", " seconds") 
    .toFormatter(); 

que se está perdiendo las horas, es por eso. Agregar horas después de días y problema resuelto.

Cuestiones relacionadas