如何获取Android中两个日期(开始和结束)之间的特定日期列表?

时间:2014-05-31 06:02:09

标签: java android date calendar

我需要在我的应用中显示开始日期和结束日期之间的日期列表。我有一个复选框列表,其中包含一周中的日期,即;星期一到星期日和两个日期选择器,帮助用户选择开始和结束日期。如果用户没有选中任何包含一周中几天的复选框,我需要显示所有日期以及开始日期和结束日期之间的一周中的日期。如果用户选择一些复选框,即;星期一,星期三,星期五我需要只显示开始日期和结束日期之间的那些日期和星期几。如果有任何方法可以实现,请告诉我吗? 谢谢。

2 个答案:

答案 0 :(得分:1)

这可以为您提供两个日期之间的日期列表

    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());

答案 1 :(得分:0)

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的极快且低内存的实现,用于表示枚举对象的集合。当用户启用/停用星期几复选框时,请重新定义EnumSetDayOfWeek值集合。

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并查看每个复选框。
  • 您可能可能会在days列表上搜索a List implementation that acts as a mask并使用包含/排除某些元素的功能,而不是重建allDates列表。

但是在过早优化之前测试现实世界的性能。我怀疑执行时间的任何节省都是微不足道的。

关于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的试验场。您可以在此处找到一些有用的课程,例如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 };