Как я могу создать список дней, месяцев, лет из объекта календаря в Java?

Я хочу создать виджет даты для формы, в которой есть список выбора месяцев, дней, лет. поскольку список отличается в зависимости от месяца и года, я не могу жестко запрограммировать его на 31 день. (например, в феврале 28 дней, а не 30 или 31, а в некоторые годы даже 29 дней) Как я могу использовать календарь или joda для создания этих списков.


person giladbu    schedule 20.03.2009    source источник


Ответы (5)


Я настоятельно рекомендую вам избегать встроенных API даты и времени в Java.

Вместо этого используйте Joda Time. Эта библиотека похожа на ту, которая (надеюсь!) войдет в Java 7, и пользоваться ею гораздо приятнее, чем встроенным API.

Теперь основная проблема заключается в том, что вы хотите узнать количество дней в конкретном месяце?

РЕДАКТИРОВАТЬ: Вот код (с образцом):

import org.joda.time.*;
import org.joda.time.chrono.*;

public class Test   
{
    public static void main(String[] args)
    {        
        System.out.println(getDaysInMonth(2009, 2));
    }

    public static int getDaysInMonth(int year, int month)
    {
        // If you want to use a different calendar system (e.g. Coptic)
        // this is the code to change.
        Chronology chrono = ISOChronology.getInstance();
        DateTimeField dayField = chrono.dayOfMonth();        
        LocalDate monthDate = new LocalDate(year, month, 1);
        return dayField.getMaximumValue(monthDate);
    }
}
person Jon Skeet    schedule 20.03.2009
comment
Это актуально? т.е. поможет ли это ему создать виджет даты? - person Michael Myers; 21.03.2009
comment
@mmyers: Абсолютно. Как только мы полностью определим, что он пытается сделать, если он сделает все это с помощью Joda Time, я полагаю, в конечном итоге это будет намного проще. - person Jon Skeet; 21.03.2009
comment
@Джон. Действительно очень хороший комментарий. Не уверен в этом как в ответе - person OscarRyz; 21.03.2009
comment
Это станет правильным ответом, когда я найду способ получить соответствующую информацию от Joda Time. Я уверен, что это где-то здесь :) - person Jon Skeet; 21.03.2009
comment
joda-time, стандартный ответ на все вопросы о дате/времени в Java. На самом деле, Джон, вы могли бы добавить простой if(currentQ.tags.contains(java) && currentQ.tags.contains(calendar)) { addWikiAnswer(Use joda-time); БлокировкаВопрос(текущийQ); } в код SO... - person Esko; 21.03.2009
comment
@Эско: Ага. Это, безусловно, должно быть частью ответа на все вопросы, связанные с использованием встроенного API, если только в нем конкретно не указано, почему Joda Time не подходит. Чем больше я работаю с датой/временем, тем страшнее становится вся тема — и тем больше я благодарю Joda Time. - person Jon Skeet; 21.03.2009

Объект Calendar сообщит вам количество дней в текущем месяце с помощью getActualMaximum(Calendar.DAY_OF_MONTH). См. пример здесь.

Из этого вы можете обновлять свои списки при каждом изменении.

person Michael Brewer-Davis    schedule 20.03.2009

Существует несколько реализаций средства выбора даты для Java, которые можно использовать через свинг или веб-интерфейс. Я бы попытался повторно использовать один из них и не писать свой собственный.

person emeraldjava    schedule 21.03.2009

Вот пример создания списка месяцев:

String[] months = new DateFormatSymbols().getMonths();
    List<String> allMonths = new ArrayList<String>();
    for(String singleMonth: months){
        allMonths.add(singleMonth);
    }
    System.out.println(allMonths);
person apajak    schedule 06.10.2016

tl;dr

int lengthOfMonth = 
    YearMonth.from( 
                      LocalDate.now( ZoneId.of( "America/Montreal" ) ) 
                  )
             .lengthOfMonth() ;

Java.время

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

LocalDate

Код в java.time аналогичен коду Joda-Time с классом LocalDate. . Класс LocalDate представляет значение без времени суток и без часового пояса.

Часовой пояс имеет решающее значение при определении даты. В любой момент дата варьируется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париже, Франция наступает новый день, хотя " вчера» в Монреаль, Квебек.

ZoneId z = ZoneId.of( “America/Montreal” );
LocalDate today = LocalDate.now( z );

Вы можете запросить каждую часть, номер года, месяц и т. д. Обратите внимание, что месяцы нумеруются нормально, 1-12 для января-декабря (в отличие от устаревших классов).

int year = today.getYear();
int monthNumber = today.getMonthValue(); // 1-12 for January-December.
int dayOfMonth = today.getDayOfMonth();

Вы можете собрать объект LocalDate из этих частей.

LocalDate ld = LocalDate.of( year , monthNumber , dayOfMonth );

YearMonth

Чтобы запросить продолжительность месяца используйте YearMonth сорт.

YearMonth ym = YearMonth.from( ld );
int lengthOfMonth = ym.lengthOfMonth();

О java.time

Платформа java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые классы даты и времени, такие как java.util.Date, .Calendar, & java.text.SimpleDateFormat.

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

Чтобы узнать больше, см. учебник по Oracle. И поищите множество примеров и пояснений в Stack Overflow.

Большая часть функций java.time обратно портирована на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптировано для Android в ThreeTenABP (см. Как использовать… ).

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

person Basil Bourque    schedule 06.10.2016