Я хочу создать виджет даты для формы, в которой есть список выбора месяцев, дней, лет. поскольку список отличается в зависимости от месяца и года, я не могу жестко запрограммировать его на 31 день. (например, в феврале 28 дней, а не 30 или 31, а в некоторые годы даже 29 дней) Как я могу использовать календарь или joda для создания этих списков.
Как я могу создать список дней, месяцев, лет из объекта календаря в Java?
Ответы (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);
}
}
Существует несколько реализаций средства выбора даты для Java, которые можно использовать через свинг или веб-интерфейс. Я бы попытался повторно использовать один из них и не писать свой собственный.
Вот пример создания списка месяцев:
String[] months = new DateFormatSymbols().getMonths();
List<String> allMonths = new ArrayList<String>();
for(String singleMonth: months){
allMonths.add(singleMonth);
}
System.out.println(allMonths);
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
a>, YearWeek
, YearQuarter
и подробнее.