Ich möchte Jahr, Monat, Tag usw. vom Java-Datum abrufen, um es mit dem Gregorianischen Kalenderdatum in Java zu vergleichen. Ist das möglich?


231

Ich habe ein Date-Objekt in Java als Java-Datumstyp gespeichert.

Ich habe auch ein Gregorianisches Kalendererstellungsdatum. Das gregorianische Kalenderdatum hat keine Parameter und ist daher eine Instanz des heutigen Datums (und der heutigen Uhrzeit?).

Mit dem Java-Datum möchte ich in der Lage sein, das Jahr, den Monat, den Tag, die Stunde, die Minute und die Sekunden aus dem Java-Datumstyp abzurufen und das Datum des Gregorianischen Kalenders zu vergleichen.

Ich habe gesehen, dass im Moment das Java-Datum als Long gespeichert ist und die einzigen verfügbaren Methoden scheinen, nur das Long als formatierte Datumszeichenfolge zu schreiben. Gibt es eine Möglichkeit, auf Jahr, Monat, Tag usw. zuzugreifen?

Ich sah , dass die getYear(), getMonth()etc. Methoden zur DateKlasse veraltet. Ich habe mich gefragt, was die beste Vorgehensweise ist, um die Java Date-Instanz zu verwenden, die ich mit dem GregorianCalendarDatum habe.

Mein Endziel ist es, eine Datumsberechnung durchzuführen, damit ich überprüfen kann, ob das Java-Datum innerhalb so vieler Stunden, Minuten usw. des heutigen Datums und der heutigen Uhrzeit liegt.

Ich bin immer noch ein Neuling in Java und bin ein bisschen verwirrt darüber.


1
Hey, was auch immer du benutzt, benutze es nicht. Date.getYear()Es leidet unter Problemen (die ich nicht kenne). Date.getYear()Ich habe einmal mein Datum 30/06/2017 analysiert und es hat mein Jahr als 117 zurückgegeben. Sehen Sie, wo es gelandet ist, vor zweitausend Jahren. Aber wenn ich einfach das Datumsobjekt drucke, war die Ausgabe in Ordnung Date.getYear();. Aber nicht .
Seenivasan

Zu Ihrer Information: Sie verwenden problematische alte Datums- / Uhrzeitklassen, die jetzt älter sind und durch die modernen java.time-Klassen ersetzt werden.
Basil Bourque

Antworten:


543

Verwenden Sie etwas wie:

Date date; // your date
// Choose time zone in which you want to interpret your Date
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// etc.

Achtung, Monate beginnen bei 0, nicht bei 1.

Bearbeiten : Seit Java 8 ist es besser, java.time.LocalDate als java.util.Calendar zu verwenden . In dieser Antwort erfahren Sie, wie es geht.


4
Sie können cal.add(Calendar.DAY_OF_MONTH, -48)Tagesarithmetik für Kalenderobjekte ausführen. Und Sie können zwei Kalenderobjekte mit vergleichen cal.compareTo(anotherCal).
Florent Guillaume

1
Genial, Prost Florent! Bedeutet dies, dass der Kalender aktualisiertes Jahr und Tag, Sekunden, Minuten und Sekunden zurückgibt, wenn die Kalender-Abrufmethoden verwendet werden? Dave
Daveb

11
Beachten Sie, dass der Monat mit 0 und nicht mit 1 beginnt (dh Januar = 0). docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo

10
Warum ist JAVA so unpraktisch?
Kimchi Man

3
Weil Datum und Kalender alt und schlecht gestaltet sind. Java 8 hat viel bessere Daten- / Zeitobjekte
Florent Guillaume

88

Mit Java 8 und höher können Sie das Date- Objekt in ein LocalDate- Objekt konvertieren und dann problemlos Jahr, Monat und Tag abrufen .

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year  = localDate.getYear();
int month = localDate.getMonthValue();
int day   = localDate.getDayOfMonth();

Beachten Sie, dass getMonthValue()ein int-Wert von 1 bis 12 zurückgegeben wird.


10
Jetzt ist 2016, ich glaube, die Verwendung LocalDatein Java 8 ist die beste Lösung, die Ihre Zeit spart, eine andere Lösung, die verwendet wird Calendarund Datevoller Probleme ist.
AnnieFromTaiwan

2
Tolle Antwort - auf jeden Fall am besten java.time verwenden und die lästigen alten Datums- / Uhrzeitklassen vermeiden. Beachten Sie auch, wie diese Antwort das Problem der Zeitzone mit Bedacht angeht. Für jeden Moment variiert das Datum weltweit nach Zeitzone.
Basil Bourque

Leider API Level 26+ für Android.
Wiktor Kalinowski

14

Sie könnten so etwas tun, es wird erklären, wie die DateKlasse funktioniert.

String currentDateString = "02/27/2012 17:00:00";
SimpleDateFormat sd = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentDate = sd.parse(currentDateString);

String yourDateString = "02/28/2012 15:00:00";
SimpleDateFormat yourDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date yourDate = yourDateFormat.parse(yourDateString);

if (yourDate.after(currentDate)) {
    System.out.println("After");
} else if(yourDate.equals(currentDate)) {
    System.out.println("Same");
} else {
    System.out.println("Before");
}

Hallo JavaCity, Danke dafür. das ist sehr nützlich. Im Moment versuche ich, mich vor dem Parsen einer Datumszeichenfolge zu scheuen. Ich muss diese Analyse jedoch später durchführen, wenn Benutzer meiner Anwendung Jahr, Tag und Monat festlegen. Ich wollte eine Zeichenfolge erstellen, um sie in SimpleDateFormat zu analysieren. Das Obige ist sehr nützlich, um dies in Aktion zu sehen. Mein Java-Datum wurde als Datum und Uhrzeit nach seiner Instanziierung vor einem Tag erstellt. Ich möchte jetzt mit dem Datum des Gregorianischen Kalenders vergleichen, das heute instanziiert wurde.
Herzlichen

8
Bitte korrigieren Sie den Code ... Kleinbuchstaben mmgeben Minuten an, Großbuchstaben MMbedeuten Monat des Jahres.
YoYo

12
    Date date = new Date();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");

    System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("MMMM");
    System.out.println("MONTH "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("YYYY");
    System.out.println("YEAR "+simpleDateFormat.format(date).toUpperCase());

EDIT: Die Ausgabe für date= Fri Jun 15 09:20:21 CEST 2018ist:

DAY FRIDAY
MONTH JUNE
YEAR 2018

Wenn Sie mindestens die Ausgabe eingegeben hätten, könnten die Benutzer entscheiden, ob dies für sie nützlich sein könnte oder nicht, ohne den Code ausführen zu müssen.
SantiBailors

6
private boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
    boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
    return (sameDay && sameMonth && sameYear);
}

3
    Date queueDate = new SimpleDateFormat("yyyy-MM-dd").parse(inputDtStr);
    Calendar queueDateCal = Calendar.getInstance();
    queueDateCal.setTime(queueDate);
    if(queueDateCal.get(Calendar.DAY_OF_YEAR)==Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
{
    "same day of the year!";
 }

1
Es wird erwartet, dass die Antworten zum Stapelüberlauf einige Diskussionen und Erklärungen enthalten, nicht nur Codefragmente. Und Ihr Code könnte definitiv eine Erklärung gebrauchen.
Basil Bourque

1
Zu Ihrer Information, die furchtbar lästig alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .
Basil Bourque

2
@Test
public void testDate() throws ParseException {
    long start = System.currentTimeMillis();
    long round = 100000l;
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay(new Date());
    }
    long mid = System.currentTimeMillis();
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay2(new Date());
    }
    long end = System.currentTimeMillis();
    System.out.println(mid - start);
    System.out.println(end - mid);
}

public static Date getYearMonthDay(Date date) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("yyyyyMMdd");
    String dateStr = f.format(date);
    return f.parse(dateStr);
}

public static Date getYearMonthDay2(Date date) throws ParseException {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.HOUR_OF_DAY, 0);
    return c.getTime();
}
public static int compare(Date today, Date future, Date past) {
    Date today1 = StringUtil.getYearMonthDay2(today);
    Date future1 = StringUtil.getYearMonthDay2(future);
    Date past1 = StringUtil.getYearMonthDay2(past);
    return today.compare // or today.after or today.before
}

getYearMonthDay2 (die Kalenderlösung) ist zehnmal schneller. Jetzt haben Sie JJJJ MM TT 00 00 00 und vergleichen dann mit date.compare


2

Es könnte einfacher sein

     Date date1 = new Date("31-May-2017");
OR
    java.sql.Date date1 = new java.sql.Date((new Date()).getTime());

    SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
    SimpleDateFormat formatNowMonth = new SimpleDateFormat("MM");
    SimpleDateFormat formatNowYear = new SimpleDateFormat("YYYY");

    String currentDay = formatNowDay.format(date1);
    String currentMonth = formatNowMonth.format(date1);
    String currentYear = formatNowYear.format(date1);

-2

Seien Sie vorsichtig, beginnen Sie bei 0 und nicht bei 1. Und auch Kalender verwenden Sie pm wie am, damit Sie bei der Verwendung von Stunden und Minuten sehr vorsichtig sind.

Date your_date;
Calendar cal = Calendar.getInstance(); 
cal.setTime(your_date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MINUTE);


1
Verwenden Sie besser die moderne java.time, die diese lästigen alten Legacy-Klassen ersetzt, die hier gezeigt werden. Siehe richtige Antwort
Basil Bourque

Vielen Dank für Antwort und Vorschlag. Es ist sehr besser.
Harun Ugur
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.