Обнаружьте месяцы с 31 днем

Это не открытый исходный код, но свободно (как в пиве): Соглашение Эффектов Sql (иначе Ясность) Выпуск

Сообщества

7
задан Jeff Meatball Yang 9 May 2010 в 05:09
поделиться

13 ответов

Если вы используете C или Java, вы можете сделать это:

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

На некоторых языках можно даже написать case 4,6,9,11: . Другие возможности - создать массив [4,6,9,11], некоторые функциональные языки должны позволять что-то вроде , если месяц в [4,6,9,11] что-то делает;

Как сказал Лиор, это зависит от языка.

РЕДАКТИРОВАТЬ: Кстати, вы также можете сделать это (просто для удовольствия, плохой код, потому что не читается):

if ((abs(month-5) == 1) || (abs(month-10) == 1)) do_something;
12
ответ дан 6 December 2019 в 04:45
поделиться

Практически во всех случаях вам понадобится второй вариант, но на большинстве языков вы можете написать что-то вроде

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
0
ответ дан 6 December 2019 в 04:45
поделиться

Возможно, если вы используете 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
}
0
ответ дан 6 December 2019 в 04:45
поделиться

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

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

if (DaysInMonth [месяц] == 31) ...

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

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

if (false) ...

as there are нет месяцев с БОЛЕЕ , чем 31 день!

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

2
ответ дан 6 December 2019 в 04:45
поделиться

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

Если вы делаете это часто - более чем один раз - я бы рекомендовал написать метод с именем 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));
    }
}
4
ответ дан 6 December 2019 в 04:45
поделиться

Дословным переводом на Java было бы:

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

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

5
ответ дан 6 December 2019 в 04:45
поделиться

В этом месяце

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

вывод:

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.
6
ответ дан 6 December 2019 в 04:45
поделиться

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

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;
}   
7
ответ дан 6 December 2019 в 04:45
поделиться
if( 0x0A50 & (1<<month) != 0 )

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

27
ответ дан 6 December 2019 в 04:45
поделиться

Не выполняйте никаких специальных проверок. Попробуйте преобразовать дату в допустимую - если возникнет исключение, сообщите о недопустимой дате.

2
ответ дан 6 December 2019 в 04:45
поделиться

Для дат я использую 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();
}
1
ответ дан 6 December 2019 в 04:45
поделиться

Ни один вопрос о датах и ​​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());
}

31 января
29 февраля - 29
31 марта
30 апреля
31 мая
30 июня
31 июля
31 августа
30 сентября - 30
31 октября
30 ноября
Декабрь - 31

1
ответ дан 6 December 2019 в 04:45
поделиться

В Icon можно делать

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

Также можно делать

if a < b < c then ...

См. также

0
ответ дан 6 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: