Чтобы получить разницу между двумя датами, вы можете использовать ThreeTen Backport, отличный бэкпорт для Java 8. новые классы даты/времени. А для Android есть ThreeTenABP (подробнее о том, как его использовать здесь).
Сначала я разобрал строки в объект LocalDateTime
, а затем получил разницу между этими датами. API создал 2 разных понятия «разница во времени/количество времени»: Period
, количество времени, основанное на дате (в годах, месяцах и днях), и Duration
, количество времени, основанное на времени (в с точки зрения секунд).
import org.threeten.bp.Duration;
import org.threeten.bp.LocalDate;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.LocalTime;
import org.threeten.bp.Period;
import org.threeten.bp.format.DateTimeFormatter;
String time1 = "2017-06-18 07:00:00"; // set time
String curtime = "2017-06-19 07:00:01"; // get the current time
// parse the strings to a date object
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime t1 = LocalDateTime.parse(time1, fmt);
LocalDateTime cur = LocalDateTime.parse(curtime, fmt);
// get the period between the dates
LocalDate startDate = t1.toLocalDate();
LocalDate endDate = cur.toLocalDate();
Period period = Period.ZERO;
if (startDate != null && endDate != null) {
period = Period.between(startDate, endDate);
}
// get the duration between the dates
LocalTime startTime = t1.toLocalTime();
LocalTime endTime = cur.toLocalTime();
startTime = startTime != null ? startTime : LocalTime.MIDNIGHT;
endTime = endTime != null ? endTime : LocalTime.MIDNIGHT;
Duration duration = Duration.between(startTime, endTime);
StringBuilder sb = new StringBuilder();
append(sb, period.getYears(), "year");
append(sb, period.getMonths(), "month");
append(sb, period.getDays(), "day");
long seconds = duration.getSeconds();
long hours = seconds / 3600;
append(sb, hours, "hour");
seconds -= (hours * 3600);
long minutes = seconds / 60;
append(sb, minutes, "minute");
seconds -= (minutes * 60);
append(sb, seconds, "second");
System.out.println(sb.toString()); // 1 day 1 second
// auxiliary method
public void append(StringBuilder sb, long value, String text) {
if (value > 0) {
if (sb.length() > 0) {
sb.append(" ");
}
sb.append(value).append(" ");
sb.append(text);
if (value > 1) {
sb.append("s"); // append "s" for plural
}
}
}
Результат:
1 день 1 секунда
Обратите внимание, что класс Period
уже разделяет поля (годы, месяцы и дни), в то время как класс Duration
хранит только секунды (поэтому для получения правильных результатов необходимы некоторые вычисления) — на самом деле у него есть такие методы, как toHours()
, но он только преобразует секунды в часы, и он не разделяет все поля, как мы хотим.
Вы можете настроить метод append()
в нужном вам формате. Я просто использовал простой способ печати value + text
, но вы можете изменить его в соответствии со своими потребностями.
Java новый API даты/времени
Для Java >= 8 существует новый API java.time. Вы можете использовать этот новый API и проект ThreeTen Extra, имеющий класс PeriodDuration
(a сочетание Period
и Duration
).
Код в основном такой же, как и выше, с той лишь разницей, что имена пакетов (в Java 8 — java.time
, а в ThreeTen Backport (или ThreeTenABP для Android) — org.threeten.bp
), но классы и методы имена — это такой же.
import org.threeten.extra.PeriodDuration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
String time1 = "2017-06-18 07:00:00"; // set time
String curtime = "2017-06-19 07:00:01"; // get the current time
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime t1 = LocalDateTime.parse(time1, fmt);
LocalDateTime cur = LocalDateTime.parse(curtime, fmt);
PeriodDuration pd = PeriodDuration.between(t1, cur);
StringBuilder sb = new StringBuilder();
append(sb, pd.getPeriod().getYears(), "year");
append(sb, pd.getPeriod().getMonths(), "month");
append(sb, pd.getPeriod().getDays(), "day");
long seconds = pd.getDuration().getSeconds();
long hours = seconds / 3600;
append(sb, hours, "hour");
seconds -= (hours * 3600);
long minutes = seconds / 60;
append(sb, minutes, "minute");
seconds -= (minutes * 60);
append(sb, seconds, "second");
System.out.println(sb.toString()); // 1 day 1 second
Конечно, вы также можете создать Period
и Duration
, используя тот же код версии org.threeten.bp
.
person
Community
schedule
19.06.2017
compareTo
- person IntelliJ Amiya   schedule 19.06.201710-2=8
, а не10-2=10 is bigger then 2
- person dreq   schedule 19.06.2017