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

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

Ответы [ 5 ]

3 голосов
/ 21 марта 2009

I настоятельно рекомендуем вам избегать встроенных 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);
    }
}
0 голосов
/ 07 октября 2016

ТЛ; др

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

java.time

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

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 Tutorial . И поиск переполнения стека для многих примеров и объяснений.

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

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

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

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

String[] months = new DateFormatSymbols().getMonths();
    List<String> allMonths = new ArrayList<String>();
    for(String singleMonth: months){
        allMonths.add(singleMonth);
    }
    System.out.println(allMonths);
0 голосов
/ 21 марта 2009

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

0 голосов
/ 21 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...