如何检查给定间隔的哪个星期和月份日由?

时间:2012-04-11 12:57:03

标签: java calendar jodatime

假设我有两个LocalDate对象,fromDate和toDate。 我需要知道间隔内的哪个星期几天 - 周一,周二等。 并且,我想知道哪些天还有 - 第一天,第二天,或者,例如,仅限20日 - 从20日到23日。 Joda时间库中是否有任何有用的工具/方法可以帮助我?我不是在询问特定的算法,我可以自己编写,但我不确定Joda的功能 - 也许它已经有了我可以重用的东西。

3 个答案:

答案 0 :(得分:1)

这就像我想的那样接近:

Days between

或者类似的事情(假设只有两个不同的月份):

public Boolean dayOfMonthExistInPeriod(final int dayOfMonth, final LocalDate from, final LocalDate until){
        final DateMidnight tested = new DateMidnight(from.getYear(), from.getMonthOfYear(), dayOfMonth);
        final DateMidnight tested2 = new DateMidnight(until.getYear(), until.getMonthOfYear(), dayOfMonth);
        final Interval interval = new Interval(from.toDateMidnight(), until.toDateMidnight());
        return interval.contains(tested) && interval.contains(tested2);
    }

答案 1 :(得分:1)

public static boolean isDayBetween(int dtc, DateTime from, DateTime to)
   {
      final int dayOfWeekFrom = from.dayOfWeek().get();
      final int daysBetween = Days.daysBetween(from, to).getDays();
      if (dtc >= dayOfWeekFrom && dtc <= (dayOfWeekFrom + daysBetween))
         return true;
      return false;
   }  

使用方法

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd");
final DateTime from = dtf.parseDateTime("2000-07-08");
final DateTime to = dtf.parseDateTime("2000-07-13");
boolean res = isDayBetween(from, to, DateTimeConstants.THURSDAY)

答案 2 :(得分:0)

TL;博士

java.time.LocalDate.of( 2018 , Month.JANUARY , 23 )
    .plusDays( 1 )
    .getDayOfWeek()  // Returns a `DayOfWeek` enum object such as `DayOfWeek.MONDAY`.

...和...

java.time.LocalDate.of( 2018 , Month.JANUARY , 23 )
    .plusDays( 1 )
    .getDayOfMonth()  // Returns an integer number, 1-31.

java.time

现代方法使用 java.time 类,这些类取代了最早的Java和 Joda-Time 项目中的遗留日期时间类。 Joda-Time java.time / JSR 310都是由同一个人Stephen Colebourne领导的,所以这些概念是紧密结合的。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate start = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalDate stop = LocalDate.of( 2018 , Month.FEBRUARY , 4 ) ;

使用ChronoUnit枚举计算已经过的天数很容易。

long days = ChronoUnit.DAYS.between( start , stop ) ;

使用半开放方法进行计算,其中开头是包含,而结尾是独占。这种方法通常是定义时间跨度的明智方法。

  

我需要知道区间内的星期几 - 星期一,星期二等等。

有一个类:DayOfWeekenum定义七个对象,一个星期的每一天。 EnumSet类是Set的高度优化实现,用于收集DayOfWeek个对象。 Set吸收/忽略重复项,因此我们最终会得到一个不同的集合。

final int countDaysInWeek = DayOfWeek.values().length ;  // Seven days in a week.
Set< DayOfWeek > dows = EnumSet.noneOf( DayOfWeek.class ) ;
LocalDate ld = start ;
while ( ld.isBefore( stop ) ) {
    dows.add( ld.getDayOfWeek() ) ;  // Add each date’s day-of-week to our collection.
    if ( dows.size() == countDaysInWeek ) { break ; }  // Bail out of this loop after collecting all the days of the week.
    ld = ld.plusDays( 1 ) ;  // Increment to the next day, to setup the next loop. The java.time classes use immutable objects, so we are generating a fresh object here rather than modifying the original.
}
  

而且,我想知道哪些天还是从第二天到第二天,或者,例如第二天,或者从20日到23日。

可以收集日期的数量,但我怀疑这是你想要的。

List< Integer > dayOfMonthNumbers = new ArrayList<>() ;
LocalDate ld = start ;
while ( ld.isBefore( stop ) ) {
    dayOfMonthNumbers.add( ld.getDayOfMonth() ) ;
    ld = ld.plusDays( 1 ) ;  // Increment to next date.
}

如果你进入另一个月,你最终会得到一个列表:29 , 30 , 1 , 2。我怀疑你会发现使用LocalDate个对象的集合而不仅仅是一个月的数字更有用。

List< LocalDate > dates = new ArrayList<>() ;
LocalDate ld = start ;
while ( ld.isBefore( stop ) ) {
    dates.add( ld ) ;
    ld = ld.plusDays( 1 ) ;  // Increment to next date.
}

从那里,您可以使用DateTimeFormatter生成字符串以表示这些日期值。搜索Stack Overflow获取更多信息,因为已经多次介绍过。

ThreeTen-Extra &amp; LocalDateRange

提示:如果您将 ThreeTen-Extra 库添加到项目中,则可以使用LocalDateRange类来表示您的时间范围。

LocalDateRange range = LocalDateRange.of( start , stop ) ;

关于 java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore