web-dev-qa-db-fra.com

Meilleur moyen de comparer les dates sur Android

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

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

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;
}
72
nunos

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;
}
162
JB Nizet

Vous pouvez utiliser compareTo ()

La méthode CompareTo doit renvoyer un nombre négatif si l'objet actuel est inférieur à autre objet, nombre positif si l’objet en cours est supérieur à 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 "); 
}
11
IntelliJ Amiya

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

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;
}
9
Rocologo

Vous pouvez créer directement une Calendar à partir d'une Date:

Calendar validDate = new GregorianCalendar();
validDate.setTime(strDate);
if (Calendar.getInstance().after(validDate)) {
    catalog_outdated = 1;
}
9
assylias
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

 }
4
Siva krishna
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.before et date.equal.

4
Dilavar M
try {
  SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

  String str1 = "9/10/2015";
  Date date1 = formatter.parse(str1);

  String str2 = "10/10/2015";
  Date date2 = formatter.parse(str2);

  if (date1.compareTo(date2) < 0) {
    System.out.println("date2 is Greater than my date1");
  }

} catch (ParseException e1) {
  e1.printStackTrace();
}
2
Amit Desale
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 antérieure à l'autre, 1 si l'heure de ce calendrier est postérieure à l'autre.

2
Kirit Vaghela

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

aujourd'hui avec heure

hier avec hier

les autres jours du 23/06/2017

Pour ce faire, nous devons comparer l'heure actuelle à 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 aussi consulter cet exemple dans GitHub et this post .

1
Cabezas

convertissez la date en calendrier et effectuez vos calculs ici. :)

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;
}
1
Nuno Gonçalves

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 une valeur et comparer.

1
Anurag Ramdasan

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");
    }

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

Le catalogue est obsolète

Etant donné que ce n'est jamais la même date dans tous les fuseaux horaires, donnez le fuseau horaire explicite à LocalDate.now. Si vous souhaitez que le catalogue expire au même moment dans tous les fuseaux horaires, vous pouvez donner ZoneOffset.UTC tant que vous informez les utilisateurs que vous utilisez UTC.

J'utilise Java.time, l'API Java moderne pour la date et l'heure. Les classes date-heure que vous avez utilisées, Calendar, SimpleDateFormat et Date, sont toutes mal conçues et heureusement obsolètes. Aussi, malgré le nom, Date ne représente pas une date, mais un moment précis. L'une des conséquences est que, même si nous sommes le 15 février 2019, un objet Date nouvellement créé est déjà après (donc différent de) un objet Date de l'analyse 15/02/2019. Cela confond certains. Contrairement à cela, la variable LocalDate moderne est une date sans heure (et sans fuseau horaire), de sorte que deux LocalDate représentant la date d’aujourd’hui seront toujours égaux.

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

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

  • Dans Java 8 et versions ultérieures et sur les appareils Android récents (à partir de l'API de niveau 26), l'API moderne est intégrée.
  • En Java 6 et 7, obtenez ThreeTen Backport, le backport des classes modernes (ThreeTen pour JSR 310; voir les liens en bas).
  • Sous 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 de org.threeten.bp avec des sous-packages.

Liens

1
Ole V.V.

Joda-Time

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

Date locale

Si vous souhaitez une date uniquement sans heure, utilisez la classe LocalDate.

Fuseau horaire

Obtenir 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 configuration par défaut de la machine virtuelle Java.

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
Basil Bourque

Vous pouvez utiliser validDate.setTime (strDate) Consultez le javadoc à http://docs.Oracle.com/javase/1.5.0/docs/api/Java/util/Calendar .html

0
phlogratos