Domanda

In questo momento sto usando questo codice

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE) - 1, 12, 0, 0); //Sets Calendar to "yeserday, 12am"
if(sdf.format(getDateFromLine(line)).equals(sdf.format(cal.getTime())))                         //getDateFromLine() returns a Date Object that is always at 12pm
{...CODE

Ci deve essere un modo più agevole per verificare se la data restituita dalla getdateFromLine () è la data di ieri. Solo la data conta, non il tempo. Ecco perché ho usato SimpleDateFormat. Grazie per il vostro aiuto in anticipo!

È stato utile?

Soluzione

Calendar c1 = Calendar.getInstance(); // today
c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday

Calendar c2 = Calendar.getInstance();
c2.setTime(getDateFromLine(line)); // your date

if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR)
  && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) {

Questo lavoro anche per date come 1 gennaio.

Altri suggerimenti

java.time

Utilizzando quadro java.time integrato in Java 8

LocalDate now = LocalDate.now(); //2015-11-24
LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23

yesterday.equals(now); //false
yesterday.equals(yesterday); //true

Ufficiale Oracle LocalDate esercitazione Uniti

  

Il equivale metodo deve essere utilizzato per i confronti.

Se si lavora con oggetti come LocalDateTime , ZonedDateTime , o < a href = "http://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html" rel = "noreferrer"> OffsetDateTime , si può convertire in LocalDate .

LocalDateTime.now().toLocalDate(); # 2015-11-24

Sono d'accordo con Ash Kim quella libreria il Joda Time è la strada da percorrere se si desidera mantenere la vostra sanità mentale.

import org.joda.time.DateTime;

public static boolean dayIsYesterday(DateTime day) {
    DateTime yesterday = new DateTime().withTimeAtStartOfDay().minusDays(1);
    DateTime inputDay = day.withTimeAtStartOfDay();

    return inputDay.isEqual(yesterday);
}

In questo esempio, se il day DateTime è da ieri allora dayIsYesterday(day) tornerà true.

Evitare java.util.Date & .Calendar

Il accettato risposta è tecnicamente corretta ma non ottimali. Le classi java.util.Date e .calendar sono notoriamente fastidiosi. Evitare di loro. Utilizzare uno Joda Time o il nuovo pacchetto java.time (in Java 8).

Fuso orario

Fuso orario è fondamentale nel lavoro di data-ora. Se si ignora il problema, verrà applicato il fuso orario predefinito della JVM. Una pratica migliore è quella di indicare sempre, piuttosto che fare affidamento su di default. Anche quando si desidera che il valore predefinito, richiamare esplicitamente getDefault.

L'inizio della giornata è definita dal fuso orario. Un nuovo giorno precedenti a Berlino che a Montreal. Così la definizione di "oggi" e "ieri" richiede un fuso orario.

Joda Time

Esempio di codice in Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Berlin" );
DateTime today = DateTime.now( timeZone ); 

Un modo per determinare ieri è convertendo agli oggetti LocalDate. Un altro modo, qui illustrato, è di rappresentare "ieri" come un arco di tempo. Definiamo quella portata come andare dal primo momento di ieri fino a ma non includendo il primo momento di oggi. Questo approccio è chiamato "half-open" dove l'inizio è inclusiva e il finale è esclusivo .

Sottrarre un giorno per arrivare a ieri (o il giorno prima).

DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval( yesterdayStartOfDay, today.withTimeAtStartOfDay() );

Convertire l'oggetto java.util.Date obiettivo di un oggetto Joda-Time DateTime. Applicare un fuso orario per il nuovo oggetto, piuttosto che affidarsi a applicare fuso orario predefinito di JVM. Tecnicamente il fuso orario qui in questo caso è irrilevante, ma tra cui un fuso orario è una buona abitudine.

DateTime target = new DateTime( myJUDate, timeZone );

Prova se le terre bersaglio entro l'intervallo di ieri.

boolean isYesterday = yesterdayInterval.contains( target );

Ovviamente questo approccio con la portata semiaperta di opere di tempo con più di un semplice "ieri", come "questa settimana", "il mese scorso", e così via.

Aggiornamento: Il progetto Joda Time è ora in modalità di manutenzione. Il team consiglia di migrazione alle classi java.time. Vedere la soluzione java.time nel corretta risposta da Przemek .

Invece di impostare il calendario provare questo:

public static void main(String[] args) {
    int DAY_IN_MILLIS = 1000 * 60 * 60 * 24;
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
    String prevDate = dateFormat.format(date.getTime() - DAY_IN_MILLIS);
    String currDate = dateFormat.format(date.getTime());
    String nextDate = dateFormat.format(date.getTime() + DAY_IN_MILLIS);
    System.out.println("Previous date: " + prevDate);
    System.out.println("Current date: " + currDate);
    System.out.println("Next date: " + nextDate);
  }

Ciò dovrebbe consentire di spostare avanti e indietro lungo il calendario

Poi si può semplicemente confrontare la getDateFromLine (linea) al valore prevDate o quello che vuoi.

vi consiglio di considerare l'utilizzo Joda-Time . Sta impazzendo modo migliore rispetto alle offerte JDK.

Ho trovato un po 'confuso quando uso questo modo di testare questo metodo

 Calendar now = new GregorianCalendar(2000, 1, 1);
 now.add(Calendar.DATE, -1);

 SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd");
 System.out.println(format.format(now.getTime()));

Il mio aspetta è quello di stampare 1999-12-31 , ma le è reale 2001/1/31 Credo che Calendar.add () trattare solo con il giorno in mese.

Ma l'errore effettivo è il mio modo di creare l'oggetto calendario. In calendario, inizia il mese con 0 , la variabile del valore è ora 2001/02/01, ero così presunzione di non stampare it.When ho trovato qualcosa non andava. modo corretto per creare un calendario è il seguente:

 Calendar now = new GregorianCalendar(2000, Calendar.JANUARY, 1);

Il calendario è stato così strano per un programmatore ex C #: (

Qualcosa di simile a questo grosso modo:

         Calendar c1 = Calendar.getInstance();
         Date d1 = new Date(/* control time */);
         c1.setTime(d1);

        //current date
        Calendar c2 = Calendar.getInstance();

        int day1=c1.get(Calendar.DAY_OF_YEAR);
        int day2=c2.get(Calendar.DAY_OF_YEAR);

       //day2==day1+1 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top