web-dev-qa-db-fra.com

Android calculer les jours entre deux dates

J'ai écrit le code suivant pour trouver des jours entre deux dates

    startDateValue = new Date(startDate);
    endDateValue = new Date(endDate);
    long diff = endDateValue.getTime() - startDateValue.getTime();
    long seconds = diff / 1000;
    long minutes = seconds / 60;
    long hours = minutes / 60;
    long days = (hours / 24) + 1;
    Log.d("days", "" + days);

Lorsque la date de début et la date de fin sont respectivement le 2/3/2017 et le 3/3/2017, le nombre de jours affichés est 29. Toutefois, s’ils sont du même jour, l’indication indique 1. (Le nombre de jours s'il prend un seul jour de congé, il doit choisir les mêmes dates de début et de fin. Dans ce cas, il a pris deux jours de congé).

Qu'est-ce que je fais mal? Merci pour votre temps.

4

Votre code pour générer un objet de date:

Date date = new Date("2/3/2017"); //deprecated

Vous obtenez 28 jours comme réponse car, selon le constructeur Date(String), il pense jour = 3, mois = 2 et année = 2017

Vous pouvez convertir String en Date de la manière suivante:

String dateStr = "2/3/2017";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = sdf.parse(dateStr);

Utilisez le modèle ci-dessus pour créer votre objet Date. Utilisez ensuite le code ci-dessous pour calculer les jours entre deux dates. J'espère que ça efface la chose.

Cela peut se faire comme suit:

long diff = endDateValue.getTime() - startDateValue.getTime();
System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));

S'il vous plaît vérifier lien

Si vous utilisez Joda Time, c'est beaucoup plus simple:

int days = Days.daysBetween(date1, date2).getDays();

S'il vous plaît vérifier JodaTime

Comment utiliser JodaTime dans un projet Java

21
SachinSarawgi

Quel format de date utilisez-vous? Est-ce d/M/yyyy ou M/d/yyyy?

d = jour, M = mois, aaaa = année

(voir: https://developer.Android.com/reference/Java/text/SimpleDateFormat.html )

Puis les codes:

public static final String DATE_FORMAT = "d/M/yyyy";  //or use "M/d/yyyy"   

public static long getDaysBetweenDates(String start, String end) {
    SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH);
    Date startDate, endDate;
    long numberOfDays = 0;
    try {
        startDate = dateFormat.parse(start);
        endDate = dateFormat.parse(end);
        numberOfDays = getUnitBetweenDates(startDate, endDate, TimeUnit.DAYS);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return numberOfDays;
}

Et pour la méthode getUnitBetweenDates:

private static long getUnitBetweenDates(Date startDate, Date endDate, TimeUnit unit) {
    long timeDiff = endDate.getTime() - startDate.getTime();
    return unit.convert(timeDiff, TimeUnit.MILLISECONDS);
}
4
Janice Kartika
public static int getDaysDifference(Date fromDate,Date toDate)
{
if(fromDate==null||toDate==null)
return 0;

return (int)( (toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24));
}
3
Jitendra virani

Regardez ce code, cela m’est utile, espère que cela vous aidera.

public String get_count_of_days(String Created_date_String, String Expire_date_String) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());

Date Created_convertedDate = null, Expire_CovertedDate = null, todayWithZeroTime = null;
try {
    Created_convertedDate = dateFormat.parse(Created_date_String);
    Expire_CovertedDate = dateFormat.parse(Expire_date_String);

    Date today = new Date();

    todayWithZeroTime = dateFormat.parse(dateFormat.format(today));
} catch (ParseException e) {
    e.printStackTrace();
}

int c_year = 0, c_month = 0, c_day = 0;

if (Created_convertedDate.after(todayWithZeroTime)) {
    Calendar c_cal = Calendar.getInstance();
    c_cal.setTime(Created_convertedDate);
    c_year = c_cal.get(Calendar.YEAR);
    c_month = c_cal.get(Calendar.MONTH);
    c_day = c_cal.get(Calendar.DAY_OF_MONTH);

} else {
    Calendar c_cal = Calendar.getInstance();
    c_cal.setTime(todayWithZeroTime);
    c_year = c_cal.get(Calendar.YEAR);
    c_month = c_cal.get(Calendar.MONTH);
    c_day = c_cal.get(Calendar.DAY_OF_MONTH);
}


/*Calendar today_cal = Calendar.getInstance();
int today_year = today_cal.get(Calendar.YEAR);
int today = today_cal.get(Calendar.MONTH);
int today_day = today_cal.get(Calendar.DAY_OF_MONTH);
*/

Calendar e_cal = Calendar.getInstance();
e_cal.setTime(Expire_CovertedDate);

int e_year = e_cal.get(Calendar.YEAR);
int e_month = e_cal.get(Calendar.MONTH);
int e_day = e_cal.get(Calendar.DAY_OF_MONTH);

Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();

date1.clear();
date1.set(c_year, c_month, c_day);
date2.clear();
date2.set(e_year, e_month, e_day);

long diff = date2.getTimeInMillis() - date1.getTimeInMillis();

float dayCount = (float) diff / (24 * 60 * 60 * 1000);

return ("" + (int) dayCount + " Days");

}

2
Mr. Mad

Android supporte-t-il entièrement Java-8? Si oui, vous pouvez simplement utiliser ChronoUnitclass

LocalDate start = LocalDate.of(2017,2,3);
LocalDate end = LocalDate.of(2017,3,3);

System.out.println(ChronoUnit.DAYS.between(start, end)); // 28

ou même chose en utilisant formateur

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/yyyy");
LocalDate start = LocalDate.parse("2/3/2017",formatter);
LocalDate end = LocalDate.parse("3/3/2017",formatter);

System.out.println(ChronoUnit.DAYS.between(start, end)); // 28
2
Anton Balaniuc

Très simple, utilisez simplement Calendrier, créez deux instances pour les deux dates, convertissez-les en millisecondes, soustrayez-les et convertissez-les en jours (arrondis) ... comme ceci, en gros:

Calendar startDate = Calendar.getInstance();
startDate.set(mStartYear, mStartMonth, mStartDay);
long startDateMillis = startDate.getTimeInMillis();

Calendar endDate = Calendar.getInstance();
endDate.set(mEndYear, mEndMonth, mEndDay);
long endDateMillis = endDate.getTimeInMillis();

long differenceMillis = endDateMillis - startDateMillis;
int daysDifference = (int) (differenceMillis / (1000 * 60 * 60 * 24));
1
fuzzKitty

Faites attention si vous souhaitez utiliser un entier reçu, par exemple. pour indiquer un jour spécifique dans l'implémentation du calendrier personnalisé. Par exemple, j’ai essayé d’utiliser l’application m du calendrier mensuel pour afficher tous les jours le contenu quotidien, en calculant les dates du 1970-01-01 à l’année sélectionnée, et chaque 25 à 31ème jour du mois m’affiche le jour précédent, Parce que datesDifferenceInMillis / (24 * 60 * 60 * 1000); peut renvoyer quelque chose comme 17645,95833333333, et en le convertissant en entier, vous obtiendrez une valeur inférieure de 1. Dans ce cas, vous obtiendrez correctement le nombre de jours en arrondissant la valeur float reçue en utilisant la classe NumberFormat. Voici mon code:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault());
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
numberFormat.setMaximumFractionDigits(0);
numberFormat.setMinimumFractionDigits(0);
int days = numberFormat.parse(numberFormat.format(value)).intValue();

J'espère que cela vous sera utile.

1
grabarz121