Вопрос

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

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

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

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

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

Редактировать

Я думаю, настоящая проблема в том, что я недооцениваю кое-что из того, чему меня учат, но каждый раз, когда я пытаюсь воспользоваться сайтом sun о Java, это просто сбивает меня с толку.Мой вопрос в том, что если я получаю месяц от пользователя и день, и я помещаю его в формат 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) все в полном порядке.

Вы не указываете язык, но если вы используете 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;
}   

В этом месяце

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.

Довольно буквальный перевод на Java был бы следующим:

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

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

Я думаю, что ваш код будет более самодокументируемым, если вы будете использовать статические константы, встроенные в Calendar (например, 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));
    }
}

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

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

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

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

int[] daysInMonth = новый int[] {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

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

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

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

if (ложь) ...

поскольку нет месяцев с Еще более 31 дня!

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

Для фиников я использую Время Джоды упоминалось ранее, но я пойму, если это неприменимо к вам.Если вы просто хотите, чтобы это выглядело красиво, вы можете сначала определить список с интересующими вас значениями, а затем проверить, есть ли ваш месяц в этом списке:

// 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 не был бы полным без упоминания Время Джоды.

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

Простая вспомогательная функция (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
}

В Icon вы можете сделать

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

Вы также можете сделать

if a < b < c then ...

Смотрите также

Неужели я единственный, кто может прийти в голову

month_has_31days = month % 2 == month < 8

по крайней мере, в C, сейчас не могу проверить наличие java

Комплексное решение, также учитывающее високосный год.

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.время

Современный подход использует классы java.time, которые вытесняют старые проблемные классы date-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.время фреймворк встроен в Java 8 и более поздние версии.Эти классы вытесняют старые, вызывающие беспокойство наследие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Тот самый Джода-Время проект, находящийся сейчас в режим технического обслуживания, рекомендует перейти на java.время классы.

Чтобы узнать больше, смотрите Учебное пособие по Oracle.И найдите в Stack Overflow множество примеров и объяснений.Спецификация такова JSR 310.

Где взять классы java.time?

  • Java SE 8, Java SE 9, и позже
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time обратно перенесена на Java 6 и 7 в ThreeTen-Задний порт.
  • Android

Тот самый Три дня-Дополнительно проект расширяет java.time дополнительными классами.Этот проект является испытательным полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как 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