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

时间:2009-03-20 21:31:42

标签: java forms date calendar

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

5 个答案:

答案 0 :(得分:3)

强烈建议您避免使用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 (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);
    }
}

答案 1 :(得分:0)

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

由此您可以在每次更改时更新您的列表。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

TL;博士

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

java.time

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

LocalDate

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

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

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

要求length of the month,请使用YearMonth课程。

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

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

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