2012-06-05 4 views
2

Есть ли способ конвертировать 'x' секунды в y часы и z секунд, когда говорят x превышает 3600 секунд? Аналогично, преобразуйте его в «минуты и b секунд», когда x превышает 60, но меньше 3600 секунд, используя JodaTime? Я понимаю, что мне нужно будет указать, что мне нужно в PeriodFormatter, но я не хочу его указывать - мне нужен форматированный текст, основанный на значении секунд.Конвертировать секунды в несколько лет/дней/часов/минут, используя JodaTime?

Это похоже на то, как вы размещаете сообщения на форуме, а затем ваше сообщение будет отображаться как «опубликовано 10 секунд назад». Через 1 минуту вы увидите «опубликовано 1 минута 20 секунд назад», а также в течение нескольких недель, дней, лет.

+0

Итак, если вы знаете о 'PeriodFormatter', почему бы вам не написать вспомогательный класс с вашими конкретными правилами и не вернуть строку? – Thor

+0

не вижу смысла использовать JodaTime, если я должен сделать это сам. – Jay

+0

Возможный дубликат [Joda-Time: Period to string] (http://stackoverflow.com/questions/1440557/joda-time-period-to-string) – nfechner

ответ

10

Я не уверен, почему вы не хотите указывать, что вам нужно в PeriodFormatter. JodaTime не знает, как вы хотите отображать период в виде строки, поэтому вам нужно рассказать об этом через PeriodFormatter.

Поскольку 3600 секунд - 1 час, использование форматера правильно автоматически сделает это за вас. Вот пример кода, использующий несколько разных входов на одном и том же форматировании, который должен достичь желаемого результата.

Seconds s1 = Seconds.seconds(3601); 
    Seconds s2 = Seconds.seconds(2000); 
    Seconds s3 = Seconds.seconds(898298); 
    Period p1 = new Period(s1); 
    Period p2 = new Period(s2); 
    Period p3 = new Period(s3); 

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

    System.out.println(dhm.print(p1.normalizedStandard())); 
    System.out.println(dhm.print(p2.normalizedStandard())); 
    System.out.println(dhm.print(p3.normalizedStandard())); 

производит вывод ::

1 час и 1 секунда

33 минут и 20 секунд

3 дней и 9 часов и 31 минут и 38 секунд

+1

Примечание педанта: [1 час не всегда 3600 секунд] (http://en.wikipedia.org/wiki/Coordinated_Universal_Time). –

+1

уверен. :) 1 час - это не всегда 3600 секунд, но эй, если бы я был ракетостроительной фирмой, я бы не использовал JodaTime в первую очередь. – Jay

+0

В течение Joda-Time и, фактически, внутри Java, секунды прыжка игнорируются, поэтому 1 час фактически равен 3600 секунд – JodaStephen

2

Мне нравится предыдущий ответ, но этот вариант выглядит более читаемым:

PeriodFormat.getDefault().print(new Period(0, 0, yourSecondsValue, 0) 
    .normalizedStandard()) 
Смежные вопросы