![](/img/trans.png)
[英]How to get Date List Between two dates on Android using with Java
[英]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版本捆綁在一起的麻煩的舊日期時間類。
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中的EnumSet
是Set
一種非常快速且內存不足的實現,用於表示枚舉對象的集合。 當用戶啟用/禁用星期幾復選框時,請重新定義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 8及更高版本中。 這些類取代了麻煩的舊日期時間類,例如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植 ,並進一步適應的Android在ThreeTenABP (見如何使用...... )。
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可能會在這里找到一些有用的類,例如Interval
, YearWeek
, YearQuarter
等。
更新:現在處於維護模式的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.