سؤال

هل هناك مماثلة شكل التعليمة البرمجية التالية:

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

أم إنه يجب أن تكون:

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

أنا أحاول أن أكتب if بيان أن يتحقق إذا كان هذا الشهر أكثر من 31 يوما.

تحرير

أعتقد أن المشكلة الحقيقية هي إنني أفهم بعض ما أنا تدريسها ولكن في كل مرة كنت في محاولة لاستخدام الشمس موقع عن جافا فقط يحيرني.سؤالي هو إذا كنت تحصل على شهر من المستخدم و اليوم و وضعه في 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 month in [4,6,9,11] do something;

كما ليئور قال: ذلك يعتمد على اللغة.

تحرير:بالمناسبة, هل يمكن أيضا القيام بذلك (للمتعة فقط ، سيء لأنه غير قابل للقراءة):

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

نصائح أخرى

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

يا صاح, هذا أمر مثير للسخرية. (month==4||month==6||month==9||month==11) على ما يرام تماما.

لا يمكنك تحديد اللغة, ولكن إذا كنت تستخدم جافا ثم نعم, عليك القيام بذلك الطريقة الثانية ، أو استخدام التبديل:

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 (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.

بدلا من الترجمة الحرفية إلى جافا ليكون:

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

أنا لا أعرف ما هو خاص جدا حول 4 و 6 و 9 و 11.ربما كنت أفضل حالا باستخدام enum ، جنبا إلى جنب مع EnumSet أو ربما الأسلوب على التعداد.OTOH ربما JodaTime يفعل شيئا مفيدا.

أعتقد أن الكود الخاص بك سوف يكون أكثر الذاتي وتوثيق إذا كنت تستخدم الثوابت ثابتة بنيت في التقويم (مثل التقويم.كانون الثاني / يناير ، إلخ.)

إذا كنت تفعل هذا في كثير من الأحيان - أكثر من مرة - أنصح الكتابة وسيلة اسمه has31Days() أو isReportMonth() للقيام الاختيار في مكان واحد.

تحديث:

الشيء المهم ليس هو أشهر من أن يكون 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;
   } 

لا تفعل أي اختبارات خاصة.محاولة تحويل إلى تاريخ صالح - إذا كان يطرح استثناء ، التقرير صالحة الآن.بعد كل شيء تحتاج أيضا إلى التحقق من يوم أكثر من 28 (أو هو 29?) إذا كان شهر شباط / فبراير.

C# كما أنا لا أعرف جافا:

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

إذا (DaysInMonth[شهر] == 31) ...

تنسى الهوى المنطق أن الكثير من الناس يدافعون--هذه الطريقة هي أكثر وضوحا و أسهل التصحيح.

ولكن للإجابة على السؤال هل فعلا طلبت في رسالتك:

إذا (كاذبة) ...

كما لا توجد أشهر مع المزيد من 31 يوما!

تحرير:نعم ، لم تعالج سنة كبيسة.التي لابد من التعامل معها بشكل منفصل.السؤال هو ما إذا كان الشهر 31 يوما ، على الرغم شيء لي لا الجواب.أنا قد فعلت ذلك مع مجموعة من bools ولكن منذ مجموعة يحتاج إلى هناك على أي حال لماذا لا تضع أطوال ؟

التواريخ يمكنني استخدام Joda الوقت ذكر في وقت سابق, ولكن أنا أفهم إذا كان لا ينطبق بالنسبة لك.إذا كنت فقط تريد أن تبدو لطيفة ، يمكنك أولا تحديد قائمة مع القيم التي كنت مهتما ثم تحقق إذا كان الشهر في تلك القائمة:

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

لا شك في التواريخ جافا لن يكون كاملا من دون الإشارة Joda الوقت.

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

كانون الثاني / يناير - 31
شباط / فبراير - 29
آذار / مارس - 31
نيسان / أبريل - 30
أيار / مايو - 31
حزيران / يونيو - 30
تموز / يوليو - 31
آب / أغسطس - 31
أيلول / سبتمبر - 30
تشرين الأول / أكتوبر - 31
تشرين الثاني / نوفمبر - 30
كانون الأول / ديسمبر - 31

Simpe Aux وظيفة (C#) أن يعطيك عدد أيام شهر معين:

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

آمل أن يساعد

الى حد كبير أي سوف تحتاج إلى استخدام الخيار الثاني ، ولكن في معظم اللغات يمكنك كتابة شيء مشابه

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 ، لا يمكن أن تحقق جافا الآن

الحل الكامل أيضا اتخاذ قفزة العام بعين الاعتبار.

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.الوقت

النهج الحديث يستخدم جافا.الوقت الفئات التي تحل محل مزعجة القديم التاريخ-الوقت الطبقات.

على Month التعداد يعرف كائن لكل شهر من شهور السنة.

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.الوقت إطار بنيت في جاوة 8 وما بعدها.هذه الفئات محل مزعجة القديمة تراث التاريخ الوقت الطبقات مثل java.util.Date, Calendar, & SimpleDateFormat.

على Joda الوقت المشروع الآن في وضع الصيانة, تنصح الهجرة إلى java.الوقت فصول.

لمعرفة المزيد ، راجع أوراكل التعليمي.والبحث تجاوز سعة مكدس على العديد من الأمثلة و الشروح.مواصفات JSR 310.

أين يمكن الحصول على جافا.الوقت الطبقات ؟

على ThreeTen إضافية المشروع يمتد جافا.الوقت مع فصول إضافية.هذا المشروع هو إثبات أن من الممكن في المستقبل الإضافات جافا.الوقت.قد تجد بعض المعلومات المفيدة في هذه الطبقات هنا مثل Interval, YearWeek, YearQuarter, ، المزيد.

الانتقال إلى الأول من الشهر المقبل وطرح يوميا.

Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top