如何在java中检测日期是在本周还是下周?

时间:2010-12-26 21:58:49

标签: java date

如果我有一个事件的日期,例如2011-01-03,如何检测它是在这个或下周的java中?任何示例代码?

编辑:

我认为这是一个简单的问题,结果比我想象的要复杂得多,本周我吃的是:从过去的太阳到本周六,下周是从下一个太阳到周六之后。

9 个答案:

答案 0 :(得分:7)

这在一定程度上取决于你对“本周”和“下周”的意思......但是Joda Time很容易确定它是在“今天还是未来7天”,因为它是:

LocalDate event = getDateFromSomewhere();
LocalDate today = new LocalDate();
LocalDate weekToday = today.plusWeeks(1);
LocalDate fortnightToday = weekToday.plusWeeks(1);

if (today.compareTo(event) <= 0 && event.compareTo(weekToday) < 0)
{
    // It's within the next 7 days
}
else if (weekToday.compareTo(event) <= 0 && event.compareTo(fornightToday) < 0)
{
    // It's next week
}

编辑:要获得星期日到星期六的周,你可能想要:

LocalDate startOfWeek = new LocalDate().withDayOfWeek(DateTimeConstants.SUNDAY);

然后执行与上面相同的代码,但相对于startOfWeek

答案 1 :(得分:2)

这个怎么样:

Calendar c=Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
c.set(Calendar.HOUR_OF_DAY,0);
c.set(Calendar.MINUTE,0);
c.set(Calendar.SECOND,0);
DateFormat df=new SimpleDateFormat("EEE yyyy/MM/dd HH:mm:ss");
System.out.println(df.format(c.getTime()));      // This past Sunday [ May include today ]
c.add(Calendar.DATE,7);
System.out.println(df.format(c.getTime()));      // Next Sunday
c.add(Calendar.DATE,7);
System.out.println(df.format(c.getTime()));      // Sunday after next

结果:

Sun 2010/12/26 00:00:00
Sun 2011/01/02 00:00:00
Sun 2011/01/09 00:00:00

前两天之间的任何一天都是本周,最后两周之间的任何一天都是下周。

答案 2 :(得分:2)

尽管有一个老问题-仍然有意义。这里最受支持的答案是对Joda-time的正确写法,对JDK8的正确写法,以及一些语法更改。这可能会帮助那些在JDK8世界中环顾四周的人。

 public static boolean isLocalDateInTheSameWeek(LocalDate date1, LocalDate date2) {
    LocalDate sundayBeforeDate1 = date1.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
    LocalDate saturdayAfterDate1 = date1.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY));
    return  ((date2.isEqual(sundayBeforeDate1) || date2.isAfter(sundayBeforeDate1)) 
            && (date2.isEqual(saturdayAfterDate1) || date2.isBefore(saturdayAfterDate1)));
}

答案 3 :(得分:1)

提示:使用日历。为您的示例事件日期创建它的新实例。然后,将WEEK_OF_YEAR与当前日期和事件日期进行比较。

答案 4 :(得分:1)

对于那些必须坚持JDK 7并且不能使用joda.time的人,我编写了这个方法并进行了测试。

public static boolean inSameWeek(Date date1, Date date2) {
    if (null == date1 || null == date2) {
        return false;
    }

    Calendar earlier = Calendar.getInstance();
    Calendar later = Calendar.getInstance();

    if (date1.before(date2)) {
        earlier.setTime(date1);
        later.setTime(date2);
    } else {
        earlier.setTime(date2);
        later.setTime(date1);
    }
    if (inSameYear(date1, date2)) {
        int week1 = earlier.get(Calendar.WEEK_OF_YEAR);
        int week2 = later.get(Calendar.WEEK_OF_YEAR);
        if (week1 == week2) {
            return true;
        }
    } else {
        int dayOfWeek = earlier.get(Calendar.DAY_OF_WEEK); 
        earlier.add(Calendar.DATE, 7 - dayOfWeek);
        if (inSameYear(earlier.getTime(), later.getTime())) {
            int week1 = earlier.get(Calendar.WEEK_OF_YEAR);
            int week2 = later.get(Calendar.WEEK_OF_YEAR);
            if (week1 == week2) {
                return true;
            }
        }
    }
    return false;
}

public static boolean inSameYear(Date date1, Date date2) {
    if (null == date1 || null == date2) {
        return false;
    }
    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(date1);
    int year1 = cal1.get(Calendar.YEAR);
    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(date2);
    int year2 = cal2.get(Calendar.YEAR);
    if (year1 == year2)
        return true;

    return false;
}

答案 5 :(得分:1)

这里的大多数答案都不令我满意。他们要么使用过时的Calendar-API(可在Java 8之前的时代给出的旧答案中辩解,因此批评这样的答案是不公平的),或者它们甚至是部分错误或不必要的复杂。例如,乔恩·斯凯特(Jon Skeet)最受争议的答案建议由Joda表达式new LocalDate().withDayOfWeek(DateTimeConstants.SUNDAY)确定一周的第一天。但是这样的代码使用从星期一开始的一周的ISO定义,结果是,如果当前日期不在星期日,则该代码将生成下一个星期日,而不是OP所希望的前一个星期日。 Joda-Time无法处理非ISO周。

其他答案的另一个次要缺陷是不必关心当前AND NEXT周是否包含给定日期(如OP所要求的那样)。因此,我在现代Java中提出了改进的建议:

LocalDate today = LocalDate.now(); // involves the system time zone and clock of system
LocalDate startOfCurrentWeek =
  today.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
LocalDate endOfNextWeek =
  startOfCurrentWeek.plusDays(13);

LocalDate event = LocalDate.of(2011, 1, 3); // input of example given by OP

boolean matchingResult =
  !(event.isBefore(startOfCurrentWeek) || event.isAfter(endOfNextWeek));

旁注:这个问题启发了我在图书馆small enhancement的班级DateInterval中添加Time4J到如何以一种非常通用的方式确定当前日历周。 >

答案 6 :(得分:1)

这是在Java 8中对我有用的

import java.time.LocalDate;

LocalDate today = LocalDate.now();
LocalDate twoWeeksBefore = today.minusWeeks(2);
LocalDate checkDate = someObject.getSomeDate();

if(checkDate.compareTo(twoWeeksBefore) > 0) {
    // do something if checkDate is within last two weeks
} else {
    // do something if checkDate is on or before last two weeks
}

答案 7 :(得分:0)

您可以使用Calendar API检索指定日期的一周。

Calendar cal = Calendar.getInstance();
cal.setTime(somedate);
int week = cal.get(Calendar.WEEK_OF_YEAR);

答案 8 :(得分:0)

tl; dr

使用LocalDate类和名为org.threeten.extra.LocalDateRange的{​​{1}}类来确定一对TemporalAdjuster对象,这些对象确定一周中的第一天。

ta

ThreeTen-Extra

ThreeTen-Extra项目为Java内置的 java.time 类(由JSR 310定义)添加了附加功能。

在添加的类中有LocalDateRange。此类表示时间轴上的时间跨度。换句话说,一对 LocalDateRange.of( localDate1.with( ta ) , localDate1.with( ta ).plusWeeks( 1 ) ) .contains( localDate2 ) 对象。此类提供了方便的比较方法,例如LocalDateoverlapscontains。这里我们需要equals

定义一个方法,在其中传递两个日期以及一周中的第一天(一个DayOfWeek枚举对象)。

我们使用TemporalAdjusters类中的abuts来确定一周中第一天的日期。然后添加一个星期以得出星期的结束时间(按照时间跨度的半开放定义)。

我们可能很可爱,请检查两个日期是否相同。是否值得在您的应用中经常检查这种情况是否值得。

在第2周,让我们使用单行代码作为替代语法。

TemporalAdjuster

或更紧凑。

public boolean inSameWeek ( LocalDate localDate1 , LocalDate localDate2 , DayOfWeek firstDayOfWeek ) {
    Objects.requireNonNull( localDate1 ) ;  // … ditto for other arguments.

    if( localDate1.isEqual( localDate2 ) ) { return true ; }

    TemporalAdjuster ta = TemporalAdjusters.previousOrSame( firstDayOfWeek ) ;

    LocalDate weekStart1 = localDate1.with( ta ) ;
    LocalDate weekStop1 = weekStart1.plusWeeks( 1 ) ;
    LocalDateRange week1 = LocalDateRange.of( weekStart1 , weekStop1 ) ;

    LocalDateRange week2 = 
        LocalDateRange.of(
            localDate2.with( ta ) ,
            localDate2.with( ta ).plusWeeks( 1 ) 
        )
    ;

    // Compare the weeks.
    return week1.equals( week2 ) ;
}

我们真的不需要第二个星期。我们只关心第一个确定的星期contains是第二个传递日期参数。

public boolean inSameWeek ( LocalDate localDate1 , LocalDate localDate2 , DayOfWeek firstDayOfWeek ) {
    Objects.requireNonNull( localDate1 ) ;  // … ditto for other arguments.

    if( localDate1.isEqual( localDate2 ) ) { return true ; }

    TemporalAdjuster ta = TemporalAdjusters.previousOrSame( firstDayOfWeek ) ;
    return 
        LocalDateRange.of( 
            localDate1.with( ta ) , 
            localDate1.with( ta ).plusWeeks( 1 ) 
        )
        .equals( 
            LocalDateRange.of( 
                localDate2.with( ta ) , 
                localDate2.with( ta ).plusWeeks( 1 ) 
            )
        )
    ;
}

使用它。

public boolean inSameWeek ( LocalDate localDate1 , LocalDate localDate2 , DayOfWeek firstDayOfWeek ) {
    Objects.requireNonNull( localDate1 ) ;  // … ditto for other arguments.

    if( localDate1.isEqual( localDate2 ) ) { return true ; }

    TemporalAdjuster ta = TemporalAdjusters.previousOrSame( firstDayOfWeek ) ;
    return 
        LocalDateRange.of( 
            localDate1.with( ta ) , 
            localDate1.with( ta ).plusWeeks( 1 ) 
        )
        .contains( 
            localDate2
        )
    ;
}

注意:我没有运行这段代码。