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.

Daveb
quelle
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.

Florent Guillaume
quelle
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.

Ortomala Lokni
quelle
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");
}
javaCity
quelle
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
Az.MaYo
quelle
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);
}
Evya
quelle
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!";
 }
Rabi
quelle
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

Tiina
quelle
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);
Abdur Rahman
quelle
-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);

harun ugur
quelle
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