Как я могу получить разницу между двумя датами в android?, проверял каждую вещь и сообщение
Я видел всю запись здесь, и все же я не могу понять, как получить разницу между двумя датами Android.
Это то, что я делаю:
long diff = date1.getTime() - date2.getTime();
Date diffDate = new Date(diff);
и я получаю: дата 1 января 1970 года, и время всегда больше в два часа... Я из Израиля, поэтому два часа - это время.
Как я могу получить нормальную разницу???
Ответы
Ответ 1
Вы близки к правильному ответу, вы получаете разницу в миллисекундах между этими двумя датами, но когда вы пытаетесь построить дату из этой разницы, предполагается, что вы хотите создать новый объект Date
с этой разностной величиной в качестве ее эпохи. Если вы ищете время в часах, вам просто нужно сделать некоторую базовую арифметику на этом diff
, чтобы получить разные временные части:
long diff = date1.getTime() - date2.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
Вся эта математика будет просто выполнять целочисленную арифметику, поэтому она усекает любые десятичные точки
Ответ 2
long diffInMillisec = date1.getTime() - date2.getTime();
long diffInDays = TimeUnit.MILLISECONDS.toDays(diffInMillisec);
long diffInHours = TimeUnit.MILLISECONDS.toHours(diffInMillisec);
long diffInMin = TimeUnit.MILLISECONDS.toMinutes(diffInMillisec);
long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMillisec);
Ответ 3
Некоторая добавка:
Здесь я конвертирую строку в дату, а затем сравниваю текущее время.
String toyBornTime = "2014-06-18 12:56:50";
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
try {
Date oldDate = dateFormat.parse(toyBornTime);
System.out.println(oldDate);
Date currentDate = new Date();
long diff = currentDate.getTime() - oldDate.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
if (oldDate.before(currentDate)) {
Log.e("oldDate", "is previous date");
Log.e("Difference: ", " seconds: " + seconds + " minutes: " + minutes
+ " hours: " + hours + " days: " + days);
}
// Log.e("toyBornTime", "" + toyBornTime);
} catch (ParseException e) {
e.printStackTrace();
}
Ответ 4
Используйте java.time.Duration
:
Duration diff = Duration.between(instant2, instant1);
System.out.println(diff);
Это напечатает что-то вроде
PT109H27M21S
Это означает период времени 109 часов 27 минут 21 секунда. Если вы хотите, чтобы нечто более читаемое человеком, - я сначала даю 9-ю версию, ее простейшую:
String formattedDiff = String.format(Locale.ENGLISH,
"%d days %d hours %d minutes %d seconds",
diff.toDays(), diff.toHoursPart(), diff.toMinutesPart(), diff.toSecondsPart());
System.out.println(formattedDiff);
Теперь получим
4 days 13 hours 27 minutes 21 seconds
Класс Duration
является частью java.time
современного Java-кода даты и времени. Это связано с новыми устройствами Android. На старых устройствах получите ThreeTenABP и добавьте его в свой проект и убедитесь, что вы импортируете org.threeten.bp.Duration
и другие классы времени, которые могут потребоваться из одного пакета.
Предполагая, что вы все еще не получили версию Java 9, вы можете, в свою очередь, вычесть большие единицы, чтобы получить меньшие:
long days = diff.toDays();
diff = diff.minusDays(days);
long hours = diff.toHours();
diff = diff.minusHours(hours);
long minutes = diff.toMinutes();
diff = diff.minusMinutes(minutes);
long seconds = diff.toSeconds();
Затем вы можете отформатировать четыре переменные, как указано выше.
Что вы сделали неправильно?
A Date
представляет собой момент времени. Он никогда не предназначался для представления количества времени, продолжительности, и он не подходит для него. Попытка сделать эту работу в лучшем случае приведет к запутанному и трудноподдерживающемуся коду. Вы не хотите этого, поэтому, пожалуйста, не делайте.
Ссылки
Ответ 5
Используйте эти функции
public static int getDateDifference(
int previousYear, int previousMonthOfYear, int previousDayOfMonth,
int nextYear, int nextMonthOfYear, int nextDayOfMonth,
int differenceToCount){
// int differenceToCount = can be any of the following
// Calendar.MILLISECOND;
// Calendar.SECOND;
// Calendar.MINUTE;
// Calendar.HOUR;
// Calendar.DAY_OF_MONTH;
// Calendar.MONTH;
// Calendar.YEAR;
// Calendar.----
Calendar previousDate = Calendar.getInstance();
previousDate.set(Calendar.DAY_OF_MONTH, previousDayOfMonth);
// month is zero indexed so month should be minus 1
previousDate.set(Calendar.MONTH, previousMonthOfYear);
previousDate.set(Calendar.YEAR, previousYear);
Calendar nextDate = Calendar.getInstance();
nextDate.set(Calendar.DAY_OF_MONTH, previousDayOfMonth);
// month is zero indexed so month should be minus 1
nextDate.set(Calendar.MONTH, previousMonthOfYear);
nextDate.set(Calendar.YEAR, previousYear);
return getDateDifference(previousDate,nextDate,differenceToCount);
}
public static int getDateDifference(Calendar previousDate,Calendar nextDate,int differenceToCount){
// int differenceToCount = can be any of the following
// Calendar.MILLISECOND;
// Calendar.SECOND;
// Calendar.MINUTE;
// Calendar.HOUR;
// Calendar.DAY_OF_MONTH;
// Calendar.MONTH;
// Calendar.YEAR;
// Calendar.----
//raise an exception if previous is greater than nextdate.
if(previousDate.compareTo(nextDate)>0){
throw new RuntimeException("Previous Date is later than Nextdate");
}
int difference=0;
while(previousDate.compareTo(nextDate)<=0){
difference++;
previousDate.add(differenceToCount,1);
}
return difference;
}
Ответ 6
Использование грузинского каландра
public void dateDifferenceExample() {
// Set the date for both of the calendar instance
GregorianCalendar calDate = new GregorianCalendar(2012, 10, 02,5,23,43);
GregorianCalendar cal2 = new GregorianCalendar(2015, 04, 02);
// Get the represented date in milliseconds
long millis1 = calDate.getTimeInMillis();
long millis2 = cal2.getTimeInMillis();
// Calculate difference in milliseconds
long diff = millis2 - millis1;
// Calculate difference in seconds
long diffSeconds = diff / 1000;
// Calculate difference in minutes
long diffMinutes = diff / (60 * 1000);
// Calculate difference in hours
long diffHours = diff / (60 * 60 * 1000);
// Calculate difference in days
long diffDays = diff / (24 * 60 * 60 * 1000);
Toast.makeText(getContext(), ""+diffSeconds, Toast.LENGTH_SHORT).show();
}
Ответ 7
Вот мой ответ, основанный на ответе @Ole VV.
Это также работает с Singular.
private String getDuration(Date d1, Date d2) {
Duration diff = Duration.between(d1.toInstant(), d2.toInstant());
long days = diff.toDays();
diff = diff.minusDays(days);
long hours = diff.toHours();
diff = diff.minusHours(hours);
long minutes = diff.toMinutes();
diff = diff.minusMinutes(minutes);
long seconds = diff.toMillis();
StringBuilder formattedDiff = new StringBuilder();
if(days!=0){
if(days==1){
formattedDiff.append(days + " Day ");
}else {
formattedDiff.append(days + " Days ");
}
}if(hours!=0){
if(hours==1){
formattedDiff.append(hours + " hour ");
}else{
formattedDiff.append(hours + " hours ");
}
}if(minutes!=0){
if(minutes==1){
formattedDiff.append(minutes + " minute ");
}else{
formattedDiff.append(minutes + " minutes ");
}
}if(seconds!=0){
if(seconds==1){
formattedDiff.append(seconds + " second ");
}else{
formattedDiff.append(seconds + " seconds ");
}
}
return formattedDiff.toString();
}
Он работает с StringBuilder, чтобы добавить все вместе.
Ответ 8
Самый короткий ответ, который работает для меня. отправьте дату начала и окончания в миллисекундах.
public int GetDifference(long start,long end){
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(start);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int min = cal.get(Calendar.MINUTE);
long t=(23-hour)*3600000+(59-min)*60000;
t=start+t;
int diff=0;
if(end>t){
diff=(int)((end-t)/ TimeUnit.DAYS.toMillis(1))+1;
}
return diff;
}