Обратный отсчет до Рождества с Joda-Time

Я пытаюсь реализовать Joda-Time для обратного отсчета до Рождества, но пока поражен. Я попробовал java.util.Date, и большинство вопросов и ответов StackOverflow предлагали использовать Joda-Time. Но я не могу заставить его работать. Некоторые коды дают разные ответы.

Вот несколько кодов, которые я пробовал,

DateTime now = new DateTime();
DateTime christmas = new DateTime(2012, 12, 25, 8, 0, 0, 0);
Days daysToChristmas = Days.daysBetween(today, christmas); 
System.out.println(daysToChristmas.toString());

И это печатает P187D в качестве ответа.

DateTime start = new DateTime(DateTime.now());
DateTime end = new DateTime(2012, 12, 25, 0, 0, 0 ,0);
Interval interval = new Interval(start, end);
Period period = interval.toPeriod();
System.out.println("Seconds " + period.getSeconds());
System.out.println("Minutes " + period.getMinutes());
System.out.println("Hours " + period.getHours());
System.out.println("Days " + period.getDays());

И это печатает следующий результат,

Seconds 36
Minutes 21
Hours 7
Days 4

Где я ошибся?


person Isuru Madusanka    schedule 20.06.2012    source источник
comment
Что не так с первым кодом?   -  person Emil Vikström    schedule 20.06.2012
comment
Он печатает P187D. Как мне получить дни, часы, минуты и секунды от этого объекта?   -  person Isuru Madusanka    schedule 20.06.2012


Ответы (3)


Вы должны использовать Period, чтобы определить количество месяцев/дней/и т. д.:

Period period = new Period(start, end);

Преобразование Interval в период тоже было бы хорошо, но перегрузка без параметров включает все единицы периода, и вы не печатали месяцы.

Теперь, если вам нужны только дни, часы, минуты, секунды, вам нужно создать соответствующий PeriodType, например.

PeriodType periodType = PeriodType.dayTime().withMillisRemoved();
Period period = new Period(start, end, periodType);

Затем вы можете запросить эти отдельные поля, и все должно быть хорошо.

(На самом деле вы могли бы использовать только dayTime(), учитывая, что милли не будут мешать чему-либо еще.)

Таким образом, вы можете либо построить свой период непосредственно из start и end, как указано выше, либо, если вы хотите сохранить Interval, вы можете использовать:

Period period = interval.toPeriod(periodType);
person Jon Skeet    schedule 20.06.2012
comment
Я не могу поверить, что говорю это именно тебе, но… я полагаю, что ты ошибаешься в первом предложении. Класс Interval действительно понимает начало и заканчивающиеся объекты DateTime. Я подозреваю, что вы перепутали Interval с Duration класс. В Joda-Time Duration — это промежуток времени в миллисекундах без позиции на временной шкале. Использование интервала в примере кода Вопроса правильно, если в этом нет необходимости. - person Basil Bourque; 02.03.2014
comment
@BasilBourque: Вы определенно правы, что я запутался с продолжительностью. Interval, на мой взгляд, по-прежнему логически является неправильным типом, поскольку задокументировано, что это время между двумя моментами, а это означает, что хронология не должна использоваться, однако Interval также хранит Chronology , так что вы действительно можете вернуть соответствующие конечные точки как значения DateTime. Я думаю, что, вероятно, лучше всего просто вычистить первые пару предложений, что я и сделаю сейчас :) - person Jon Skeet; 02.03.2014
comment
@BasilBourque: В конце концов, я решил немного изменить структуру. Большое спасибо за поправку! - person Jon Skeet; 02.03.2014

Первый код печатает P187D в формате ISO 8601.

Второй код печатает только 4 дня, потому что вы пропустили месяцы (period.getMonths()).

person tibtof    schedule 20.06.2012
comment
Ну, есть ли способ преобразовать месяцы в даты, мне не нужны месяцы, мне нужны дни. - person Isuru Madusanka; 20.06.2012

Вы можете использовать этот код.

DateTime dt1 = new DateTime();
DateTime dt2 = new DateTime(2012, 12, 25, 0, 0, 0, 0);
int seconds=Seconds.secondsBetween(dt1, dt2).getSeconds();

int noOfDays=seconds/(24*60*60);
int noOfHours=(seconds%(24*60*60))/(60*60);
int noOfMinutes=((seconds%(24*60*60))%(60*60))/60;
int noSec=((seconds%(24*60*60))%(60*60))%60;

System.out.println("Time Left For christmas");
System.out.println("Days Left="+noOfDays+" Hours="+noOfHours+" Minutes="+noOfMinutes+" Seconds="+noSec);
person Akhi    schedule 20.06.2012