2009-09-17 1 views
56

Я использую библиотеку Joda-Time с Java. У меня возникли трудности с попыткой превратить объект Period в строку в формате «x days, x hours, x minutes».Период до строки

Эти объекты Period сначала создаются путем добавления к ним секунд (они преобразуются в XML как секунды, а затем воссоздаются с них). Если я просто использую методы getHours() и т.д. в них, все, что я получаю, равно нулю, а всего количество секунд с помощью getSeconds.

Как сделать Joda рассчитать секунды в соответствующие поля, например, дни, часы и т. Д.??

+1

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

ответ

91

Нужно нормализовать период, потому что если вы построите его с общим количеством секунд, то это единственное значение, которое оно имеет. Нормализация будет разбить его на общее число дней, минут, секунд и т.д.

Редактируйте ripper234 - Добавление TL;DR version: PeriodFormat.getDefault().print(period)

Например:

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())); 
} 

Напечатает :

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

Итак, вы можете видеть, что выход для ненормированного периода просто игнорирует количество часов (он не конвертировал 72 часа в 3 дня).

+0

o.O ... Думаю, я должен был быть более подробным. – Jherico

+0

Спасибо за отличный ответ. –

+1

-1 от меня, потому что это трудно локализовать. – 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

Жаль, что вы не можете передать строку формата в Period или ее Formatter, чтобы получить этот эффект. – greenoldman

22

Вы также можете использовать форматировщик по умолчанию, который хорош для большинства случаев:

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

Я бы не сказал «большинство случаев», но это полезно, да. – skaffman

+0

Должно быть частью принятого ответа. – ripper234

+0

Если ваши пользователи действительно заботятся о количестве секунд фракции, то все же это очень полезно. –

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

вам не хватает часов, вот почему. Добавление часов после нескольких дней и решение проблемы.

Смежные вопросы