【问题标题】:How to get a list of specific dates between two dates(start and end) in Android?如何在Android中获取两个日期(开始和结束)之间的特定日期列表?
【发布时间】:2014-05-31 06:02:09
【问题描述】:

我需要在我的应用中显示开始日期和结束日期之间的日期列表。我有一个复选框列表,旁边有星期几;周一到周日和两个日期选择器,帮助用户选择开始和结束日期。如果用户没有选择任何包含星期几的复选框,我需要显示所有日期以及开始日期和结束日期之间的星期几。如果用户选择了一些复选框,即;星期一、星期三、星期五我只需要显示开始日期和结束日期之间的那些日期和星期几。您能否让我知道是否有任何方法可以实现这一目标? 谢谢。

【问题讨论】:

  • 那是什么问题呢?开始显示日期,一周中的几天

标签: java android date calendar


【解决方案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());

【讨论】:

  • 很棒的家伙.. 我得到了我想要的
【解决方案2】:

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 枚举定义了代表每周 7 天(周一至周日)中的每一天的对象。

Java 中的EnumSetSet 的一个极快且低内存的实现,用于表示枚举对象的集合。当用户启用/禁用星期复选框时,重新定义您的 EnumSet DayOfWeek 值集合。

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

优化

我希望有一些聪明的方法可以优化上面显示的代码。例如:

  • 您可以为用户选中/取消选中的一个复选框添加或删除单个 DayOfWeek 对象,而不是重建 EnumSet 并查看每个复选框。
  • 与其在每次用户交互时重新构建 days 列表,不如在 allDates 列表中搜索 a List implementation that acts as a mask 并使用包含/排除某些元素的功能。

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

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time 项目现在位于 maintenance mode,建议迁移到 java.time。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。

大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的Android(参见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 };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多