Определить месяцы с 31 днями - PullRequest
7 голосов
/ 27 ноября 2009

Есть ли аналогичная форма следующего кода:

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

Или это должно быть:

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

Я пытаюсь написать заявление if, которое проверяет, есть ли в этом месяце более 31 дня.

EDIT

Полагаю, настоящая проблема в том, что я плохо понимаю и кое-что из того, чему меня учили, но каждый раз, когда я пытаюсь использовать солнечный сайт о Java, это просто смущает меня. Мой вопрос: если я получу месяц от пользователя и день и переведу его в формат MM / dd и оценим его, то есть ли более простой способ проверить, действительны ли месяц и день, и после того, как я проверил его будучи действительным, я могу распечатать MM / dd в том формате, который у меня есть. Если оно недопустимо, выведите строку с недопустимым месяцем или днем.

Ответы [ 19 ]

27 голосов
/ 27 ноября 2009
if( 0x0A50 & (1<<month) != 0 )

чувак, это смешно. (month==4||month==6||month==9||month==11) совершенно нормально.

12 голосов
/ 27 ноября 2009

Если вы используете 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;
7 голосов
/ 27 ноября 2009

Вы не указываете язык, но если вы используете Java, тогда да, вы должны сделать это вторым способом или иначе использовать switch:

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;
}   
6 голосов
/ 27 ноября 2009

В этом месяце

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

if заявление, чтобы проверить, есть ли в этом месяце 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.");
}

выход: * +1010 *

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.
5 голосов
/ 27 ноября 2009

Довольно буквальный перевод на Java будет:

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

Я не знаю, что такого особенного в 4, 6, 9 и 11. Вам, вероятно, лучше использовать enum вместе с EnumSet или, возможно, метод enum. OTOH, возможно, JodaTime делает что-то полезное.

4 голосов
/ 27 ноября 2009

Я думаю, что ваш код будет более самодокументированным, если вы будете использовать статические константы, встроенные в Calendar (например, Calendar.JANUARY и т. Д.)

Если вы делаете это часто - более одного раза - я бы рекомендовал написать метод с именами has31Days () или isReportMonth () для проверки в одном месте.

UPDATE:

Важно не то, чтобы месяцы имели 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));
    }
}
3 голосов
/ 21 июля 2011

Если вы проверяете, есть ли в месяце больше 31 дня, самый простой способ написать это (на Java):

 public static boolean hasMoreThan31Days(final int month) {
    return false;
   } 
2 голосов
/ 27 ноября 2009

C #, поскольку я не знаю Java:

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

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

Забудьте причудливую логику, которую защищают многие люди - этот путь намного яснее и проще для отладки.

Однако, чтобы ответить на вопрос, который вы фактически задали в своем сообщении:

if (false) ...

, поскольку нет месяцев с БОЛЬШЕ , чем 31 день!

Редактировать: Да, я не обращался к високосному году. Это должно быть обработано отдельно. Вопрос состоял в том, имел ли месяц 31 день, хотя - что-то мое DOES ответ. Я мог бы сделать это с помощью массива bools, но так как массив должен быть там в любом случае, почему бы не указать длину?

2 голосов
/ 27 ноября 2009

Не делайте никаких конкретных проверок. Попробуйте преобразовать в допустимую дату - если выдается исключение, сообщите неверную дату. В конце концов, вам также нужно проверить день больше 28 (или 29?), Если месяц февраль.

1 голос
/ 06 января 2011

Функция Simpe Aux (C #), которая дает вам количество дней данного месяца:

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...