Frage

Im Moment habe ich diesen Code verwende

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

Es muss ein glatter Weg, um zu überprüfen, ob das Datum von getdateFromLine () zurück gestrigem Datum ist. Nur der Zeitpunkt zählt, nicht die Zeit. Deshalb habe ich Simple verwendet. Vielen Dank für Ihre Hilfe im Voraus!

War es hilfreich?

Lösung

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

Dies wird auch Arbeit für Daten wie 1. Januar.

Andere Tipps

java.time

Mit java.time Framework integriert 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

Offizielle Oracle LocalDate Tutorial Staaten

  

Das Gleichheits sollten Verfahren für Vergleiche verwendet werden.

Wenn Sie die Arbeit mit Objekten wie LocalDateTime , ZonedDateTime oder < a href = "http://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html" rel = "noreferrer"> OffsetDateTime , können Sie auf LocalDate .

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

Ich bin mit Ash Kim, dass die Joda-Time Bibliothek ist der Weg zu gehen, wenn Sie möchten, dass Ihre geistige Gesundheit bewahren.

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 diesem Beispiel, wenn die Datetime day von gestern ist, dann wird dayIsYesterday(day) true zurück.

Vermeiden Sie

java.util.Date & .Calendar

Die akzeptierte Antwort ist technisch korrekt, aber weniger als optimal. Die java.util.Date und .Calendar Klassen sind notorisch schwierig. Vermeide sie. Verwenden Sie entweder Joda-Time oder die neue java.time Paket (in Java 8).

Zeitzone

Zeitzone ist entscheidend Datum Zeitarbeit. Wenn Sie das Problem ignorieren, wird die JVM-Standardzeitzone angewendet werden. Eine bessere Praxis ist immer eher zu geben, als auf Standard zu verlassen. Selbst wenn Sie den Standard wollen, explizit getDefault nennen.

Der Beginn des Tages wird durch die Zeitzone definiert. Ein neuer Tag bricht früher in Berlin als in Montréal. So ist die Definition von „heute“ und „gestern“ erfordert eine Zeitzone.

Joda-Time

Beispiel-Code in Joda-Time 2.3.

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

Eine Möglichkeit, gestern um zu bestimmen, ist von zu LOCALDATE Objekten zu konvertieren. Ein anderer Weg, hier gezeigt wird, ist „gestern“ als Zeitspanne darzustellen. Wir definieren, dass die Spanne vom ersten Moment der gestern ging bis zu , aber nicht einschließlich ersten Moment von heute. Dieser Ansatz wird als "halb offen", wo der Anfang inklusive und das Ende ist exklusiv .

Tag subtrahiert, um gestern zu bekommen (oder Tag vor).

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

Konvertieren Sie Ihr Ziel java.util.Date Objekt in ein Joda-Time Datetime-Objekt. Tragen Sie eine Zeitzone zu diesem neuen Objekt, anstatt auf der Anwendung von Standard-Zeitzone des JVM. Technisch hier die Zeitzone ist in diesem Fall irrelevant, aber eine Zeitzone einschließlich ist eine gute Gewohnheit.

DateTime target = new DateTime( myJUDate, timeZone );

Test, wenn die Zielländer innerhalb des Intervalls von gestern.

boolean isYesterday = yesterdayInterval.contains( target );

Offensichtlich dieser Ansatz mit halboffenen Zeitspanne arbeitet mit mehr als nur „gestern“, wie „dieser Woche“, „im letzten Monat“, und so weiter.

Aktualisiert: Das Joda-Time Projekt ist jetzt in dem Wartungsmodus. Das Team berät Migration in die java.time Klassen. Siehe die java.time Lösung in der korrekten Antwort von Przemek .

Anstatt der Kalender versuchen Sie dies:

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

Dies sollten Sie ermöglichen, vorwärts und rückwärts entlang des Kalenders zu bewegen

Dann können Sie einfach die getDateFromLine vergleichen (Linie) mit dem prevDate Wert oder was auch immer Sie mögen.

Ich empfehle Sie prüfen, mit Joda-Time . Es ist freaking viel besser als die JDK-Angebote.

Ich habe es ein wenig verwirren gefunden, wenn ich auf diese Weise verwenden diese Methode zu testen

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

Meine erwarten ist drucken 1999-12-31 , aber die wirklich ist 2001.01.31 Ich denke, Calendar.add () nur mit Tag im Monat beschäftigen.

Aber der tatsächliche Fehler ist die Art, wie ich das Kalender-Objekt erstellen. Im Kalender Monat beginnen mit 0 , der Wert der Variablen jetzt der 2001.02.01, ich war, um nicht Dünkel zu drucken it.when ich etwas falsch war gefunden. richtiger Weg, um einen Kalender zu erstellen ist:

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

Der Kalender war so seltsam zu einem ex C # Programmierer: (

So etwas wie dieses in etwa:

         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 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top