簡體   English   中英

如何在Android中獲取兩個日期(開始和結束)之間的特定日期列表?

[英]How to get a list of specific dates between two dates(start and end) in Android?

我需要在我的應用中顯示開始日期和結束日期之間的日期列表。 我有一個復選框列表,旁邊有星期幾,即; 星期一至星期日和兩個日期選擇器,可幫助用戶選擇開始日期和結束日期。 如果用戶未選中任何包含星期幾的復選框,則需要顯示所有日期以及開始日期和結束日期之間的星期幾。 如果用戶選中某些復選框,即; 星期一,星期三,星期五,我只需要顯示開始日期和結束日期之間的日期和星期幾。 您能否告訴我是否有什么方法可以實現? 謝謝。

這可以為您提供兩個日期之間的日期列表

    List<Calendar> datelist = new ArrayList<Calendar>();

    Calendar cStart = Calendar.getInstance();
    cStart.set(2014, 04, 01);

    Calendar cEnd = Calendar.getInstance();
    cEnd.set(2014, 05, 2);

    while(cStart.compareTo(cEnd) < 1){
        datelist.add(cStart);
        cStart.add(Calendar.DAY_OF_MONTH, 1);
    }

    msg = String.valueOf(datelist.size());

java.time

java.time類取代了與最早的Java版本捆綁在一起的麻煩的舊日期時間類。

LocalDate

LocalDate類表示沒有日期和時區的僅日期值。

定義開始和結束日期。 然后循環以填充所有可能日期的列表。

LocalDate start = LocalDate( 2016 , 1 , 2 );
LocalDate stop = start.plusWeeks( 1 );

List<LocalDate> allDates = new ArrayList<>();
LocalDate ld = start ;
while( ld.isBefore( stop ) ) {
    allDates.add( ld );
    // Set up next loop.
    ld = ld.plusDays( 1 );
}

DayOfWeek

DayOfWeek枚舉定義對象以表示一周中的七個天,星期一至星期日。

Java中的EnumSetSet一種非常快速且內存不足的實現,用於表示枚舉對象的集合。 當用戶啟用/禁用星期幾復選框時,請重新定義DayOfWeek值的EnumSet集合。

for( DayOfWeek dow in DayOfWeek.values() ) {
    if ( … ) {  // if your checkbox is checked for this day-of-week
        dows.add( dow );
    }
}

接下來,定義一個日期集合,我們允許用戶從中選擇日期。 該集合支持用戶界面小部件。

List<LocalDate> dates = new ArrayList<>();

現在循環所有可能的日期,並對照用戶選擇的日期測試每個星期的日期。

for( LocalDate localDate in allDates ) {
    if( dows.contains( localDate.getDayOfWeek() ) ) {
        dates.add( localDate );
    }
}

字符串

要填充用戶界面窗口小部件,您可能需要字符串來表示每個LocalDate對象的值。 您可以使用定義的顯式格式化模式創建此類字符串。 但是我建議讓DateTimeFormatter類自動本地化。

Locale l = Locale.CANADA_FRENCH; // Defines how to create the string: translation, abbreviation, punctuation, order-of-parts, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( l );

循環您要顯示的日期,為每個人的顯示生成一個字符串。

String output = localDate.format( f );

優化

我希望有一些巧妙的方法可以優化上面顯示的代碼。 例如:

  • 不必重建EnumSet並查看每個復選框,您可以為用戶選中/未選中的單個復選框添加或刪除單個DayOfWeek對象。
  • 與其在每個用戶交互上都重新allDates days列表,您可能不打算使用List實現,該實現充當 allDates列表的遮罩 ,並具有包含/排除某些元素的功能。

但是,請在過早優化之前測試實際性能。 我懷疑執行時間上的任何節省都是微不足道的。

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,例如java.util.Date.Calendarjava.text.SimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的AndroidThreeTenABP (見如何使用...... )。

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可能會在這里找到一些有用的類,例如IntervalYearWeekYearQuarter等。

喬達時間

更新:現在處於維護模式的Joda-Time項目建議遷移到java.time類。

使用Joda-Time庫及其LocalDate (無時間)類編寫循環。

為了讓您入門...

LocalDate start = new LocalDate( year, month, day );
LocalDate next = start.plusDays( 1 );
int dayOfWeek = next.getDayOfWeek();
if ( dayOfWeek == DateTimeConstants.MONDAY ) { // Add to list };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM