Jak uzyskać miesiąc jako liczbę całkowitą z obiektu Date ( java.util.Date
)?
Jak uzyskać miesiąc jako liczbę całkowitą z obiektu Date ( java.util.Date
)?
Odpowiedzi:
Możesz także użyć pakietu java.time w Javie 8 i przekonwertować java.util.Date
obiekt na java.time.LocalDate
obiekt, a następnie po prostu użyć tej getMonthValue()
metody.
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Zauważ, że wartości miesięcy są tutaj podane od 1 do 12, w przeciwieństwie do cal.get(Calendar.MONTH)
odpowiedzi adarshr, która podaje wartości od 0 do 11.
Ale jak powiedział Basil Bourque w komentarzach, preferowanym sposobem jest uzyskanie Month
obiektu enum za pomocą LocalDate::getMonth
metody.
ZoneId.of( "America/Montreal" )
.
Month
obiekt wyliczenia zamiast zwykłej liczby całkowitej. Month m = localDate.gotMonth();
Zobacz LocalDate::getMonth
metodę. Użycie takich obiektów powoduje, że kod samodokumentuje się, zapewnia bezpieczeństwo typów i gwarantuje prawidłowe wartości. Zobacz samouczek dotyczący Enum firmy Oracle.
date.toInstant()
i pracujesz z java.sql.Date
(dzieckiem java.util.Date
), otrzymasz rozszerzenie UnsupportedOperationException
. Spróbujnew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
przy użyciu nowych metod konwersji dodanych do tej starej klasy. java.sql.Date.valueOf( myLocalDate )
a myJavaSqlDate.toLocalDate()
także zaktualizowane sterowniki JDBC dla JDBC 4.2 lub nowszy nie jest już potrzebna java.sql
rodzajów oraz możliwość bezpośredniego kontaktu z java.time
typów za ResultSet::getObject
i PreparedStatement::setObject
metody.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
bez wyraźnych powodów opiera się na ZERO, tj. Styczeń == 0. Teraz jest to dobrze udokumentowane w API, ale wciąż jest mylące dla początkujących użytkowników. Nie znalazłem jeszcze nikogo, kto mógłby mi powiedzieć, dlaczego poszli na to - może sam czas na nowe pytanie SO (choć obawiam się, że nie ma w tym świetnego tła: /)
getYear()
jest również odejmowane „bez wyraźnych powodów” do roku 1900.
Jeśli korzystasz z api dat Java 8 , możesz je pobrać bezpośrednio w jednej linii!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
Alternatywnie z klasą Joda-Time DateTime
.
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
…lub…
int month = dateTime.getMonthOfYear();
DateTime
obiekt o jego miesiąc. int month = dateTime.getMonthOfYear();
.toString("MM")
ponieważ pokazuje, że możliwości jest więcej niż tylko „MM”.
DateTimeZone
obiekt do tego konstruktora DateTime: 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
DetaleOdpowiedź Ortomala Lokni dotycząca korzystania z java.time jest poprawna. I powinny być korzystając java.time jak to jest gigantyczna poprawa w stosunku do dawnych klas java.util.Date/.Calendar. Zobacz samouczek Oracle w witrynie java.time.
Dodam kod pokazujący, jak używać java.time bez względu na java.util.Date, gdy zaczynasz od nowego kodu.
Korzystanie z java.time w pigułce… Instant
To moment na osi czasu w UTC. Zastosuj strefę czasową ( ZoneId
), aby uzyskać plik ZonedDateTime
.
Month
Klasa to wyrafinowana enum do reprezentowania miesiąc w ogóle. To wyliczenie ma przydatne metody, takie jak uzyskanie zlokalizowanej nazwy. Zapewniamy, że numer miesiąca w java.time to rozsądny numer 1-12, a nie bzdury zaczynające się od zera (0-11), które można znaleźć w java.util.Date/.Calendar.
Aby uzyskać aktualną datę i godzinę, kluczowa jest strefa czasowa . W żadnym momencie data nie jest taka sama na całym świecie. Dlatego miesiąc nie jest taki sam na całym świecie, jeśli zbliża się koniec / początek miesiąca.
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 );
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak java.util.Date
, Calendar
, i SimpleDateFormat
.
Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie ma potrzeby stosowania ciągów ani java.sql.*
klas.
Skąd wziąć klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak Interval
, YearWeek
, YearQuarter
, i więcej .
Jeśli nie możesz wykorzystać czasu Jody, a nadal żyjesz w ciemnym świecie :) (Java 5 lub niższa), możesz cieszyć się tym:
Uwaga: upewnij się, że data jest już wpisana w formacie: dd / MM / RRRR
/**
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
Zwracana wartość zaczyna się od 0, więc do wyniku należy dodać jeden.
new Date()
bez System.currentTimeMillis
. Po drugie, metoda getMonth jest przestarzała.