Der beste Weg, um Daten in Android zu vergleichen

101

Ich versuche, ein Datum in einem String-Format mit dem aktuellen Datum zu vergleichen. So habe ich es gemacht (nicht getestet, sollte aber funktionieren), verwende aber veraltete Methoden. Irgendwelche guten Vorschläge für eine Alternative? Vielen Dank.

PS Ich hasse es wirklich, Date-Sachen in Java zu machen. Es gibt so viele Möglichkeiten, dasselbe zu tun, dass Sie wirklich nicht sicher sind, welche die richtige ist, daher meine Frage hier.

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;
}
Nunos
quelle
4
Im Jahr 2018 beinhaltet die beste Art und Weise nicht Calendar, SimpleDateFormat, Dateoder eine der anderen langen veralteten Java Datum und Zeitklassen. Verwenden Sie stattdessen java.timedie moderne Java-API für Datum und Uhrzeit . Ja, Sie können es auf Android verwenden. Für ältere Android siehe Verwendung von ThreeTenABP in Android Project .
Ole VV

Antworten:

218

Ihr Code könnte auf reduziert werden

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

oder

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date strDate = sdf.parse(valid_until);
if (System.currentTimeMillis() > strDate.getTime()) {
    catalog_outdated = 1;
}
JB Nizet
quelle
es funktioniert sicher, ich habe die gleiche Lösung in einem anderen Thread gepostet, aber nicht hier, weil der Kollege schneller war O_o.
Simon Dorociak
wollte nur sicher gehen, bevor ich akzeptiere. Vielen Dank. es hat perfekt funktioniert und ist prägnant und einfach wie gewünscht.
Nunos
16
Ich denke, dass anstelle von TT / MM / JJJJ das Format TT / MM / JJJJ verwendet werden sollte, da "m" Minuten und "M" Monat bedeutet.
Demwis
Ist es nicht besser, die compareTo () -Methode zu verwenden?
Klasse Android
25

Sie können compareTo () verwenden

Die CompareTo-Methode muss eine negative Zahl zurückgeben, wenn das aktuelle Objekt kleiner als ein anderes Objekt ist, eine positive Zahl, wenn das aktuelle Objekt größer als ein anderes Objekt ist, und eine Null, wenn beide Objekte gleich sind.

// 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 "); 
}
IntelliJ Amiya
quelle
1
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe, durch die verdrängte java.time Klassen. Die meisten Funktionen von java.time werden im ThreeTen-Backport- Projekt auf Java 6 und Java 7 zurückportiert . Weiter angepasst für früheres Android (<26) in ThreeTenABP . Siehe Verwendung von ThreeTenABP… .
Basil Bourque
10

Sie können direkt ein erstellen Calendaraus Date:

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

Beachten Sie, dass das richtige Format ("TT / MM / JJJJ") ist, bevor der Code funktioniert. "mm" bedeutet Minuten!

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

 }
Siva krishna
quelle
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe, durch die verdrängte java.time Klassen. Die meisten Funktionen von java.time werden im ThreeTen-Backport- Projekt auf Java 6 und Java 7 zurückportiert . Weiter angepasst für früheres Android (<26) in ThreeTenABP . Siehe Verwendung von 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();
    }

es gibt true zurück .. und Sie können auch vor und gleich mit Hilfe von date.before und date.equal überprüfen.

Dilavar Malek
quelle
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));

Vergleicht die von diesem Kalender dargestellte Zeit mit der durch den angegebenen Kalender dargestellten Zeit.

Gibt 0 zurück, wenn die Zeiten der beiden Kalender gleich sind, -1, wenn die Zeit dieses Kalenders vor der anderen liegt, 1, wenn die Zeit dieses Kalenders nach der anderen liegt.

Kirit Vaghela
quelle
1
Danke. Es hilft mir.
PRANAY
2

Konvertieren Sie das Datum in Kalender und führen Sie dort Ihre Berechnungen durch. :) :)

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)

Oder:

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

if (strDate.after(new Date()) {
    catalog_outdated = 1;
}
Nuno Gonçalves
quelle
2

Zeit für die moderne Antwort.

java.time und 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");
    }

Als ich diesen Code gerade ausführte, war die Ausgabe:

Katalog ist veraltet

Da es in allen Zeitzonen nie dasselbe Datum ist, geben Sie eine explizite Zeitzone an LocalDate.now. Wenn Sie möchten, dass der Katalog in allen Zeitzonen gleichzeitig abläuft, können Sie angeben, ZoneOffset.UTCsolange Sie Ihre Benutzer darüber informieren, dass Sie UTC verwenden.

Ich verwende java.time, die moderne Java-API für Datum und Uhrzeit. Die Datum-Zeit - Klassen, die verwendet wird , Calendar, SimpleDateFormatund Datesind alle schlecht konzipiert und zum Glück lange überholt. Auch trotz des Namens Daterepräsentiert a kein Datum, sondern einen Zeitpunkt. Eine Konsequenz daraus ist: Obwohl heute der 15. Februar 2019 ist, ist ein neu erstelltes DateObjekt bereits nach einem DateObjekt aus dem Parsen (also nicht gleich) 15/02/2019. Dies verwirrt einige. Im Gegensatz dazu ist die Moderne LocalDateein Datum ohne Tageszeit (und ohne Zeitzone), sodass zwei LocalDates, die das heutige Datum darstellen, immer gleich sind.

Frage: Kann ich java.time unter Android verwenden?

Ja, java.time funktioniert gut auf älteren und neueren Android-Geräten. Es erfordert nur mindestens Java 6 .

  • In Java 8 und höher und auf neueren Android-Geräten (ab API-Level 26) ist die moderne API integriert.
  • In Java 6 und 7 erhalten Sie den ThreeTen Backport, den Backport der modernen Klassen (ThreeTen für JSR 310; siehe die Links unten).
  • Verwenden Sie auf (älteren) Android die Android-Edition von ThreeTen Backport. Es heißt ThreeTenABP. Und stellen Sie sicher, dass Sie die Datums- und org.threeten.bpZeitklassen mit Unterpaketen importieren.

Links

Ole VV
quelle
1

Sie könnten dies versuchen

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

und Sie könnten verwenden today.getTime(), um Wert abzurufen und zu vergleichen.

Anurag Ramdasan
quelle
1

Manchmal müssen wir eine Liste mit Daten erstellen, wie z

heute mit Stunde

gestern mit gestern

andere Tage mit 23/06/2017

Dazu müssen wir die aktuelle Zeit mit unseren Daten vergleichen.

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

Sie können dieses Beispiel auch in GitHub und in diesem Beitrag überprüfen .

Cabezas
quelle
1

Update: Die Joda-Time- Bibliothek befindet sich jetzt im Wartungsmodus und empfiehlt die Migration auf das darauf folgende Java.time- Framework. Siehe die Antwort von Ole VV .


Joda-Zeit

Die Klassen java.util.Date und .Calendar sind notorisch problematisch. Vermeide sie. Verwenden Sie entweder Joda-Time oder das neue Paket java.time in Java 8.

LocalDate

Wenn Sie nur ein Datum ohne Uhrzeit wünschen, verwenden Sie die LocalDate-Klasse.

Zeitzone

Das Abrufen des aktuellen Datums hängt von der Zeitzone ab. Ein neues Datum rollt in Paris vor Montréal. Geben Sie die gewünschte Zeitzone an, anstatt von der Standardeinstellung der JVM abzuhängen.

Beispiel in Joda-Zeit 2.3.

DateTimeFormat formatter = DateTimeFormat.forPattern( "d/M/yyyy" );
LocalDate localDate = formatter.parseLocalDate( "1/1/1990" );
boolean outdated = LocalDate.now( DateTimeZone.UTC ).isAfter( localDate );
Basil Bourque
quelle
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..//
}
kartik_g
quelle
0

Kotlin unterstützt das Überladen von Bedienern

In Kotlin können Sie Daten einfach mit Vergleichsoperatoren vergleichen. Weil Kotlin bereits das Überladen von Bedienern unterstützt. So vergleichen Sie Datumsobjekte:

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

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

und wenn Sie Kalenderobjekte verwenden, können Sie diese leicht vergleichen:

if(cal1.time < cal2.time){
// cal1 date is before cal2 date
}
Khaled Qasem
quelle