Erkennen Monate mit 31 Tagen
-
05-07-2019 - |
Frage
Ist es eine analoge form der folgende code:
if(month == 4,6,9,11)
{
do something;
}
Oder muss es sein:
if(month == 4 || month == 6 etc...)
{
do something;
}
Ich bin versucht zu schreiben, eine if
- Anweisung, die prüft, ob in diesem Monat hat mehr als 31 Tage.
BEARBEITEN
Ich denke, das eigentliche problem ist, dass ich undersand einige von dem, was ich bin belehrt, aber jedes mal, wenn ich versuche, Sie zu verwenden der sun-website über java es verwirrt mich nur.Meine Frage ist, wenn ich einen Monat in einem Benutzer-und ein Tag, und ich steckte es in eine MM/dd-format und bewerten Sie es dann, gibt es einen einfacheren Weg, um zu überprüfen, ob Sie den Monat und den Tag gültig ist und nachdem ich überprüfen es für gültig, kann ich entweder drucken Sie die MM/TT das format, das ich habe.Wenn es ist nicht gültig Drucken, eine Linie, die sagt Ungültige Monat oder Tag.
Lösung
Wenn Sie C oder Java verwenden, können Sie dies tun:
switch (month) {
case 4:
case 6:
case 9:
case 11:
do something;
break;
}
In einigen Sprachen, könnten Sie sogar case 4,6,9,11:
schreiben.
Andere Möglichkeiten wären ein Array erstellen [4,6,9,11], einige funktionale Sprachen sollte so etwas wie if month in [4,6,9,11] do something;
erlauben
Wie Lior sagte, hängt es von der Sprache.
EDIT: Übrigens, können Sie auch tun, um diese (nur zum Spaß, schlechten Code, weil nicht lesbar):
if ((abs(month-5) == 1) || (abs(month-10) == 1)) do_something;
Andere Tipps
if( 0x0A50 & (1<<month) != 0 )
Geck, das ist lächerlich. (month==4||month==6||month==9||month==11)
ist völlig in Ordnung.
Sie geben die Sprache nicht, aber wenn Sie Java verwenden dann ja, Sie haben es nicht tun, um die zweite Art und Weise oder auf andere Weise Schalter verwenden:
switch(month) {
case 4:
case 6:
case 9:
case 11:
do something;
}
Alternativ können Sie es nützlich und Reiniger (je nach Ausführung) nicht hart Code die Werte finden, aber halten sie an anderer Stelle:
private static final Collection<Integer> MONTHS_TO_RUN_REPORT = Arrays.asList(4, 6, 9, 11);
....
if (MONTHS_TO_RUN_REPORT.contains(month)) {
do something;
}
In diesem Monat
System.out.println("This month has " + new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH) + " days in it.");
if-Anweisung zu prüfen, ob 31 Tage dort in diesem Monat ist
if (31 == new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH))
{
System.out.println("31 days on this month");
}
else
{
System.out.println("Not 31 days in this month");
}
Write Anzahl der Tage, für alle Monate
Calendar cal = new GregorianCalendar();
for (int i = 0; i < 12; i++)
{
cal.set(2009, i, 1); //note that the month in Calendar goes from 0-11
int humanMonthNumber = i + 1;
int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("The " + humanMonthNumber + ". month has " + max + " days.");
}
Ausgabe:
This month has 30 days in it.
Not 31 days in this month
The 1. month has 31 days.
The 2. month has 28 days.
The 3. month has 31 days.
The 4. month has 30 days.
The 5. month has 31 days.
The 6. month has 30 days.
The 7. month has 31 days.
The 8. month has 31 days.
The 9. month has 30 days.
The 10. month has 31 days.
The 11. month has 30 days.
The 12. month has 31 days.
Eine eher wörtliche Übersetzung in Java wäre:
if (Arrays.binarySearch(new int[] { 4, 6, 9, 11 }, month) >= 0) {
Ich weiß nicht, was so besonders ist, etwa 4, 6, 9 und 11. Sie sind wahrscheinlich besser dran, eine ENUM verwenden, zusammen mit EnumSet
oder vielleicht einer Methode auf dem ENUM. OTOH, vielleicht tut JodaTime etwas Nützliches.
Ich denke, Ihr Code selbsterklärend sein, wenn Sie die statischen Konstanten in Kalender gebaut verwenden (zum Beispiel Calendar.JANUARY usw.)
Wenn Sie dies oft tun - mehr als einmal -. Ich würde empfehlen, eine Methode namens has31Days () oder isReportMonth () schreibt den Scheck an einem Ort zu tun
UPDATE:
Das Wichtigste ist, nicht die Monate mit 31 Tagen - es ist die Geschäftsregel, dass Sie etwas über Berichte für diese Monate erzählt
.Ich könnte es so schreiben (ich hoffe, mit 31 Tagen die Monate bekam rechts):
public class ReportEngine
{
public boolean isReportRequired(int month)
{
if ((month < Calendar.JANUARY) || (month > Calendar.DECEMBER))
throw new IllegalArgumentException("Invalid month: " + month);
// Reports are required for months with 31 days.
return ((month == Calendar.JANUARY) ||
(month == Calendar.MARCH) ||
(month == Calendar.MAY) ||
(month == Calendar.JULY) ||
(month == Calendar.AUGUST) ||
(month == Calendar.OCTOBER) ||
(month == Calendar.DECEMBER));
}
}
Wenn Sie die Überprüfung, ob ein Monat mehr als 31 Tage hat, ist der einfachste Weg, es zu schreiben wäre (in Java):
public static boolean hasMoreThan31Days(final int month) {
return false;
}
Stellen Sie keine spezifischen Kontrollen nicht. Versuchen Sie, und auf ein gültiges Datum konvertieren - wenn es eine Ausnahme auslöst, ungültiges Datum melden. Schließlich müssen Sie auch für Tag überprüfen mehr als 28 (oder ist es 29?), Wenn der Monat Februar.
C# wie ich weiß nicht, von Java:
int[] DaysInMonth = new int[] {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
if (DaysInMonth[month] == 31) ...
Vergessen Sie die Phantasie der Logik, dass viele Menschen befürworten-dieser Weg ist viel klarer und einfacher zu Debuggen.
Jedoch, die Frage zu beantworten, die Sie fragte in Ihrer Nachricht:
if (false) ...
da es keine Monate mit MEHR als 31 Tagen!
Edit:Ja, ich habe nicht Adresse ein Schaltjahr.Das muss GESONDERT behandelt werden.Die Frage war, ob der Monat 31 Tage hat, obwohl-etwas, das mir TUT Antwort.Hätte ich es mit einem array von bools, aber da das array werden muss es eh, warum nicht, legen Sie die Längen, in?
Für Daten, die ich benutzen Joda Zeit bereits erwähnt , aber ich verstehe, wenn es für Sie nicht anwendbar ist . Wenn Sie nur es schön aussehen wollen, können Sie zunächst eine Liste mit Werten definieren, die Sie daran interessiert sind, und dann überprüfen, ob Ihr Monat in dieser Liste ist:
// This should be a field in a class
// Make it immutable
public static final List<Integer> LONGEST_MONTHS =
Collections.immutableList(Arrays.asList(4,6,9,11));
// Somewhere in your code
if(LONGEST_MONTHS.contains(month)) {
doSomething();
}
Keine Frage über Termine und Java wäre komplett ohne erwähnen, Joda Zeit .
for(int i = DateTimeConstants.JANUARY; i <= DateTimeConstants.DECEMBER; i++) {
LocalDate localDate = new LocalDate().withMonthOfYear(i);
System.out.println(" " +localDate.toString("MMMM") + " - " + localDate.dayOfMonth().getMaximumValue());
}
Januar - 31.
Februar - 29
März - 31
April - 30
Mai - 31
Juni - 30
Juli - 31.
August - 31
September - 30
- 31. Oktober
November - 30
Dezember - 31
Simpe Aux-Funktion (C #), die die Anzahl der Tage eines Monats gibt:
private int GetDaysInMonth(DateTime date)
{
return new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1).Day;
}
Hoffe, es hilft
Für so ziemlich jede Sie die zweite Option verwenden müssen, aber in den meisten Sprachen können Sie etwas Ähnliches wie
schreibenif [4,6,9,11].map{|day|==month}.inject(false){|all, elem| all|elem}
do thing
oder noch besser
if month in [4,6,9,11]:
do thing
Vielleicht, wenn Sie C # verwenden Sie können dies tun:
public static class Extensions
{
public static bool IsIn(this Int32 intVal, params Int32[] vals)
{
return vals.Any(i => i == intVal)
}
}
int month = 4;
if (month.IsIn(4,6,9,11)) {
//do something
}
In Symbol, können Sie
if month = (4|6|9|11) then ...
Sie können auch tun
if a < b < c then ...
Siehe auch
Bin ich die einzige, mit kommen
month_has_31days = month % 2 == month < 8
zumindest in C, kann jetzt nicht für Java überprüfen
Eine komplette Lösung, auch Schaltjahr berücksichtigt werden.
private static int getDaysInMonth(LocalDateTime localDateTime) {
int daysInMonth = 0;
int year = localDateTime.getYear();
int month = localDateTime.getMonth().getValue();
switch (month) {
case 1: case 3: case 5:
case 7: case 8: case 10:
case 12:
daysInMonth = 31;
break;
case 4: case 6:
case 9:case 11:
daysInMonth = 30;
break;
case 2:
if(((year % 4 == 0) && !(year % 100 == 0) || (year % 400 == 0))) {
daysInMonth = 29;
} else {
daysInMonth = 28;
}
break;
default: System.out.println("Invalid month");
break;
}
return daysInMonth;
}
tl; dr
EnumSet.of( Month.JANUARY , Month.MARCH , Month.MAY , Month.JULY , Month.AUGUST , Month.OCTOBER , Month.DECEMBER )
.contains( Month.from( LocalDate.now() ) )
java.time
Der moderne Ansatz verwendet die java.time Klassen, die die lästigen alten Datum Zeitklassen ersetzen.
Die Month
Enum definiert ein Objekt für jeden Monat des Jahres.
EnumSet<Month> thirtyOneDayMonths = EnumSet.noneOf( Month.class ) ;
for( Month month : Month.values() ) {
if( month.maxLength() == 31 ) {
thirtyOneDayMonths.add( month ) ;
}
}
Sehen Sie, wenn der aktuelle Monat in dieser Sammlung von Monaten mit 31 Tagen.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Month currentMonth = Month.from( today ) ;
if( thirtyOneDayMonths.contains( currentMonth ) ) {
…
}
Oder Sie könnten nur verhören das heutige Datum .
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
.lengthOfMonth()
Über java.time
Die java.time Rahmen in Java 8 und später gebaut. Diese Klassen verdrängen die störenden alten Vermächtnis Datum Zeitklassen rel="nofollow wie java.util.Date
, Calendar
& SimpleDateFormat
.
Das Joda-Time Projekt nun in Wartungsmodus , rät Migration auf die java.time Klassen.
Um mehr zu erfahren, finden Sie in der Oracle Tutorial . Und Stack-Überlauf suchen viele Beispiele und Erklärungen. Spezifikation JSR 310 .
Wo die java.time Klassen erhalten?
- Java SE 8 , Java SE 9 und später
- Built-in.
- Ein Teil des Standard-Java-API mit einer gebündelten Implementierung.
- Java 9 fügt einige kleinere Features und Korrekturen.
- Java SE 6 und Java SE 7
- Ein großer Teil der java.time Funktionalität zurückportiert zu Java 6 & 7 in ThreeTen-Backport .
- Android
- Die ThreeTenABP Projekt passt < em> ThreeTen-Backport (siehe oben) für Android speziell.
- Siehe So verwenden ThreeTenABP ... .
Das ThreeTen-Extra Projekt erstreckt java.time mit zusätzlichen Klassen. Dieses Projekt ist eine Bewährungsprobe für eine mögliche zukünftige Ergänzungen java.time. Sie können einige nützliche Klassen hier wie Interval
, YearWeek
, YearQuarter
und mehr .
Zum ersten des nächsten Monat und einen Tag subtrahiert.
Calendar cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);