Определить месяцы с 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 ]

1 голос
/ 28 ноября 2009

Для дат я использую 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 голос
/ 27 ноября 2009

Нет вопросов о датах и ​​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
Март - 31
Апрель - 30
Май - 31
Июнь - 30
Июль - 31
Август - 31
Сентябрь - 30
Октябрь - 31
Ноябрь - 30
Декабрь - 31

0 голосов
/ 21 июня 2017

ТЛ; др

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 определяет объект для каждого месяца года.

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 и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

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

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

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 15 октября 2016

Полное решение с учетом високосного года.

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;
}
0 голосов
/ 26 июня 2014

Перейти к первому числу следующего месяца и вычесть день.

Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);
0 голосов
/ 04 октября 2012

Я единственный, кто придумал

month_has_31days = month % 2 == month < 8

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

0 голосов
/ 09 мая 2010

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

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

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

if a < b < c then ...

Смотри также

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

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

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

Возможно, если вы используете 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...