Android разница между двумя датами в секундах
Я пробовал разные методы в Интернете, но не смог заставить его работать.
Cursor cursor = sqlite.myDataBase.rawQuery("SELECT StartDate, EndDate FROM Tracks Where Id="+'"'+trackId+'"',null);
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startDate = outputFormat.parse(cursor.getString(cursor.getColumnIndex("StartDate")));
Date endDate = outputFormat.parse(cursor.getString(cursor.getColumnIndex("EndDate")));
Таким образом, я получаю обе даты в хорошем формате. Теперь я хочу найти разницу между EndDate
а также Startdate
в секундах
Любой совет? Спасибо.
3 ответа
Вы можете превратить объект даты в long (миллисекунды с 1 января 1970 г.), а затем использовать TimeUnit
чтобы узнать количество секунд:
long diffInMs = endDate.getTime() - startDate.getTime();
long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMs);
Редактировать: -Исправлено имя переменной diffInMs, которая была записана diffInM(i) во второй строке.
Попробуйте ниже метод:-
public String twoDatesBetweenTime(String oldtime)
{
// TODO Auto-generated method stub
int day = 0;
int hh = 0;
int mm = 0;
try
{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date oldDate = dateFormat.parse(oldtime);
Date cDate = new Date();
Long timeDiff = cDate.getTime() - oldDate.getTime();
day = (int) TimeUnit.MILLISECONDS.toDays(timeDiff);
hh = (int) (TimeUnit.MILLISECONDS.toHours(timeDiff) - TimeUnit.DAYS.toHours(day));
mm = (int) (TimeUnit.MILLISECONDS.toMinutes(timeDiff) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDiff)));
}
catch (ParseException e)
{
e.printStackTrace();
}
if(day==0)
{
return hh + " hour " + mm + " min";
}
else if(hh==0)
{
return mm + " min";
}
else
{
return day + " days " + hh + " hour " + mm + " min";
}
}
Просто дополняю этот ответ для других разработчиков (таких как я), которые используют Time вместо Date.
Time t1 = new Time();
t1.setToNow();
Thread.sleep(1000);
Time t2 = new Time();
t2.setToNow();
diff = TimeUnit.MILLISECONDS.toSeconds(t2.toMillis(true)-t1.toMillis(true));
В то время как другие ответы работают и были прекрасными ответами в 2010 году, я даю современный ответ.
java.time и ThreeTenABP
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
ZoneId zone = ZoneId.systemDefault();
String startDateString = "2019-12-31 23:34:45";
String endDateString = "2020-01-01 07:56:34";
ZonedDateTime start = LocalDateTime.parse(startDateString, formatter).atZone(zone);
ZonedDateTime end = LocalDateTime.parse(endDateString, formatter).atZone(zone);
long diffSeconds = ChronoUnit.SECONDS.between(start, end);
System.out.println("Difference: " + diffSeconds + " seconds");
Для большинства часовых поясов вывод этого фрагмента будет следующим:
Разница: 30109 секунд
Я использую ZonedDateTime
потому что он принимает во внимание переходы на летнее время (DST) и другие временные аномалии. Конечно, это требует, чтобы вы использовали правильный часовой пояс. Если настройки часового пояса вашего устройства изменились после того, как вы сохранили дату и время в своей базе данных, вы рискуете некоторыми сюрпризами. Чтобы предотвратить это, вы можете сохранить смещение UTC вместе со своим временем, а затем проанализировать их вOffsetDateTime
при извлечении.
Вопрос: Разве java.time не требует Android API 26 уровня?
java.time прекрасно работает как на старых, так и на новых устройствах Android. Просто требуется как минимум Java 6.
- В Java 8 и новее, а также на новых устройствах Android (начиная с уровня API 26) современный API встроен.
- В Java 6 и 7, отличных от Android, используйте ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старом) Android используйте Android-версию ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки
- Учебник Oracle: Date Time, объясняющий, как использовать java.time.
- Запрос спецификации Java (JSR) 310, где
java.time
был впервые описан. - Проект ThreeTen Backport, то портировать из
java.time
на Java 6 и 7 (ThreeTen для JSR-310). - ThreeTenABP, версия ThreeTen Backport для Android
- Вопрос: как использовать ThreeTenABP в Android Project, с очень подробным объяснением.