質問

次のコードに類似した形式があります:

if(month == 4,6,9,11)
{
  do something;
}

または次のようにする必要があります:

if(month == 4 || month == 6 etc...)
{
  do something;
}

今月が31日以上かどうかを確認する if ステートメントを記述しようとしています。

編集

本当の問題は、教えられていることのいくつかを理解していることだと思いますが、Javaに関するsunのWebサイトを使用しようとするたびに、混乱してしまいます。私の質問は、ユーザーと月から月を取得し、MM / dd形式に入れて評価する場合、月と日が有効であるかどうかを確認する簡単な方法がありますか?有効であるため、MM / ddを現在の形式で印刷できます。有効でない場合、無効な月または日を示す行を印刷します。

役に立ちましたか?

解決

CまたはJavaを使用している場合、これを行うことができます:

switch (month) {
  case 4:
  case 6:
  case 9:
  case 11:
    do something;
    break;
}

一部の言語では、 case 4,6,9,11:と書くことさえできます。 その他の可能性は、配列[4,6,9,11]を作成することです。一部の関数型言語は、 if in month in [4,6,9,11] in何か;

Liorが言ったように、それは言語に依存します。

編集:ちなみに、これを行うこともできます(読みやすくないため、楽しみのため、悪いコードのためだけに):

if ((abs(month-5) == 1) || (abs(month-10) == 1)) do_something;

他のヒント

if( 0x0A50 & (1<<month) != 0 )

おい、これはばかげている。 (month == 4 || month == 6 || month == 9 || month == 11)はまったく問題ありません。

言語は指定しませんが、Javaを使用している場合は、はい、2番目の方法で実行するか、スイッチを使用します:

switch(month) {
  case 4:
  case 6:
  case 9:
  case 11:
    do something;
}

代わりに、値をハードコーディングせずに他の場所に保持する方が便利でわかりやすい(設計によって異なります):

private static final Collection<Integer> MONTHS_TO_RUN_REPORT = Arrays.asList(4, 6, 9, 11);
....
if (MONTHS_TO_RUN_REPORT.contains(month)) {
  do something;
}   

今月

System.out.println("This month has " + new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH) + " days in it.");

今月が31日かどうかを確認するifステートメント

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");
}

すべての月の日数を書く

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.");
}

出力:

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.

Javaへのむしろ文字通りの翻訳は次のようになります。

if (Arrays.binarySearch(new int[] { 4, 6, 9, 11 }, month) >= 0) {

4、6、9、11で何が特別かわからないOTOH、おそらくJodaTimeは何か役に立つことをします。

Calendarに組み込まれている静的定数(Calendar.JANUARYなど)を使用すると、コードはより自己文書化されると思います

これを頻繁に(複数回)行う場合は、has31Days()またはisReportMonth()という名前のメソッドを作成して、1か所でチェックを行うことをお勧めします。

更新:

重要なことは、31日間の月ではなく、その月のレポートについて何かを伝えるビジネスルールです。

次のように書くかもしれません(31日間で数ヶ月の期間が取れたことを願っています):

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));
    }
}

月に31日以上あるかどうかを確認している場合、最も簡単な記述方法は(Javaの場合):

 public static boolean hasMoreThan31Days(final int month) {
    return false;
   } 

特定のチェックを行わないでください。有効な日付に変換してください。例外がスローされた場合は、無効な日付を報告してください。結局、月が2月である場合は、28日(または29日)を超える日もチェックする必要があります。

Javaを知らないC#:

int [] DaysInMonth = new int [] {31、28、31、30、31、31、31、31、30、31、30、31}

if(DaysInMonth [month] == 31)...

多くの人々が提唱している派手なロジックを忘れてください。この方法はデバッグがはるかに明確で簡単です。

ただし、メッセージで実際に尋ねた質問に答えるには:

if(false)...

31日よりも長い の月はありません!

編集:はい、うるう年については触れませんでした。それは個別に処理する必要があります。質問は、その月に31日があったかどうかでしたが、私のものは DOES と答えました。 boolの配列を使用してそれを行うこともできましたが、配列はとにかくそこにある必要があるので、なぜ長さを入れないのですか?

日付については、前述の Joda Time を使用しますが、適用できない場合は理解しています。 見栄えを良くしたい場合は、まず興味のある値のリストを定義してから、月がそのリストにあるかどうかを確認できます。

// 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();
}

日付とJavaについての質問は、 Joda Time に言及せずに完了します。

for(int i = DateTimeConstants.JANUARY; i <= DateTimeConstants.DECEMBER; i++) {
    LocalDate localDate = new LocalDate().withMonthOfYear(i);
    System.out.println("    " +localDate.toString("MMMM") + " - " + localDate.dayOfMonth().getMaximumValue());
}
  

1月-31
  2月-29
  3月-31
  4月-30
  5月-31
  6月-30
  7月-31日
  8月-31
  9月-30
  10月-31
  11月-30
  12月-31日

指定された月の日数を提供するシンプルなAux関数(C#):

    private int GetDaysInMonth(DateTime date)
    {
        return new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1).Day;
    }

希望する

ほとんどの場合、2番目のオプションを使用する必要がありますが、ほとんどの言語では次のようなものを書くことができます

if [4,6,9,11].map{|day|==month}.inject(false){|all, elem| all|elem}
    do thing

さらに良い

if month in [4,6,9,11]:
    do thing

おそらく、C#を使用している場合、これを行うことができます。

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
}

アイコンでは、次のことができます

if month = (4|6|9|11) then ...

あなたもできる

if a < b < c then ...

参照

思いつくのは私だけです

month_has_31days = month % 2 == month < 8

少なくともCでは、現在Javaをチェックできない

complete年も考慮した完全なソリューション。

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

最新のアプローチでは、面倒な古い日時クラスに取って代わるjava.timeクラスを使用しています。

Month enumは、各月のオブジェクトを定義します。

EnumSet<Month> thirtyOneDayMonths = EnumSet.noneOf( Month.class ) ;
for( Month month : Month.values() ) {
    if( month.maxLength() == 31 ) {
        thirtyOneDayMonths.add( month ) ;
    }
}

現在の月が31日間の月のコレクションに含まれているかどうかを確認します。

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Month currentMonth = Month.from( today ) ;
if( thirtyOneDayMonths.contains( currentMonth ) ) {
    …
}

または問い合わせ今日の日付

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
         .lengthOfMonth()

java.timeについて

java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古いレガシー java.util.Date Calendar 、&amp ; SimpleDateFormat

Joda-Time プロジェクト、現在はメンテナンスモード java.time クラス。

詳細については、 Oracleチュートリアルを参照してください。また、Stack Overflowで多くの例と説明を検索してください。仕様は JSR 310 です。

java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトはjava.timeを拡張します追加のクラス。このプロジェクトは、java.timeに将来追加される可能性のある証明の場です。ここで

来月の最初に移動し、1日を減算します。

Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);
scroll top