繁体   English   中英

如何从 Java 中的日历 object 构建天、月、年的列表?

[英]How can I build a list of days, months, years from a calendar object in Java?

我想为一个表单构建一个日期小部件,它有一个 select 月、日、年列表。 由于列表根据月份和年份而有所不同,因此我无法将其硬编码为 31 天。 (例如 2 月有 28 天而不是 30 或 31,有些年份甚至 29 天)我如何使用日历或joda object 为我构建这些列表。

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

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

String[] months = new DateFormatSymbols().getMonths();
    List<String> allMonths = new ArrayList<String>();
    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为 class。 LocalDate class 表示没有时间和时区的仅日期值。

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

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 object。

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

YearMonth

要询问月份的长度,请使用YearMonth class。

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.time 的大部分功能被反向移植到 ThreeTen - Backport 中的Java 6 和 7,并进一步适应Android的使用方法…

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

日历object 将使用getActualMaximum(Calendar.DAY_OF_MONTH)告诉您当前月份的天数。 请参阅此处的示例。

从那里您可以在每次更改时更新您的列表。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM