81 votes

Android/Java - Différence de date en jours

J'obtiens la date actuelle (au format 31/12/1999, c'est-à-dire mm/jj/aaaa) en utilisant le code ci-dessous :

Textview txtViewData;
txtViewDate.setText("Today is " +
        android.text.format.DateFormat.getDateFormat(this).format(new Date()));

et j'ai une autre date au format : 2010-08-25 (c'est-à-dire aaaa/mm/jj) ,

Je veux donc trouver la différence entre les dates en nombre de jours, comment trouver la différence en jours ?

(En d'autres termes, je veux trouver la différence entre DATE ACTUELLE - date formatée aaaa/mm/jj )

126voto

st0le Points 15318

Ce n'est pas vraiment une méthode fiable, il vaut mieux utiliser JodaTime

  Calendar thatDay = Calendar.getInstance();
  thatDay.set(Calendar.DAY_OF_MONTH,25);
  thatDay.set(Calendar.MONTH,7); // 0-11 so 1 less
  thatDay.set(Calendar.YEAR, 1985);

  Calendar today = Calendar.getInstance();

  long diff = today.getTimeInMillis() - thatDay.getTimeInMillis(); //result in millis

Voici une approximation...

long days = diff / (24 * 60 * 60 * 1000);

Pour analyser la date à partir d'une chaîne de caractères, vous pourriez utiliser

  String strThatDay = "1985/08/25";
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
  Date d = null;
  try {
   d = formatter.parse(strThatDay);//catch exception
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 

  Calendar thatDay = Calendar.getInstance();
  thatDay.setTime(d); //rest is the same....

Mais, puisque vous êtes sûr du format de la date... Vous pourriez aussi faire Integer.parseInt() sur ses sous-chaînes pour obtenir leurs valeurs numériques.

83voto

Samuel Points 4472

Ce n'est PAS mon travail, j'ai trouvé la réponse aquí . je ne voulais pas de lien brisé à l'avenir :).

La clé est cette ligne pour prendre en compte le réglage de la lumière du jour, réf Code complet.

TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

ou essayez de passer TimeZone en tant que paramètre de daysBetween() et appeler setTimeZone() en el sDate y eDate objets.

Alors voilà :

public static Calendar getDatePart(Date date){
    Calendar cal = Calendar.getInstance();       // get calendar instance
    cal.setTime(date);      
    cal.set(Calendar.HOUR_OF_DAY, 0);            // set hour to midnight
    cal.set(Calendar.MINUTE, 0);                 // set minute in hour
    cal.set(Calendar.SECOND, 0);                 // set second in minute
    cal.set(Calendar.MILLISECOND, 0);            // set millisecond in second

    return cal;                                  // return the date part
}

getDatePart() tirée de aquí

/**
 * This method also assumes endDate >= startDate
**/
public static long daysBetween(Date startDate, Date endDate) {
  Calendar sDate = getDatePart(startDate);
  Calendar eDate = getDatePart(endDate);

  long daysBetween = 0;
  while (sDate.before(eDate)) {
      sDate.add(Calendar.DAY_OF_MONTH, 1);
      daysBetween++;
  }
  return daysBetween;
}

Les nuances : Trouver la différence entre deux dates n'est pas aussi simple que de soustraire les deux dates et de diviser le résultat par (24 * 60 * 60 * 1000). En fait, c'est erroné !

Par exemple : La différence entre les deux dates 24/03/2007 et 25/03/2007 devrait être de 1 jour ; Cependant, en utilisant la méthode ci-dessus, au Royaume-Uni, vous obtiendrez 0 jour !

Voyez par vous-même (code ci-dessous). L'utilisation de la méthode des millisecondes entraîne des erreurs d'arrondi, qui deviennent plus évidentes lorsqu'une petite chose comme l'heure d'été entre en jeu.

Code complet :

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class DateTest {

public class DateTest {

static SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");

public static void main(String[] args) {

  TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));

  //diff between these 2 dates should be 1
  Date d1 = new Date("01/01/2007 12:00:00");
  Date d2 = new Date("01/02/2007 12:00:00");

  //diff between these 2 dates should be 1
  Date d3 = new Date("03/24/2007 12:00:00");
  Date d4 = new Date("03/25/2007 12:00:00");

  Calendar cal1 = Calendar.getInstance();cal1.setTime(d1);
  Calendar cal2 = Calendar.getInstance();cal2.setTime(d2);
  Calendar cal3 = Calendar.getInstance();cal3.setTime(d3);
  Calendar cal4 = Calendar.getInstance();cal4.setTime(d4);

  printOutput("Manual   ", d1, d2, calculateDays(d1, d2));
  printOutput("Calendar ", d1, d2, daysBetween(cal1, cal2));
  System.out.println("---");
  printOutput("Manual   ", d3, d4, calculateDays(d3, d4));
  printOutput("Calendar ", d3, d4, daysBetween(cal3, cal4));
}

private static void printOutput(String type, Date d1, Date d2, long result) {
  System.out.println(type+ "- Days between: " + sdf.format(d1)
                    + " and " + sdf.format(d2) + " is: " + result);
}

/** Manual Method - YIELDS INCORRECT RESULTS - DO NOT USE**/
/* This method is used to find the no of days between the given dates */
public static long calculateDays(Date dateEarly, Date dateLater) {
  return (dateLater.getTime() - dateEarly.getTime()) / (24 * 60 * 60 * 1000);
}

/** Using Calendar - THE CORRECT WAY**/
public static long daysBetween(Date startDate, Date endDate) {
  ...
}

SORTIE :

Manuel - Jours entre : 01-Jan-2007 et 02-Jan-2007 est : 1

Calendrier - Jours compris entre : 01-Jan-2007 et 02-Jan-2007 est : 1


Manuel - Jours entre : 24-Mar-2007 et 25-Mar-2007 est : 0

Calendrier - Jours entre : 24-Mar-2007 et 25-Mar-2007 est : 1

38voto

Lisa Anne Points 215

La plupart des réponses étaient bonnes et adaptées à votre problème de

Je veux donc trouver la différence entre les dates en nombre de jours, comment puis-je trouver la différence en jours ?

Je vous propose cette approche très simple et directe qui vous donnera à coup sûr la différence correcte dans n'importe quel fuseau horaire :

int difference= 
((int)((startDate.getTime()/(24*60*60*1000))
-(int)(endDate.getTime()/(24*60*60*1000))));

Et c'est tout !

25voto

Jeroen Rosenberg Points 1510

Utilisez API de jodatime

Days.daysBetween(start.toDateMidnight() , end.toDateMidnight() ).getDays() 

où "début" et "fin" sont vos coordonnées. DateTime objets. Pour analyser vos chaînes de dates en objets DateTime, utilisez la fonction méthode parseDateTime

Il existe également un Bibliothèque JodaTime spécifique à Android .

14voto

markshiz Points 1040

Ce fragment tient compte de l'heure d'été et est O(1).

private final static long MILLISECS_PER_DAY = 24 * 60 * 60 * 1000;

private static long getDateToLong(Date date) {
    return Date.UTC(date.getYear(), date.getMonth(), date.getDate(), 0, 0, 0);
}

public static int getSignedDiffInDays(Date beginDate, Date endDate) {
    long beginMS = getDateToLong(beginDate);
    long endMS = getDateToLong(endDate);
    long diff = (endMS - beginMS) / (MILLISECS_PER_DAY);
    return (int)diff;
}

public static int getUnsignedDiffInDays(Date beginDate, Date endDate) {
    return Math.abs(getSignedDiffInDays(beginDate, endDate));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X