Il modo migliore per confrontare le date su Android


102

Sto cercando di confrontare una data in un formato String con la data corrente. È così che l'ho fatto (non l'ho testato, ma dovrebbe funzionare), ma sto usando metodi deprecati. Qualche buon suggerimento per un'alternativa? Grazie.

PS Odio davvero fare cose di Date in Java. Ci sono così tanti modi per fare la stessa cosa, che davvero non sei sicuro di quale sia quello corretto, da qui la mia domanda qui.

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
Nel 2018 il modo migliore non comporta Calendar, SimpleDateFormat, Dateo una qualsiasi delle altre classi di data e ora Java obsoleti lunghi. Utilizza invece java.timela moderna API di data e ora Java . Sì, puoi usarlo su Android. Per Android meno recenti, vedere Come utilizzare ThreeTenABP in Android Project .
Ole VV

Risposte:


219

Il tuo codice potrebbe essere ridotto a

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

o

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

funziona sicuramente, ho pubblicato la stessa soluzione in un altro thread ma non qui perché il collega era più veloce O_o.
Simon Dorociak

volevo solo essere sicuro, prima di accettare. Grazie. ha funzionato perfettamente ed è conciso e semplice come desiderato.
suore

16
Penso che dovrebbe essere usato il formato gg / MM / aaaa invece di gg / mm / aaaa, perché "m" significa minuti e "M" significa mese.
Demwis

Non sarebbe meglio usare il metodo compareTo ()?
classe Android

25

Puoi usare compareTo ()

Il metodo CompareTo deve restituire un numero negativo se l'oggetto corrente è minore di un altro oggetto, un numero positivo se l'oggetto corrente è maggiore di un altro oggetto e zero se entrambi gli oggetti sono uguali tra loro.

// 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
Cordiali saluti, le classi data-ora vecchi problematici, come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono l'eredità, soppiantato dai java.time classi. La maggior parte delle funzionalità java.time è sottoposta a back port su Java 6 e Java 7 nel progetto ThreeTen-Backport . Ulteriormente adattato per Android precedente (<26) in ThreeTenABP . Vedi Come usare ThreeTenABP… .
Basil Bourque

10

Puoi creare direttamente un Calendarda Date:

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

10

Notare che il formato corretto è ("dd / MM / yyyy") prima che il codice funzioni. "mm" significa 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

 }

Cordiali saluti, le classi data-ora vecchi problematici, come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono l'eredità, soppiantato dai java.time classi. La maggior parte delle funzionalità java.time è sottoposta a back port su Java 6 e Java 7 nel progetto ThreeTen-Backport . Ulteriormente adattato per Android precedente (<26) in ThreeTenABP . Vedi Come usare 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();
    }

restituisce vero .. e puoi anche controllare prima e uguale con l'aiuto di date.before e date.equal ..


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

Confronta l'ora rappresentata da questo calendario con quella rappresentata dal calendario dato.

Restituisce 0 se le ore dei due calendari sono uguali, -1 se l'ora di questo calendario è precedente all'altra, 1 se l'ora di questo calendario è successiva all'altra.


1
Grazie .. Mi aiuta.
PRANAY

2

converti la data in Calendario e calcola lì. :)

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)

O:

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

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

2

Tempo per la risposta moderna.

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

Quando ho eseguito questo codice proprio ora, l'output era:

Il catalogo è obsoleto

Poiché non è mai la stessa data in tutti i fusi orari, fornire un fuso orario esplicito a LocalDate.now. Se vuoi che il catalogo scada alla stessa ora in tutti i fusi orari, puoi dare ZoneOffset.UTCil tempo che informi gli utenti che stai usando UTC.

Sto usando java.time, la moderna API di data e ora Java. Le classi data-ora che hai usato Calendar, SimpleDateFormate Date, sono tutte mal progettate e fortunatamente obsolete. Inoltre, nonostante il nome a Datenon rappresenta una data, ma un punto nel tempo. Una conseguenza di ciò è: anche se oggi è il 15 febbraio 2019, un Dateoggetto appena creato è già dopo (quindi non uguale a) un Dateoggetto dall'analisi 15/02/2019. Questo confonde alcuni. Contrariamente a ciò, il moderno LocalDateè una data senza ora del giorno (e senza fuso orario), quindi due LocalDates che rappresentano la data odierna saranno sempre uguali.

Domanda: posso usare java.time su Android?

Sì, java.time funziona bene su dispositivi Android vecchi e nuovi. Richiede solo almeno Java 6 .

  • In Java 8 e versioni successive e sui dispositivi Android più recenti (dal livello API 26) l'API moderna è incorporata.
  • In Java 6 e 7 ottieni il ThreeTen Backport, il backport delle classi moderne (ThreeTen per JSR 310; vedi i link in basso).
  • Su Android (meno recenti) utilizzare l'edizione Android di ThreeTen Backport. Si chiama ThreeTenABP. E assicurati di importare le classi di data e ora da org.threeten.bpcon sottopacchetti.

link


1

Potresti provare questo

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

e potresti usare today.getTime()per recuperare valore e confrontare.


1

A volte abbiamo bisogno di fare un elenco con le date, come

oggi con l'ora

ieri con ieri

altri giorni con il 23/06/2017

Per fare ciò dobbiamo confrontare l'ora corrente con i nostri dati.

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

Inoltre puoi controllare questo esempio in GitHub e questo post .


1

Aggiornamento: la libreria Joda-Time è ora in modalità di manutenzione e consiglia di migrare al framework java.time che ha successo. Vedi la risposta di Ole VV .


Joda-Time

Le classi java.util.Date e .Calendar sono notoriamente fastidiose. Evitali. Utilizza Joda-Time o il nuovo pacchetto java.time in Java 8.

LocalDate

Se desideri solo la data senza l'ora del giorno, utilizza la classe LocalDate.

Fuso orario

Ottenere la data corrente dipende dal fuso orario. Una nuova data si avvicina a Parigi prima di Montréal. Specificare il fuso orario desiderato piuttosto che dipendere dall'impostazione predefinita della JVM.

Esempio in 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 supporta il sovraccarico degli operatori

In Kotlin puoi facilmente confrontare le date con gli operatori di confronto. Perché Kotlin supporta già il sovraccarico degli operatori. Quindi, per confrontare gli oggetti data:

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

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

e se stai utilizzando oggetti del calendario, puoi facilmente confrontare in questo modo:

if(cal1.time < cal2.time){
// cal1 date is before cal2 date
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.