Skąd wiedzieć, ile dni ma dany miesiąc lub rok?
String date = "2010-01-19";
String[] ymd = date.split("-");
int year = Integer.parseInt(ymd[0]);
int month = Integer.parseInt(ymd[1]);
int day = Integer.parseInt(ymd[2]);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month);
int daysQty = calendar.getDaysNumber(); // Something like this
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .Odpowiedzi:
Java 8 i nowsze
@Warren M. Nocos. Jeśli próbujesz użyć nowego interfejsu API daty i czasu Java 8 , możesz użyć
java.time.YearMonth
klasy. Zobacz samouczek Oracle .Test: spróbuj miesiąca w roku przestępnym:
Java 7 i starsze
Utwórz kalendarz, ustaw rok i miesiąc i używaj
getActualMaximum
Test : spróbuj miesiąca w roku przestępnym:
źródło
Kod dla java.util.Calendar
Jeśli musisz użyć
java.util.Calendar
, podejrzewam, że chcesz:Kod czasu Joda
Osobiście jednak sugerowałbym używanie Joda Time zamiast
java.util.{Calendar, Date}
na początku, w takim przypadku możesz użyć:Zauważ, że zamiast analizować wartości ciągów pojedynczo, lepiej byłoby uzyskać dowolny interfejs API daty / czasu, którego używasz do analizowania. W
java.util.*
możesz użyćSimpleDateFormat
; w Joda Time użyłbyśDateTimeFormatter
.źródło
Możesz użyć
Calendar.getActualMaximum
metody:źródło
java.time.LocalDate
W Javie 1.8 możesz użyć tej metody
lengthOfMonth
najava.time.LocalDate
:źródło
źródło
To jest matematyczny sposób:
Rok, miesiąc (od 1 do 12):
źródło
Poszedłbym na takie rozwiązanie:
Jeśli miesiąc nie jest lutym (92% przypadków), zależy to tylko od miesiąca i skuteczniej jest nie włączać roku. W ten sposób nie musisz wywoływać logiki, aby wiedzieć, czy jest to rok przestępny i nie musisz podawać roku w 92% przypadków. I nadal jest to czysty i bardzo czytelny kod.
źródło
W Javie8 możesz użyć get ValueRange z pola daty.
Pozwala to na parametryzację na polu.
źródło
To proste, nie trzeba niczego importować
źródło
źródło
android.util.MonthDisplayHelper
)źródło
źródło
Calendar
Należy unikać stosowania przestarzałego interfejsu API.W Java8 lub nowszej wersji można to zrobić za pomocą
YearMonth
.Przykładowy kod:
źródło
Call requires API level 26 (current min is 21): java.time.YearMonth#lengthOfMonth
Uprośćmy to, jeśli nie chcesz zakodować na stałe wartości roku i miesiąca, a chcesz pobrać wartość z bieżącej daty i godziny:
źródło
Możesz użyć metody Calendar.getActualMaximum:
Miesiąc-1 to Ponieważ miesiąc przyjmuje pierwotną liczbę miesięcy, podczas gdy metoda w metodzie przyjmuje argument, jak poniżej w Calendar.class
A (pole int) jest takie jak poniżej.
źródło
Poniższa metoda poda liczbę dni w danym miesiącu
źródło
Optymalna i wydajna wariancja:
Aby uzyskać więcej informacji na temat algorytmu skoku, sprawdź tutaj
źródło
źródło
To działało dobrze dla mnie.
To jest przykładowe wyjście
źródło
źródło