Wie erhalte ich den Monat als Ganzzahl von einem Date-Objekt ( java.util.Date
)?
Wie erhalte ich den Monat als Ganzzahl von einem Date-Objekt ( java.util.Date
)?
Antworten:
Sie können auch das Paket java.time in Java 8 verwenden, Ihr java.util.Date
Objekt in ein java.time.LocalDate
Objekt konvertieren und dann einfach die getMonthValue()
Methode verwenden.
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Beachten Sie, dass hier Monatswerte von 1 bis 12 angegeben werden, im Gegensatz zu cal.get(Calendar.MONTH)
adarshrs Antwort, die Werte von 0 bis 11 angibt.
Aber wie Basil Bourque in den Kommentaren sagte, ist der bevorzugte Weg, ein Month
Enum-Objekt mit der LocalDate::getMonth
Methode zu erhalten.
ZoneId.of( "America/Montreal" )
.
Month
Enum-Objekt anstelle einer bloßen Ganzzahl erhalten. Month m = localDate.gotMonth();
Siehe LocalDate::getMonth
Methode. Durch die Verwendung solcher Objekte wird Ihr Code selbstdokumentiert, die Typensicherheit gewährleistet und gültige Werte garantiert. Siehe Enum-Tutorial von Oracle.
date.toInstant()
und zufällig mit einem java.sql.Date
(dem Kind von java.util.Date
) arbeiten, erhalten Sie ein UnsupportedOperationException
. Versuchen Sienew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
Mit den neuen Konvertierungsmethoden, die dieser alten Klasse hinzugefügt wurden, ist das Konvertieren viel einfacher . java.sql.Date.valueOf( myLocalDate )
und myJavaSqlDate.toLocalDate()
auch JDBC - Treiber für JDBC aktualisiert 4.2 oder später nicht mehr brauchen java.sql
Typen und können direkt java.time
Adresstypen über die ResultSet::getObject
und PreparedStatement::setObject
Methoden.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
ohne ersichtlichen Grund NULL-basiert ist, dh Januar == 0. Nun, das ist in der API gut dokumentiert, aber für Erstbenutzer ist es immer noch verdammt verwirrend. Ich habe noch niemanden gefunden, der mir sagen könnte, warum sie so vorgegangen sind - vielleicht selbst Zeit für eine neue SO-Frage (obwohl ich befürchte, dass es dafür keinen großartigen Hintergrund gibt: /)
getYear()
wird auch "ohne ersichtliche Gründe" bis 1900 abgezogen.
Wenn Sie Java 8 Date API verwenden, können Sie es direkt in einer Zeile erhalten!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
Alternativ mit der Joda-Time- DateTime
Klasse.
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
…oder…
int month = dateTime.getMonthOfYear();
DateTime
Objekt nach seinem Monat. int month = dateTime.getMonthOfYear();
.toString("MM")
jedoch, da es mehr Möglichkeiten gibt als nur "MM".
DateTimeZone
Objekt an diesen DateTime-Konstruktor zu übergeben : DateTimeZone.forID( "America/Montreal" )
.
myUtilDate.toInstant() // Convert from legacy class to modern. `Instant` is a point on the timeline in UTC.
.atZone( // Adjust from UTC to a particular time zone to determine date. Renders a `ZonedDateTime` object.
ZoneId.of( "America/Montreal" ) // Better to specify desired/expected zone explicitly than rely implicitly on the JVM’s current default time zone.
) // Returns a `ZonedDateTime` object.
.getMonthValue() // Extract a month number. Returns a `int` number.
java.time
EinzelheitenDie Antwort von Ortomala Lokni für die Verwendung von java.time ist korrekt. Und Sie sollten java.time verwenden, da dies eine gigantische Verbesserung gegenüber den alten Klassen java.util.Date/.Calendar darstellt. Weitere Informationen finden Sie im Oracle- Lernprogramm auf java.time.
Ich werde Code hinzufügen, der zeigt, wie man java.time ohne Rücksicht auf java.util.Date verwendet, wenn Sie mit neuem Code beginnen.
Verwenden von java.time auf den Punkt gebracht… An Instant
ist ein Moment auf der Timeline in UTC. Wenden Sie eine Zeitzone ( ZoneId
) an, um a zu erhalten ZonedDateTime
.
Die Month
Klasse ist eine anspruchsvolle Aufzählung , die einen Monat im Allgemeinen darstellt. Diese Aufzählung enthält praktische Methoden wie das Abrufen eines lokalisierten Namens. Und seien Sie versichert, dass die Monatszahl in java.time eine vernünftige Zahl von 1 bis 12 ist und nicht der auf Null basierende Unsinn (0 bis 11) in java.util.Date/.Calendar.
Um die aktuelle Datums- und Uhrzeitangabe zu erhalten, ist die Zeitzone von entscheidender Bedeutung. Zu jedem Zeitpunkt ist das Datum auf der ganzen Welt nicht dasselbe. Daher ist der Monat weltweit nicht derselbe, wenn er sich dem Ende / Anfang des Monats nähert.
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or 'ZoneOffset.UTC'.
ZonedDateTime now = ZonedDateTime.now( zoneId );
Month month = now.getMonth();
int monthNumber = month.getValue(); // Answer to the Question.
String monthName = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*
Klassen.
Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval
, YearWeek
, YearQuarter
, und mehr .
Wenn Sie die Joda-Zeit nicht nutzen können und immer noch in der dunklen Welt leben :) (Java 5 oder niedriger), können Sie dies genießen:
Hinweis: Stellen Sie sicher, dass Ihr Datum bereits im Format TT / MM / JJJJ erstellt wurde
/**
Make an int Month from a date
*/
public static int getMonthInt(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM");
return Integer.parseInt(dateFormat.format(date));
}
/**
Make an int Year from a date
*/
public static int getYearInt(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
return Integer.parseInt(dateFormat.format(date));
}
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1
Der zurückgegebene Wert beginnt bei 0, daher sollten Sie dem Ergebnis einen hinzufügen.
new Date()
verzichten System.currentTimeMillis
. Das andere ist, dass getMonth veraltet ist.