ANDROID - Как отображать дату и время, которые уже прошли?

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

Пример :

time1 = 2017-06-18 07:00:00 //set time
curtime = 2017-06-19 07:00:01 //get the current time

TextView будет просто отображать 0 Years 0 Month 1 Days 00 Hours 00 Minutes 01 Seconds already passed_

Если у кого-то есть лучшее ключевое слово для меня, чтобы найти себя, я ценю это.

Ссылка: link1 но недостаточно для решения моей проблемы.


person dreq    schedule 19.06.2017    source источник
comment
Пожалуйста, поделитесь кодом, который вы придумали до сих пор.   -  person Sufian    schedule 19.06.2017
comment
stackoverflow.com/a/18719181/3395198   -  person IntelliJ Amiya    schedule 19.06.2017
comment
@Sufian я еще не набрал код, потому что я застрял, с чего мне начать   -  person dreq    schedule 19.06.2017
comment
@dreq используйте compareTo   -  person IntelliJ Amiya    schedule 19.06.2017
comment
@IntelliJAmiya, вы уверены, что указанная ссылка является динамической? потому что я сравниваю конкретное время с текущим временем   -  person dreq    schedule 19.06.2017
comment
@dreq, пожалуйста, поищите и приложите усилия для решения вопроса. Вы найдете некоторые вопросы, очень похожие на то, чего вы пытаетесь достичь. Также прочитайте Как задать хороший вопрос?.   -  person Sufian    schedule 19.06.2017
comment
@IntelliJAmiya данная ссылка просто отображается, если дата 1 выше или ниже даты 2, но мне нужно больше результатов, таких как 10-2=8, а не 10-2=10 is bigger then 2   -  person dreq    schedule 19.06.2017
comment
@Sufian, спасибо за предложение, но, как вы видите выше, я пытался найти учебник по моей проблеме, но до сих пор ничего не получил   -  person dreq    schedule 19.06.2017
comment
@dreq ссылка, которую вы дали, предназначена для таймера обратного отсчета, но ваш вопрос немного прост. Если вы покажете код, который вы разработали, это поможет нам понять, где вы застряли.   -  person Sufian    schedule 19.06.2017


Ответы (4)


Чтобы получить разницу между двумя датами, вы можете использовать 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
comment
спасибо за подробную функцию и код, я прочитаю документ, который вы привели выше, :) - person dreq; 19.06.2017

Проверьте DateUtils: https://developer.android.com/reference/android/text/format/DateUtils.html#getRelativeTimeSpanString(long,long,long)

Должен дать вам то, что вы ищете.

person Raanan    schedule 19.06.2017

Вам нужно создать Date объектов из Calendar объектов и сравнить их, чтобы узнать, сколько времени прошло.

Или вы можете использовать библиотеку даты и времени Joda, чтобы найти его.

Оформить

person gprathour    schedule 19.06.2017

Вы можете использовать java.time.Duration и java.time.Period, которые появились в Java-8. в рамках реализации JSR-310 для моделирования ISO_8601#Durations. В Java-9 были добавлены дополнительные удобные методы.

Демонстрация:

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("u-M-d H:m:s", Locale.ENGLISH);
        LocalDateTime startDateTime = LocalDateTime.parse("2017-06-18 07:00:00", dtf);

        // Use the following line for the curren date-time
        // LocalDateTime endDateTime = LocalDateTime.now(); 

        // Use the following line for a given end date-time string
        LocalDateTime endDateTime = LocalDateTime.parse("2017-06-19 07:00:01", dtf);

        Period period = startDateTime.toLocalDate().until(endDateTime.toLocalDate());
        Duration duration = Duration.between(startDateTime, endDateTime);

        // ############################ Java-8 ############################
        String periodDuration = String.format("%d Years %d Months %d Days %02d Hours %02d Minutes %02d Seconds",
                period.getYears(), period.getMonths(), period.getDays(), duration.toHours() % 24,
                duration.toMinutes() % 60, duration.toSeconds() % 60);
        System.out.println(periodDuration);
        // ############################ Java-8 ############################

        // ############################ Java-9 ############################
        periodDuration = String.format("%d Years %d Months %d Days %02d Hours %02d Minutes %02d Seconds",
                period.getYears(), period.getMonths(), period.getDays(), duration.toHoursPart(),
                duration.toMinutesPart(), duration.toSecondsPart());
        System.out.println(periodDuration);
        // ############################ Java-8 ############################
    }
}

Вывод:

0 Years 0 Months 1 Days 00 Hours 00 Minutes 01 Seconds
0 Years 0 Months 1 Days 00 Hours 00 Minutes 01 Seconds

Узнайте о современном API даты и времени из Trail: Date Time.

person Arvind Kumar Avinash    schedule 30.12.2020