2015-12-21 3 views
0

У меня есть два раскрывающегося списка, один указывает месяц, а другой указывает дни.Целесообразный алгоритм для перечисления дней месяцев как выпадающего списка в java

Мой месяц выпадающий список выглядит следующим образом,

public Map<Integer, String> month(){ 

    final Map<Integer, String> month = new LinkedHashMap<Integer, String>(); 
    month.put(4,"April"); 
    month.put(5,"May"); 
    month.put(6,"June"); 
    month.put(7,"July"); 
    month.put(8,"August"); 
    month.put(9, "September"); 
    month.put(10,"October"); 
    month.put(11,"November"); 
    month.put(12,"December"); 
    month.put(1, "January"); 
    month.put(2,"February"); 
    month.put(3, "March"); 

return monthmap; 
} 

в течение нескольких дней карта, как

public Map<Integer, Integer> dayOfMonth(){ 

      Map<Integer, Integer> day = new LinkedHashMap<Integer, Integer>(); 
//In this section feasible algorithm required. 
      for(int i=1;i<32;i++) 
      { 
       day.put(i,i); 
      } 

      return day; 
     } 

На основе этого алгоритма я получил за каждый месяц с 31 days.but мне нужно только правильно дней для соответствующих месяцев. Например: «june нужно всего 30 дней, в этом случае у него 31 день». Так что мне нужно, чтобы на основе карты месяца все соответствующие дни были вставлены в дневную карту.

Например [(4,(1 to 30)),(5,(1 to 31) и так далее ДО марша] .`

Я использую ядро ​​Java для этих раздела code.For щий часть JQuery и Javascript является used.Spring MVC является технологией used.I борется за весь день, чтобы получить fesiable solution.Any помощь будет весьма заметным .....

+0

Почему вы не подсчитываете #days в месяце? – AsfK

+0

, основанный на моем требовании, мне просто нужно добавить в день (мой список) как пару значений ключа, как указано в цикле for. – Miller

ответ

-1

См Календарь # getActualMaximum: https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#getActualMaximum(int)

Это позволит вам найти, сколько дней в каждом месяце.

public static void main(String[] args) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.DAY_OF_MONTH, 1); 
    calendar.set(Calendar.MONTH, Calendar.FEBRUARY); 
    calendar.set(Calendar.YEAR, 2100); 

    System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); // 28, not 29 
} 

@Arun nagar Ваш код поврежден и не работает, например. в год 2100 (делящийся на 4, но не високосный год). Я не могу downvote, потому что не хватает репутации, но я бы

+0

hi @spi, я бы порекомендовал вам предоставить некоторый пример кода со ссылками, это поможет OP, и вы получите лучшую обратную связь от других пользователей. –

+0

Ok в следующий раз – spi

2

Вы также должны заботиться о високосных и других ... Так создать Calendar, установите year и month и использовать getActualMaximum, чтобы не нужно заново изобрести тень.

int iYear = 2016; 
int iMonth = Calendar.FEBRUARY; 
int iDay = 1; 

// Calendar object and set year and month 
Calendar cal = new GregorianCalendar(iYear, iMonth, iDay); 

// Number of days in that month 
int daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 29 !!! 

ADD ONS:

  • После этого, просто использовать daysInMonth + 1 в Вашем for-loop.

    for(int i=1; i < daysInMonth + 1; i++) 
    
  • Конечно, лучше создать функцию для инкапсуляции и заменить 2 линии

    private int getNumberOfDays(int month, int year) { 
        Calendar cal = new GregorianCalendar(year, month, 1); 
        return cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 29 !!! 
    } 
    

    И называют это нравится: getNumberOfDays(Calendar.FEBRUARY, 2016);.

+0

На самом деле у меня есть два dropdownlists, один для указания месяца и другой на день. Мой выпадающий список будет таким же на протяжении многих лет. Не нужно менять его на следующий год и так далее. На самом деле он должен представлять сезон для школы. – Miller

+0

В 2016 году в феврале будет 29 дней, вы ** ДОЛЖНЫ ** представлять это в своем приложении, если хотите получить минимальное качество ... И как вы можете видеть, метод получения дней - это 2 строки кода, намного лучше чем карта с 12 фиксированными значениями за каждый месяц .... разве вы не думаете? –

+0

okay.let me try и дам вам знать – Miller

1

java.time

В Java 8, а затем, с помощью java.time рамки. Monthenum знает количество дней в каждом месяце.

int daysInApril = Month.APRIL.maxLength(); 
int currentMonthLength = LocalDate.now().getMonth().maxLength(); 

Если вам нужно дней за текущий год, получить экземпляр даты с LocalDate.now и использовать их простые plusMonths и minusMonths методы, пока не соберут все месяцы за год. Затем просто получайте дни за те месяцы, используя тот же API.

+1

Возможно, вы захотите опустить 29 февраля в течение [Високосных лет] (https://en.wikipedia.org/wiki /Високосный год). Задайте класс ['Year'] (http://docs.oracle.com/javase/8/docs/api/java/time/Year.html), если конкретный год является високосным годом или нет. 'Year.of (2015) .isLeap()' ... или ... 'Year.from (myLocalDate) .isLeap()' –