簡體   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