J'ai vu tout le message ici et je ne peux toujours pas comprendre comment obtenir une différence entre deux dates Android.
C'est ce que je fais:
long diff = date1.getTime() - date2.getTime();
Date diffDate = new Date(diff);
et je reçois: la date est le 1er janvier 1970 et le temps est toujours plus grand en deux heures ... Je suis d'Israël, alors les deux heures correspondent au décalage horaire.
Comment puis-je obtenir une différence normale ???
Vous vous approchez de la bonne réponse, vous obtenez la différence en millisecondes entre ces deux dates, mais lorsque vous essayez de construire une date à partir de cette différence, vous supposez que vous souhaitez créer un nouvel objet Date
avec cette valeur de différence, son époque. Si vous recherchez un temps en heures, il vous suffira alors de faire quelques calculs de base sur cette diff
pour obtenir les différentes parties de temps:
long diff = date1.getTime() - date2.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
Toute cette mathématique fera simplement de l'arithmétique entière, donc elle tronquera tous les points décimaux
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);
Quelques ajouts: Ici, je convertis chaîne en date, puis je compare l'heure actuelle.
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();
}
Utilisez Java.time.Duration
:
Duration diff = Duration.between(instant2, instant1);
System.out.println(diff);
Cela va imprimer quelque chose comme
PT109H27M21S
Cela signifie une période de temps de 109 heures 27 minutes 21 secondes. Si vous voulez quelque chose de plus lisible par l’homme - je vais tout d’abord donner la version 9, c’est le plus simple:
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);
Maintenant nous avons
4 days 13 hours 27 minutes 21 seconds
La classe Duration
fait partie de Java.time
l'API de date et heure moderne de Java. Ceci est fourni sur les nouveaux appareils Android. Sur les appareils plus anciens, procurez-vous ThreeTenABP, ajoutez-le à votre projet et assurez-vous d'importer le org.threeten.bp.Duration
et les autres classes de date-heure nécessaires dans le même package.
En supposant que vous ne disposiez toujours pas de la version Java 9, vous pouvez soustraire les unités les plus grandes à leur tour pour obtenir les plus petites:
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();
Ensuite, vous pouvez formater les quatre variables comme ci-dessus.
Une Date
représente un point dans le temps. Il n’a jamais été conçu pour représenter une durée, une durée, et cela ne convient pas. Essayer de faire ce travail au mieux conduirait à un code confus et difficile à maintenir. Vous ne voulez pas cela, alors s'il vous plaît, non.
Java.time
.Java.time
vers Java 6 et 7Utilisez ces fonctions
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;
}
Utilisation d'une calandre géorgienne
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();
}