Дробное количество дней между объектами DateTime в Java
Как найти дробную разницу в днях между двумя экземплярами Joda-Time DateTime?
Days.daysBetween (начало, конец).getDays() дает мне круглое число, например, 10/15 и т. Д. Мне нужно получить точное значение, например, 10,15 или 15,78.
3 ответа
Вы можете пропустить минуты из-за округления, если вы используете Hours.hoursBetween .
Попробуйте это: (end.getMillis - start.getMillis())/(1000*3600*24)
Чтобы получить количество дней с дробной частью, вычислите разницу в достаточно малой единице для ваших требований к точности, затем преобразуйте в double
перед делением, которое преобразуется в дни:
DateTimeZone zone = DateTimeZone.forID("Europe/Copenhagen");
DateTime date1 = new DateTime(1997, 1, 1, 0, 0, zone);
DateTime date2 = new DateTime(1997, 3, 29, 12, 0, zone);
int seconds = Seconds.secondsBetween(date1, date2).getSeconds();
double days = (double) seconds / (double) TimeUnit.DAYS.toSeconds(1);
System.out.println("Difference in days is " + days);
Этот фрагмент выводит:
Разница в днях 87,5
Нам необходимо указать правильный часовой пояс, чтобы учесть переходы на летнее время (DST) и обратно. В моем примере оба дня относятся к стандартной части года в ЕС, поэтому 12 часов переводятся в 0,5 дня. Если дляdate2
Я выбрал дату в начале апреля, после того, как наступило летнее время, этого бы не случилось. Например:
DateTime date2 = new DateTime(1997, 4, 1, 12, 0, zone);
Разница в днях 90,45833333333333
Код будет работать с разницей примерно до 68 лет с момента int
удерживает только это количество секунд. Если вам нужен больший промежуток времени, подумайте об использовании минут или часов вместо секунд. Если вы передаете две даты, которые находятся слишком далеко друг от друга, Joda-Time достаточно дружелюбен, чтобы генерировать исключение, а не молчаливо давать вам неверный результат.
Этот ответ был написан по поводу этого повторяющегося вопроса, и примерные даты были взяты оттуда.
Вычтите время в миллис и разделите на количество миллис в день:
double diff = (end.getMillis() - start.getMillis()) / 86400000d;
Тестовое задание
DateTime start = new DateTime(2015, 1, 1, 0, 0, 0, 0); // Jan 1, 2015
DateTime end = new DateTime(2015, 7, 4, 14, 23, 55, 876); // Jul 4, 2015 at 2:23:55.876 PM
final int MILLIS_PER_DAY = 24 * 60 * 60 * 1000; // 86_400_000
double diff = (double)(end.getMillis() - start.getMillis()) / MILLIS_PER_DAY;
System.out.println(diff);
int days = (int)diff;
diff = (diff - days) * 24;
int hours = (int)diff;
diff = (diff - hours) * 60;
int minutes = (int)diff;
diff = (diff - minutes) * 60;
int seconds = (int)diff;
diff = (diff - seconds) * 1000;
int millis = (int)Math.round(diff);
System.out.println(days + " days, " +
hours + " hours, " +
minutes + " minutes, " +
seconds + " seconds, " +
millis + " millis");
Выход
184.55828560185185
184 days, 13 hours, 23 minutes, 55 seconds, 876 millis
Обратите внимание, что это только 13 часов, а не 14, из-за перехода на летнее время.
Спасибо за ввод комментариев, я получил его с точностью до секунды, используя:
double days = Seconds.secondsBetween(start, end).getSeconds()/86400;