【问题标题】:Return a list of dates given an interval of dates and days of the week as booleans以布尔值形式返回给定日期间隔和星期几的日期列表
【发布时间】:2018-05-01 05:12:56
【问题描述】:

我正在尝试从这些参数返回日期列表:

LocalDate startDate
LocalDate endDate
Boolean monday ... sunday : booleans

例如:

startDate = 01/03/2016
endDate = 10/03/2016 (included)
Monday = true;
Tuesday = false;
Wednesday = false;
Thursday = true;
Friday = true;
Saturday = false;
Sunday = false;

List of dates returned : [03/03/2016, 04/03/2016, 07/03/2016, 10/03/2016]

有没有我可以使用的库?我只设法返回了两个日期之间的日期,但我也不知道如何使用这些日期:(我使用的是 java 6)

public List<LocalDate> datesBetween(LocalDate start, LocalDate end) {
    List<LocalDate> ret = new ArrayList<LocalDate>();
    for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
        ret.add(date);
    }
    return ret;
}

【问题讨论】:

  • Joda 时间非常有用。也许你应该尝试一下。它有很多有用的方法。 Joda link
  • @JernejK java.time 项目现在处于维护模式,其创建者建议迁移到 java.time 类。详情见底部my Answer
  • @BasilBourque 当时他专门询问 Java 6。我曾多次看到 Joda 时间在较旧的 Java 版本上是多么有用。他们停止开发的唯一原因是 Java 8 中设置的新功能 - “请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。 "
  • @JernejK 我的评论是给读者的注释,而不是批评。对于 Java 6 和 7,java.time 的大部分功能都在 ThreeTen-Backport 项目中进行了反向移植,并在 ThreeTenABP 项目。

标签: java date datetime


【解决方案1】:

Java SE 8 Date and Time

清单 1

使用标准 Java getter 约定从 Java SE 8 类中获取值,如清单 2 所示。

LocalDate theDate = timePoint.toLocalDate();
Month month = timePoint.getMonth();
int day = timePoint.getDayOfMonth();
timePoint.getSecond();

【讨论】:

  • 谢谢,但我不能使用 LocalDateTime,因为我在 java 6 上。我会更新我的线程。
【解决方案2】:

问题在于您的方法的签名。日子是作为名字传递的这一事实使得做任何通用的事情变得非常困难。这意味着您将需要大量代码来解决问题。您可能需要考虑传入一个大小为 7 的数组,或与“真”相对应的日期名称列表(省略其他)。

如果您要传入一组从 0 到 6 的整数,如果一周中的某一天在该集合内,则编码该天是活动的,您可以遍历您的时间范围并检查这一天是否传递为活跃与否。您可以使用date.getDayOfWeek()set.contains() 之类的方法。

【讨论】:

    【解决方案3】:

    避免使用旧的日期时间类

    避免使用与早期 Java 版本捆绑的旧日期时间类,例如 java.util.Date/.Calendar。它们设计不佳、令人困惑且麻烦。

    java.time

    Java 8 和更高版本中内置的 java.time 框架取代了旧的日期时间类。见Tutorial

    要与 Java 6 和 7 一起使用,请查看 ThreeTen-Backport 项目(“ThreeTen”指的是定义 java.time 的 JSR 310)。对于 Android,请参阅围绕 Backport 的 Android 包装器,ThreeTenABP

    新的类包括 LocalDate 用于没有时间和时区的仅日期值。你需要的另一个方便的类是enumDayOfWeek使用这些对象而不是字符串让您的代码类型安全、自文档化和本地化就绪。

    提醒:Java 为枚举提供了特殊的高性能 SetMap 实现,EnumSetEnumMap

    EnumSet<DayOfWeek> dayOfWeekSet = EnumSet.of( DayOfWeek.TUESDAY , DayOfWeek.THURSDAY );
    

    定义一个日期间隔。

    LocalDate start = LocalDate.of( 2016 , Month.MARCH , 1 );
    LocalDate stop = start.plusDays( 10 );
    

    定义一个集合以保持我们的目标日期。

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

    循环该时间间隔内的天数。在日期时间工作中,我们通常使用半开方法,其中以 inclusive 开头,而以 exclusive 结尾。

    LocalDate localDate = start;
    while ( localDate.isBefore( stop ) ) {
        if ( dayOfWeekSet.contains ( localDate.getDayOfWeek() ) ) {
            localDates.add( localDate );
        }
        // Prepare for next loop.
        localDate = localDate.plusDays( 1 );
    }
    

    转储到控制台。

    System.out.println( "From: " + start + " to: " + stop + " the dates for days-of-week: " + dayOfWeekSet + " = " + localDates );
    

    从:2016 年 3 月 1 日到 2016 年 3 月 11 日星期几的日期:[星期二、星期四] = [2016 年 3 月 1 日、2016 年 3 月 3 日、2016 年 3 月 8 日, 2016-03-10]


    关于java.time

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

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

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

    您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

    • 这是一个很好的解决方案,但由于我必须使用 LocalDate 和 java 6,所以我有点卡住了。是否仍然可以将您的解决方案与旧的 java.util.Date 一起使用?
    • @user3557384 我很困惑……Java 6 中没有 LocalDate
    • Jodatime 的 LocalDate
    • @redAce 查看我的编辑,底部的“关于 java.time”部分。在 ThreeTen-Backport 项目中,许多 java.time 功能被反向移植到 Java 6 和 Java 7。在 ThreeTenABP 项目中进一步适用于早期版本的 Android。不要不要使用java.util.Date,这是一个非常麻烦的类,已被java.time.Instant 取代。至于 Joda-Time,该项目现在处于维护模式。 java.time 类是它的官方替代品,这两项工作都由同一个人 Stephen Colebourne 领导。
    猜你喜欢
    • 2021-06-29
    • 2017-03-23
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多