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.

War es hilfreich?

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

schreiben
if [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?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top