webentwicklung-frage-antwort-db.com.de

Der beste Weg, um Daten in Android zu vergleichen

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

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

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

Sie können compareTo () verwenden.

Die CompareTo-Methode muss eine negative Zahl zurückgeben, wenn das aktuelle Objekt kleiner ist als anderes Objekt positive Zahl, wenn das aktuelle Objekt größer als .__ ist. anderes Objekt und 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 "); 
}
11
IntelliJ Amiya

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

Sie können eine Calendar direkt aus einer Date erstellen:

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

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

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

Vergleicht die durch diesen 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 dem anderen liegt, 1, wenn die Zeit dieses Kalenders hinter dem anderen Kalender liegt.

2
Kirit Vaghela

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 diesem post überprüfen.

1
Cabezas

konvertieren Sie das Datum in den Kalender und berechnen Sie dort Ihre Berechnungen. :)

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

Sie könnten es 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önnen today.getTime() verwenden, um den Wert abzurufen und zu vergleichen.

1
Anurag Ramdasan

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 ausgeführt habe, war die Ausgabe:

Katalog ist veraltet

Da es in allen Zeitzonen niemals das gleiche Datum ist, geben Sie LocalDate.now eine explizite Zeitzone. Wenn Sie möchten, dass der Katalog in allen Zeitzonen gleichzeitig abläuft, können Sie ZoneOffset.UTC angeben, sofern Sie die Benutzer darüber informieren, dass Sie UTC verwenden.

Ich verwende Java.time, die moderne Java-API für Datum und Uhrzeit. Die von Ihnen verwendeten Datum-Uhrzeit-Klassen, Calendar, SimpleDateFormat und Date, sind alle schlecht entwickelt und zum Glück lange veraltet. Trotz des Namens steht ein Date nicht für ein Datum, sondern für einen Zeitpunkt. Eine Konsequenz daraus ist: Obwohl heute der 15. Februar 2019 ist, ist ein neu erstelltes Date-Objekt bereits after (also nicht gleich) ein Date-Objekt aus der Analyse von 15/02/2019. Das verwirrt einige. Im Gegensatz dazu ist das moderne LocalDate ein Datum ohne Tageszeit (und ohne Zeitzone), so dass zwei LocalDates, die das heutige Datum darstellen, immer gleich sind.

Frage: Kann ich Java.time auf Android verwenden?

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

  • In Java 8 und höher und auf neueren Android-Geräten (ab API-Ebene 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).
  • Bei (älterem) Android verwenden Sie die Android-Version von ThreeTen Backport. Es heißt ThreeTenABP. Stellen Sie sicher, dass Sie die Datums- und Zeitklassen aus org.threeten.bp mit Unterpaketen importieren.

Links

1
Ole V.V.

Joda-Zeit

Die Klassen Java.util.Date und .Calendar sind bekanntermaßen lästig. Vermeide sie. Verwenden Sie entweder Joda-Time oder das neue Java.time-Paket in Java 8.

LocalDate

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

Zeitzone

Das Abrufen des aktuellen Datums hängt von der Zeitzone ab. Vor Montréal läuft ein neues Datum in Paris vorbei. Geben Sie die gewünschte Zeitzone an und hängen Sie nicht von der Standardeinstellung der JVM ab.

Beispiel in der 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 );
0
Basil Bourque

Sie können validDate.setTime (strDate) .__ verwenden. Schauen Sie sich das Javadoc unter http://docs.Oracle.com/javase/1.5.0/docs/api/Java/util/Calendar an .html

0
phlogratos