如何从Java中的日历对象构建日,月,年的列表?

我想为表单构建一个日期窗口小部件,其中包含月,日,年的选择列表。 因为列表根据月份和年份而不同,所以我不能将其编写为31天。 (例如,2月有28天不是30或31,有些年甚至29天)我如何使用日历或joda对象来构建这些列表。

强烈建议您避免使用Java中的内置日期和时间API。

相反,使用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 (eg 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); } } 

Calendar对象将使用getActualMaximum(Calendar.DAY_OF_MONTH)告诉您当前月份的天数。 在这里查看示例。

从那以后,您可以在每次更改时更新列表。

java有许多日期选择器实现,可以通过swing或web ui使用。 我会尝试重用其中一个并避免编写自己的。

以下是创建月份列表的示例:

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

TL;博士

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

java.time

Jon Skeet的回答是正确的,但现在已经过时了。 Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。

LocalDate

java.time中的代码类似于Joda-Time ,具有LocalDate类。 LocalDate类表示没有时间且没有时区的仅日期值。

时区对于确定日期至关重要。 对于任何给定的时刻,日期在全球范围内因地区而异。 例如, 法国巴黎午夜过后几分钟,在魁北克蒙特利尔的 “昨天”仍然是新的一天。

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

您可以询问每个部分,年份编号,月份等。请注意,月份是数字,1月到12月是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.Calendarjava.text.SimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。

许多java.timefunction在ThreeTen- Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应Android (请参阅如何使用… )。

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。