Meilleur moyen de comparer les dates sur Android


102

J'essaie de comparer une date au format String à la date actuelle. C'est ainsi que je l'ai fait (je n'ai pas testé, mais cela devrait fonctionner), mais j'utilise des méthodes obsolètes. Une bonne suggestion pour une alternative? Merci.

PS Je déteste vraiment faire des trucs de Date en Java. Il y a tellement de façons de faire la même chose que vous ne savez vraiment pas laquelle est la bonne, d'où ma question ici.

String valid_until = "1/1/1990";

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);

int year = strDate.getYear(); // this is deprecated
int month = strDate.getMonth() // this is deprecated
int day = strDate.getDay(); // this is deprecated       

Calendar validDate = Calendar.getInstance();
validDate.set(year, month, day);

Calendar currentDate = Calendar.getInstance();

if (currentDate.after(validDate)) {
    catalog_outdated = 1;
}

4
En 2018 , la meilleure façon ne comporte pas Calendar, SimpleDateFormat, Dateou l' un des autre date Java dépassée depuis longtemps et les classes temps. Utilisez plutôt java.timel'API de date et d'heure Java moderne . Oui, vous pouvez l'utiliser sur Android. Pour les anciens Android, consultez Comment utiliser ThreeTenABP dans Android Project .
Ole VV

Réponses:


220

Votre code pourrait être réduit à

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (new Date().after(strDate)) {
    catalog_outdated = 1;
}

ou

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (System.currentTimeMillis() > strDate.getTime()) {
    catalog_outdated = 1;
}

cela fonctionne bien sûr, j'ai posté la même solution dans un autre thread mais pas ici car le collègue était plus rapide O_o.
Simon Dorociak

je voulais juste être sûr, avant d'accepter. Merci. il a parfaitement fonctionné et est concis et simple comme souhaité.
nunos

16
Je pense qu'il faudrait utiliser le format jj / MM / aaaa au lieu de jj / mm / aaaa, car "m" signifie minutes et "M" signifie mois.
Demwis

Ne vaut-il pas mieux utiliser la méthode compareTo ()?
classe Android

25

Vous pouvez utiliser compareTo ()

La méthode CompareTo doit retourner un nombre négatif si l'objet actuel est inférieur à un autre objet, un nombre positif si l'objet actuel est supérieur à l'autre objet et zéro si les deux objets sont égaux.

// Get Current Date Time
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm aa");
String getCurrentDateTime = sdf.format(c.getTime());
String getMyTime="05/19/2016 09:45 PM ";
Log.d("getCurrentDateTime",getCurrentDateTime); 
// getCurrentDateTime: 05/23/2016 18:49 PM

if (getCurrentDateTime.compareTo(getMyTime) < 0)
{

}
else
{
 Log.d("Return","getMyTime older than getCurrentDateTime "); 
}

1
Pour votre information, les classes date de temps anciens gênants tels que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritage, supplanté par les java.time classes. La plupart des fonctionnalités java.time sont rétroportées vers Java 6 et Java 7 dans le projet ThreeTen-Backport . Adapté davantage pour Android antérieur (<26) dans ThreeTenABP . Voir Comment utiliser ThreeTenABP… .
Basil Bourque

10

Vous pouvez directement créer un à Calendarpartir d'un Date:

Calendar validDate = new GregorianCalendar();
validDate.setTime(strDate);
if (Calendar.getInstance().after(validDate)) {
    catalog_outdated = 1;
}

10

Notez que le bon format est ("jj / MM / aaaa") avant que le code ne fonctionne. "mm" signifie minuts!

String valid_until = "01/07/2013";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = null;
try {
    strDate = sdf.parse(valid_until);
} catch (ParseException e) {
    e.printStackTrace();
}
if (new Date().after(strDate)) {
    catalog_outdated = 1;
}

7
Calendar toDayCalendar = Calendar.getInstance();
Date date1 = toDayCalendar.getTime();


Calendar tomorrowCalendar = Calendar.getInstance();
tomorrowCalendar.add(Calendar.DAY_OF_MONTH,1);
Date date2 = tomorrowCalendar.getTime();

// date1 is a present date and date2 is tomorrow date

if ( date1.compareTo(date2) < 0 ) {

  //  0 comes when two date are same,
  //  1 comes when date1 is higher then date2
  // -1 comes when date1 is lower then date2

 }

Pour votre information, les classes date de temps anciens gênants tels que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritage, supplanté par les java.time classes. La plupart des fonctionnalités java.time sont rétroportées vers Java 6 et Java 7 dans le projet ThreeTen-Backport . Adapté davantage pour Android antérieur (<26) dans ThreeTenABP . Voir Comment utiliser ThreeTenABP… .
Basil Bourque

6
String date = "03/26/2012 11:00:00";
    String dateafter = "03/26/2012 11:59:00";
    SimpleDateFormat dateFormat = new SimpleDateFormat(
            "MM/dd/yyyy hh:mm:ss");
    Date convertedDate = new Date();
    Date convertedDate2 = new Date();
    try {
        convertedDate = dateFormat.parse(date);
        convertedDate2 = dateFormat.parse(dateafter);
        if (convertedDate2.after(convertedDate)) {
            txtView.setText("true");
        } else {
            txtView.setText("false");
        }
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

il retourne vrai .. et vous pouvez également vérifier avant et égal à l'aide de date.be avant et date égal.


3
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.getDefault());
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();

Date date1 = dateFormat.parse("2013-01-01");
Date date2 = dateFormat.parse("2013-01-02");

calendar1.setTime(date1);
calendar2.setTime(date2);

System.out.println("Compare Result : " + calendar2.compareTo(calendar1));
System.out.println("Compare Result : " + calendar1.compareTo(calendar2));

Compare l'heure représentée par ce calendrier à celle représentée par le calendrier donné.

Renvoie 0 si les heures des deux calendriers sont égales, -1 si l'heure de ce calendrier est avant l'autre, 1 si l'heure de ce calendrier est après l'autre.


1
Merci .. Il m'aide.
pRaNaY

2

convertissez la date en calendrier et effectuez vos calculs là-bas. :)

Calendar cal = Calendar.getInstance();
cal.setTime(date);

int year = cal.get(Calendar.YEAR);
int month = cal.geT(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH); //same as cal.get(Calendar.DATE)

Ou:

SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);

if (strDate.after(new Date()) {
    catalog_outdated = 1;
}

2

Il est temps pour la réponse moderne.

java.time et ThreeTenABP

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d/M/u");
    String validUntil = "1/1/1990";
    LocalDate validDate = LocalDate.parse(validUntil, dateFormatter);
    LocalDate currentDate = LocalDate.now(ZoneId.of("Pacific/Efate"));
    if (currentDate.isAfter(validDate)) {
        System.out.println("Catalog is outdated");
    }

Quand j'ai exécuté ce code tout à l'heure, le résultat était:

Le catalogue est obsolète

Comme il ne s'agit jamais de la même date dans tous les fuseaux horaires, attribuez un fuseau horaire explicite à LocalDate.now. Si vous souhaitez que le catalogue expire à la même heure dans tous les fuseaux horaires, vous pouvez donner ZoneOffset.UTCtant que vous informez les utilisateurs que vous utilisez UTC.

J'utilise java.time, l'API de date et d'heure Java moderne. Les classes date-heure que vous avez utilisé, Calendar, SimpleDateFormatet Date, sont tous mal conçus et heureusement dépassée depuis longtemps. De plus, malgré le nom, a Datene représente pas une date, mais un point dans le temps. Une conséquence de ceci est: même si nous sommes aujourd'hui le 15 février 2019, un Dateobjet nouvellement créé est déjà après (donc pas égal à) un Dateobjet de l'analyse 15/02/2019. Cela déroute certains. Contrairement à cela, le moderne LocalDateest une date sans heure (et sans fuseau horaire), donc deux LocalDates représentant la date du jour seront toujours égaux.

Question: Puis-je utiliser java.time sur Android?

Oui, java.time fonctionne bien sur les appareils Android plus anciens et plus récents. Il nécessite juste au moins Java 6 .

  • Dans Java 8 et versions ultérieures et sur les appareils Android plus récents (à partir du niveau d'API 26), l'API moderne est intégrée.
  • Dans Java 6 et 7, obtenez le ThreeTen Backport, le backport des classes modernes (ThreeTen pour JSR 310; voir les liens en bas).
  • Sur Android (plus ancien), utilisez l'édition Android de ThreeTen Backport. Il s'appelle ThreeTenABP. Et assurez-vous d'importer les classes de date et d'heure à partir des org.threeten.bpsous-packages.

Liens


1

Tu pourrais essayer ça

Calendar today = Calendar.getInstance (); 
today.add(Calendar.DAY_OF_YEAR, 0); 
today.set(Calendar.HOUR_OF_DAY, hrs); 
today.set(Calendar.MINUTE, mins ); 
today.set(Calendar.SECOND, 0); 

et vous pouvez utiliser today.getTime()pour récupérer la valeur et comparer.


1

Parfois, nous devons faire une liste avec des dates, comme

aujourd'hui avec heure

hier avec hier

autres jours avec 23/06/2017

Pour ce faire, nous devons comparer l'heure actuelle avec nos données.

Public class DateUtil {

    Public static int getDateDayOfMonth (Date date) {
        Calendar calendar = Calendar.getInstance ();
        Calendar.setTime (date);
        Return calendar.get (Calendar.DAY_OF_MONTH);
    }

    Public static int getCurrentDayOfMonth () {
        Calendar calendar = Calendar.getInstance ();
        Return calendar.get (Calendar.DAY_OF_MONTH);
    }

    Public static String convertMillisSecondsToHourString (long millisSecond) {
        Date date = new Date (millisSecond);
        Format formatter = new SimpleDateFormat ("HH: mm");
        Return formatter.format (date);
    }

    Public static String convertMillisSecondsToDateString (long millisSecond) {
        Date date = new Date (millisSecond);
        Format formatter = new SimpleDateFormat ("dd / MM / yyyy");
        Return formatter.format (date);
    }

    Public static long convertToMillisSecond (Date date) {
        Return date.getTime ();
    }

    Public static String compare (String stringData, String yesterday) {

        String result = "";

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss");
        Date date = null;

        Try {
            Date = simpleDateFormat.parse (stringData);
        } Catch (ParseException e) {
            E.printStackTrace ();
        }

        Long millisSecond = convertToMillisSecond (date);
        Long currencyMillisSecond = System.currentTimeMillis ();

        If (currencyMillisSecond> millisSecond) {
            Long diff = currencyMillisSecond - millisSecond;
            Long day = 86400000L;

            If (diff <day && getCurrentDayOfMonth () == getDateDayOfMonth (date)) {
                Result = convertMillisSecondsToHourString (millisSecond);

            } Else if (diff <(day * 2) && getCurrentDayOfMonth () -1 == getDateDayOfMonth (date)) {
                Result = yesterday;
            } Else {
                Result = convertMillisSecondsToDateString (millisSecond);
            }
        }

        Return result;
    }
}

Vous pouvez également consulter cet exemple dans GitHub et cet article .


1

Mise à jour: La bibliothèque Joda-Time est maintenant en mode maintenance et recommande de migrer vers le framework java.time qui lui succède. Voir la réponse d'Ole VV .


Joda-Time

Les classes java.util.Date et .Calendar sont notoirement gênantes. Évite-les. Utilisez Joda-Time ou le nouveau package java.time dans Java 8.

LocalDate

Si vous voulez une date uniquement sans heure du jour, utilisez la classe LocalDate.

Fuseau horaire

L'obtention de la date actuelle dépend du fuseau horaire. Une nouvelle date arrive à Paris avant Montréal. Spécifiez le fuseau horaire souhaité plutôt que de dépendre de la valeur par défaut de la JVM.

Exemple dans Joda-Time 2.3.

DateTimeFormat formatter = DateTimeFormat.forPattern( "d/M/yyyy" );
LocalDate localDate = formatter.parseLocalDate( "1/1/1990" );
boolean outdated = LocalDate.now( DateTimeZone.UTC ).isAfter( localDate );


0
SimpleDateFormat sdf=new SimpleDateFormat("d/MM/yyyy");
Date date=null;
Date date1=null;
try {
       date=sdf.parse(startDate);
       date1=sdf.parse(endDate);
    }  catch (ParseException e) {
              e.printStackTrace();
    }
if (date1.after(date) && date1.equals(date)) {
//..do your work..//
}

0

Kotlin prend en charge la surcharge des opérateurs

Dans Kotlin, vous pouvez facilement comparer les dates avec les opérateurs de comparaison. Parce que Kotlin supporte déjà la surcharge des opérateurs. Donc pour comparer des objets de date:

firstDate: Date = // your first date
secondDate: Date = // your second date

if(firstDate < secondDate){
// fist date is before second date
}

et si vous utilisez des objets de calendrier, vous pouvez facilement comparer comme ceci:

if(cal1.time < cal2.time){
// cal1 date is before cal2 date
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.